TAG:
不可否认,偶是linux的fans(这是真的,偶的家人可以作证,家里的所有电脑和笔记本、iPod、Ps2、Psp、PDA、手机,都被偶装上了linux。。。)。但是生活所迫,在公司的时候都要在M$的系统里面开发应用,感觉很不爽。开发symbian s60的手机应用已经有一段时间了,突发奇想希望试试能否在linux环境下面开发S60手机应用程序。于是乎google了一下,果然,即使这么一个小想法也早有国外的“大拿”们捷足先登了。
基本上,只要认真看过下面的url的朋友应该都能自己搭建起来这个开发平台:
我这里只是简要把自己的搭建过程记录下来,备忘:
(1)准备工作,下载一些sdk包和工具包:
http://www.martin.st/symbian/gnupoc-package-1.11.tar.gz,这个是gnupoc的脚本包
S60-SDK-200634-3.1-Cpp-f.1090b.zip,这是sdk包,到nokia的论坛上下载
gnu-csl-arm-2005Q1C-arm-none-symbianelf-i686-pc-linux-gnu.tar.bz2这是arm的编译器,需要从下面的url下载:
http://www.codesourcery.com/gnu_toolchains/arm/releases/2005Q1C
(2)开始安装arm编译器
mkdir ~/works/csl-gcc
cd ~/works/csl-gcc
tar -jxvf ~/down/gnu-csl-arm-2005Q1C-arm-none-symbianelf-i686-pc-linux-gnu.tar.bz2
这一步是把arm编译器解压到csl-gcc这个目录下面,偶这里是直接用binary了。不嫌麻烦的朋友,可以用源代码自己编译工具链。
(3)安装gnupoc和for symbian的arm-gcc工具链
然后是要把gnupoc-package-1.11.tar.gz解压缩了
cd ~/works
tar jxvf ~/down/gnupoc-package-1.11.tar.gz .
cd gnupoc-package-1.11/tools/
./install_eka2_tools ~/csl-gcc
(4)安装s60的sdk
cd ~/works/gnupoc-package-1.11/sdks
./install_gnupoc_s60_31 ~/down/60-SDK-200634-3.1-Cpp-f.1090b.zip ~/works/epoc_sdk/s60_31
(5)指定s60的一些命令行工具的包装
./install_wrapper ~/works/gnupoc
(6)设置环境变量(可以在/etc/profile里面加,也可以在.bashrc里面加)
export PATH=~/works/gnupoc:~/csl-gcc/bin:$PATH
export EPOCROOT=~/epoc_sdk/s60_31/
(注意,这里的EPOCROOT末尾的反斜杠‘/’是一定要加上去的,这是偶的血泪教训!!)
(7)好了,可以做实验了,编译一个hello world试试:
cd ~/works/epoc_sdk/s60_31/s60ex/helloworldbasic/group
bldmake bldfiles
abld build gcce urel
cd ../sis
makesis helloworldbasic_gcce.pkg
(8)手工生成一个自签名证书(有开发者证书的朋友可以跳过这一步)
makekeys -cert -expdays 3650 -password mykey.key mycert.cer
(9)对sis进行签名
signsis helloworldbasic_gcce.sis helloworldbasic_gcce.sisx mycert.cer mykey.key
(10)真机上测试一下
好了,如果可以看到sisx文件,就代表你已经生成了手机上可以用的安装包了。linux下面蓝牙设备一般用obex协议栈操作。
(11)插入usb蓝牙适配器,初始化系统,(以下操作需要在root权限下面操作)
# su -
# modprobe hci_usb
# modprobe rfcomm
# hciconfig hci0 up
这个时候,应该看到如下的输出:
BD Address: xx:xx:xx:xx:68:9F ACL MTU: 192:8 SCO MTU: 64:8
UP RUNNING PSCAN ISCAN
RX bytes:1860 acl:10 sco:0 events:88 errors:0
TX bytes:1432 acl:10 sco:0 commands:52 errors:0
Features: 0xff 0xff 0x0f 0x00
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: HOLD SNIFF PARK
Link mode: SLAVE ACCEPT
Name: 'xxxxxxxxx'
Class: 0x000100
Service Classes: Unspecified
Device Class: Computer, Uncategorized
HCI Ver: 1.1 (0x1) HCI Rev: 0x20d LMP Ver: 1.1 (0x1) LMP Subver: 0x20d
Manufacturer: Cambridge Silicon Radio (10)
(12)打开手机的蓝牙通信,开始扫描蓝牙设备,得到蓝牙设备的Mac地址
# hcitool scan
结果将输出如下的内容:
Scanning...
00:80:37:B5:A8:3A T68i
00:0E:07:1C:AE:1D Nokia N81
(13)可以ping一下这个设备,看看是否可用:
# l2ping -c 6 00:0E:07:1C:AE:1D
100 bytes from 00:0E:07:1C:AE:1D id 200 time 39.62ms
100 bytes from 00:0E:07:1C:AE:1D id 201 time 35.25ms
6 sent, 6 received, 0% loss
这就代表蓝牙通了,可以把安装包发给手机了。
(14)可以用sdptool查看一下,是否支持相应的服务(这个不多解释了,一试便知)
# sdptool browse local
# sdptool browse 00:0E:07:1C:AE:1D
# sdptool search OPUSH (这个命令用来查找object push服务的频道号) (15)用obex_test客户端,直接发送(可以用普通用户操作了)
$ cd ~/works/epoc_sdk/s60_31/s60ex/helloworldbasic/sis
$ obex_test -b 00:0E:07:1C:AE:1D 9 (这里的9代表的是通道号,蓝牙push的通道号是9)
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> c [回车,连接手机的蓝牙push服务]
Connect OK!
Version: 0x10. Flags: 0x00
> p helloworldbasic_gcce.sisx [回车,开始发送蓝牙push]
PUT file (local, remote)> name=helloworldbasic_gcce.sisx, size=xxxxx
Going to send xxxxx bytes
Made some progress...
Made some progress...
Made some progress...
Made some progress...
Made some progress...
PUT successful!
> q [回车,退出]
用这个方法稍微麻烦一些,可以直接使用下面的脚本,要简单得多:
使用格式是:
sh obexsend.sh <Mac> <Channel> <filename>
注意,这里的通道号还是9,具体的设备都支持哪些服务,可以用sdptool的browse来查看。
(16)真机测试
如果不出意外的话,应该在s60 3rd的机器上可以直接安装。
总结一下,用上述方法可以为s60下至2nd上至5nd的所有sdk进行开发(这里需要提一点的是,在sdk的安装脚本中,已经把几乎全部文件名都变成了小写,可能win32的开发者们有一些郁闷了),也支持UIQ2和UIQ3的开发,具体方法与上面的类似。由于没有模拟器,无法进行pc上的调试(也没有所谓的abld build winscw udeb,这一点很郁闷了,可以以后考虑采用gdbserver和gdb利用蓝牙或数据线,在真机上直接调试)。
hoho,毕竟,gnupoc为许多“骨灰级”的玩家和开发者提供了一个很不错的开发symbian s60的方法。
(陈罡)(17)关于hci和rfcomm以及dbus的配置问题(/etc/bluetooth目录) wayne@wayne:/etc/bluetooth$ cat hcid.conf # # HCI daemon configuration file. # # HCId options options { # Automatically initialize new devices autoinit yes; # Security Manager mode # none - Security manager disabled # auto - Use local PIN for incoming connections # user - Always ask user for a PIN # security user; # Pairing mode # none - Pairing disabled # multi - Allow pairing with already paired devices # once - Pair once and deny successive attempts pairing multi; # Default PIN code for incoming connections passkey "0000"; } # Default settings for HCI devices device { # Local device name # %d - device id # %h - host name name "%h-%d"; # Local device class class 0x000100; # Default packet type #pkt_type DH1,DM1,HV1; # Inquiry and Page scan iscan enable; pscan enable; # Default link mode # none - no specific policy # accept - always accept incoming connections # master - become master on incoming connections, # deny role switch on outgoing connections lm accept; # Default link policy # none - no specific policy # rswitch - allow role switch # hold - allow hold mode # sniff - allow sniff mode # park - allow park mode lp rswitch,hold,sniff,park; auth enable; encrypt enable; } wayne@wayne:/etc/bluetooth$ cat rfcomm.conf # # RFCOMM configuration file. # rfcomm0 { # # Automatically bind the device at startup bind no; # # # Bluetooth address of the device device 11:11:11:11:11:11; # # # RFCOMM channel for the connection channel 1; # # # Description of the connection comment "Bluetooth device"; } wayne@wayne:/etc/dbus-1/system.d$ cat bluetooth.conf <!-- This configuration file specifies the required security policies for Bluetooth core daemon to work. --> <!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd"> <busconfig> <!-- ../system.conf have denied everything, so we just punch some holes --> <policy user="root"> <allow own="org.bluez"/> <allow send_destination="org.bluez"/> <allow send_interface="org.bluez.Agent"/> <allow send_interface="org.bluez.PasskeyAgent"/> (这里需要添加这个配置) <allow send_interface="org.bluez.HandsfreeAgent"/> </policy> <policy at_console="true"> <allow send_destination="org.bluez"/> </policy> <!-- allow users of lp group (printing subsystem) to communicate with bluetoothd --> <policy group="lp"> <allow send_destination="org.bluez"/> </policy> <policy context="default"> <deny send_destination="org.bluez"/> </policy> </busconfig> 另外,在/etc/bluetooth/passkeys里面,有一个default的文件,用来表示默认的密码的: 可以使用: echo -n "0000" > /etc/bluetooth/passkeys/default 来设置默认的访问密码。 |