全部博文(240)
分类:
2011-12-17 15:17:04
原文地址:linux与蓝牙 作者:kangjunping
蓝芽最早由瑞典Ericsson提出,其名称是古代瑞典的一位国王,因为总吃某种诡异果品 (似乎是草莓的一个品种,不太了解植物学,错了的话不要拍我),把牙齿弄得蓝乎乎的,被称作蓝牙(bluetooth)。古代瑞典可不像现在的一样,那时 的瑞典统治整个北欧,可气派了,同样有野心的爱立信于是使用BT这个名字来命名这个被他们寄予厚望的短距离互联技术。
Bluetooth用于连接个人周边的外围设备,比如无线耳机、打印机、扫描仪、手机、计算机等等,在这些设备之间交换文件和数据,替代低速串行线的工作,常用用途包括
因 为Bluetooth的功能十分实用、一经提出,立刻有一种一呼百应的感觉,随着成本的下降,蓝芽的用途也越来越广(当然了,这个过程也不是一帆风顺的 了),大量的中低端手机也开始装备上了这项技术,以其更丰富、完善的协议栈,略高的传输速率,以及相对于红外线来说摆脱了必须毫无障碍的束缚,几乎完全取 代了原来商务手机上普遍装备的红外接口。
蓝芽来到中国,把“牙”替换成了更有东方美感的“芽”字。
蓝芽实际上并不是一种简单的协议,相反,十分复杂
蓝芽最有意思的模过于第2层互联和应用层的Profile了,至于底层的跳频什么的倒是新意不大。另外就是,虽然蓝芽使用的频率和微波炉烹饪的频率毫无二致,但发射功率还是很小的,基本不足以把我们这么大块的肉弄熟。
Linux下的蓝芽协议栈Linux 下有若干个蓝芽协议栈,目前生存状况比较健康的是bluez和affix,后者大概是Nokia支持的吧,前者则是目前蓝芽的Linux官方版本,集成在 Linux内核之中,也就是说,如果你有一个比较新的2.6内核,那么,你多半已经支持蓝芽了,而如果还不支持的话,重新编译一下也就好了。
不 要觉得Linux的协议栈比不上Windows里面的,事实是,这里风景独好,bluez协议栈支持的硬件设备远远多于windows系统支持的。如果你 和我一样只用Linux,那么,买了蓝芽适配器之后,大概就可以把臃肿的驱动光盘丢进垃圾桶,然后心情愉快的使用蓝芽了,跟我来吧,
内核的协议栈支持主要包含这么几个部分:
截止到这里就是内核提供的几乎所有蓝芽协议栈了,不过,仅有这些,蓝芽还不足以为我所用,只有有了用户态的协议栈和工具相配合,才有幸福的蓝芽生活 :)
用户空间中的蓝芽协议栈与相关工具接着刚才的协议栈,这次势在用户空间实现的了:
嗯,协议栈已经有了,那我们怎么使用蓝芽呢? 回忆一下怎么把大象放到冰箱里吧:
就是这么简单,一个蓝芽服务也是这么容易:
蓝芽的特点就是如上所属的那些了,而用户态的工具所要完成的任务就是:
首 先,我们需要启动 hcid,让 HCI 层的通信可以进行,对于 Debian 用户来说,你需要安装 bluez-utils 包,并启动 hcid。如果你运行了 bluetooth 服务,并在 /etc/default/bluetooth 之中设置启动了 HCID 的话
HIDD_ENABLED=1
插入 USB 适配器后,你的 hcid 就已经在运行了,看看相关信息吧:
inspiration:/etc/bluetooth# hciconfig -a
hci0: Type: USB
BD Address: 11:11:11:11:11:11 ACL MTU: 678:8 SCO MTU: 48:10
UP RUNNING PSCAN ISCAN
RX bytes:413 acl:0 sco:0 events:19 errors:0
TX bytes:323 acl:0 sco:0 commands:19 errors:0
Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00
Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
Link policy: RSWITCH HOLD SNIFF PARK
Link mode: MASTER
Name: 'inspiration-0'
Class: 0x3e0100
Service Classes: Networking, Rendering, Capturing, Object Transfer, Audio
Device Class: Computer, Uncategorized
HCI Ver: 1.2 (0x2) HCI Rev: 0x1fe LMP Ver: 1.2 (0x2) LMP Subver: 0x1fe
Manufacturer: Integrated System Solution Corp. (57)
这个过程是自动的,当然,你也可以用 hciconfig (8) 来手工控制。
HCI 已经启动了,现在就可以用它来寻找蓝芽设备了,当然,一定要先开启蓝芽设备的蓝芽功能,这个不是废话,手机的蓝芽是默认关闭的,只有在手动控制之下才会发 送信号,允许被扫描到,不过设备的个体差异性太大了,这里就没法介绍了,我假设你已经自己摸索或参照说明书打开了设备的蓝芽电源,现在,找找看吧
inspiration:/home/gnawux# hcitool scan
Scanning ...
00:17:00:7B:18:B8 Motorola SLVR
命令一出,略等片刻,蓝芽设备就会被顺利地找到。
查看设备提供的服务利用 SDP 协议,我们还可以查看每个设备都有功能,能提供什么服务,每种基于 RFCOMM 的服务都使用某种协议,占据一个“频道 (channel)”,这是我们使用服务时的一个重要参数
下面是例子,先看看自己:
gnawux@inspiration:~$ sdptool browse local再看看别人 (手机)
gnawux@inspiration:~$ sdptool browse 00:17:00:7B:18:B8手机的比较多,我也没有截短,方便大家看看手机可能提供的丰富蓝芽功能。下一节我们将介绍几个利用蓝芽可以做的事情:
蓝芽应用上一节,通过 sdptool,我们看到笔者的手机提供了拨号、耳机、文件传输等功能,现在我们就来试试看。利用蓝芽传送文件使用的都是前面提到的 Obex 协议,这里介绍几个用法。
与手机互相推送文件这是使用手机或计算机提供的"OBEX Object Push" (0x1105)服务,由另一方向其推送文件。使用的工具是 openobex-apps 包里的 obex_test工具
首先是向手机推送,对于我的手机,推送服务在频道8:
gnawux@inspiration:~$ obex_test -b 00:17:00:7B:18:B8 8
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> c
Connect OK!
Version: 0x10. Flags: 0x00
> p wangxu.jpg me.jpg
PUT file (local, remote)> name=wangxu.jpg, size=34177
Going to send 34177 bytes
Made some progress...
Made some progress...
Made some progress...
Made some progress...
Made some progress...
PUT successful!
> q
可 以看到,执行完 obex_test 之后,进入一个交互状态,首先建立连接,然后传送文件 (本地文件名是 wangxu.jpg,存在手机上叫 me.jpg,这个是我随便取的),最后,退出。这个过程需要看着点手机屏幕,可能要你确认是否连接,文件存放在哪里,当然,这个和手机有关。
现在也可以看看手机向计算机推送,首先应该让手机进入接收状态,如果本地没有启动 Object PUSH 服务,己把它加上:
gnawux@inspiration:~$ sdptool add OPUSH
OBEX Object Push service registered
现在进入接收状态,注意要使用计算机 (local) 的地址和频道号:
gnawux@inspiration:~$ obex_test -b FF:FF:FF:00:00:00 9
Using Bluetooth RFCOMM transport
OBEX Interactive test client/server.
> s
现在,计算机进入了接收模式,在手机侧发送文件到计算机就可以了。
使用"OBEX File Transfer" (0x1106)服务的 obexftp 是一个方便的工具,我们可以查看手机上的内容,并进行上传下载,对于我的手机,对应的频道是 9 (参考上面的 sdptool browse 的结果)。
看看有哪些目录:
gnawux@inspiration:~$ obexftp -b 00:17:00:7B:18:B8 -B 9 -l
Browsing 00:17:00:7B:18:B8 ...
Channel: 9
Connecting...done
Receiving "(null)"...|
done
Disconnecting...done
可以看到,有四个有读写 (RW) 权限的目录,现在,再看看 audio 里面有什么
gnawux@inspiration:~$ obexftp -b 00:17:00:7B:18:B8 -B 9 -l audio
Browsing 00:17:00:7B:18:B8 ...
Channel: 9
Connecting...done
Receiving "audio"...|
done
Disconnecting...done
可以看到,这里有一个 mp3 文件,我们把它取下来
gnawux@inspiration:~$ obexftp -b 00:17:00:7B:18:B8 -B 9 -c audio -g a.mp3
Browsing 00:17:00:7B:18:B8 ...
Channel: 9
Connecting...done
Sending "audio"...done
Receiving "a.mp3"...-done
Disconnecting...done
经过一段漫长的等待,传送终于完成了,有点后悔选择这么大的文件进行传输。现在,再把 wangxu.jpg 放到 picture 目录去
gnawux@inspiration:~$ obexftp -b 00:17:00:7B:18:B8 -B 9 -c picture -p wangxu.jpg
Browsing 00:17:00:7B:18:B8 ...
Channel: 9
Connecting...done
Sending "picture"... done
Sending "wangxu.jpg"...\done
Disconnecting...done
其他 obexftp(1) 的用法,大家自己学习文档吧 :)
还有 obexserver, qobex (qt based) 等工具,使用起来更为简单,就不介绍了。
我们说过,蓝芽的一个几本功能就是模仿串口,串口的重要作用之一 (可能是最重要的了) 就是拨号,传统的 DTE 也就是 Modem 嘛。实际上,通过 rfcomm,蓝芽连接可以反映在 /dev/rfcomm0 这样的字符设备上,像串口一样操作。当然,我们最好先定义 /etc/bluetooth/rfcomm.conf,里面根据手机的设备号和频道号写上
rfcomm0 {
# Automatically bind the device at startup
bind yes;
# Bluetooth address of the device
device 00:17:00:7B:18:B8;
# RFCOMM channel for the connection
channel 1;
# Description of the connection
comment "Motorola SLVR L7";
}
这样,在启动 bluetooth 服务的时候,就已经自动连接上了,而不需要使用rfcomm (1) 命令自己费力气了。现在,可以使用任意一个喜欢的串口程序 (minicom, gtkterm 等等) 来对 /dev/rfcomm0 进行拨号了
输入 AT 命令的第一个命令:
AT
OK
试着播一下号
ATD139012345;
这个是随便写的号码,大家找认识的号码播哦 (故意少写了两位,省得万一试到人家头上,呵呵),当然,也可以连接GPRS,这里,我们借助于最基本的拨号程序pppd 来实现,实际也是通过AT Command来实现的。
根据这个文件的内容,pppd 将利用 gprs_chat 这个文件的内容,在串口 rfcomm1 (也就是到我的L7手机的蓝芽连接) 上进行交互,建立ppp连接,这个chat 文件的内容就是一些 AT Command 的交互:
inspiration:/home/gnawux# cat /etc/ppp/peers/gprs_chat
ABORT 'NO CARRIER'
ABORT 'ERROR'
ABORT 'NO DIALTONE'
ABORT 'BUSY'
ABORT 'NO ANSWER'
'' 'ATZ'
'OK' 'ATE0V1'
'OK' 'AT+CGDCONT=1,"IP","cmwap.cmcc.com","0.0.0.0",0,0'
'OK' 'ATD*99***1#'
上面就是一个GPRS建立需要的几条 AT Command,文件建立之后,需要的操作很简单,只要运行
pppd call gprs
就可以建立连接了,这是 ifconfig 得到的信息
ppp0 Link encap:Point-to-Point Protocol
inet addr:10.14.7.136 P-t-P:192.168.100.101 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:4 errors:1 dropped:0 overruns:0 frame:0
TX packets:13 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3
RX bytes:64 (64.0 b) TX bytes:543 (543.0 b)
这是路由表和DNS设置:
inspiration:/etc/ppp/peers# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.100.101 * 255.255.255.255 UH 0 0 0 ppp0
default * 0.0.0.0 U 0 0 0 ppp0
inspiration:/etc/ppp/peers# cat /etc/resolv.conf
nameserver 221.130.33.52
nameserver 221.130.33.60
呵呵,非常简单吧。
小结至此,Linux与蓝芽手机的全部内容,理论到操作已经全部完成了,基于的操作系统是使用 2.6 内核的 Debian GNU Linux,测试的手机包括 Motorola SLVR L7 和 Nokia N-Gage QD 各一部,蓝芽适配器芯片是 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter,所有测试都非常顺利,也祝读者朋友玩得开心。