全部博文(96)
分类: LINUX
2010-12-16 14:43:33
蓝芽最早由瑞典Ericsson提出,其名称是古代瑞典的一位国王,因为总吃某种诡异果品 (似乎是草莓的一个品种,不太了解植物学,错了的话不要拍我),把牙齿弄得蓝乎乎的,被称作蓝牙(bluetooth)。古代瑞典可不像现在的一样,那时的瑞典统治整个北欧,可气派了,同样有野心的爱立信于是使用BT这个名字来命名这个被他们寄予厚望的短距离互联技术。
Bluetooth用于连接个人周边的外围设备,比如无线耳机、打印机、扫描仪、手机、计算机等等,在这些设备之间交换文件和数据,替代低速串行线的工作,常用用途包括
文件共享、传输
语音传输
远程打印
RS-232串行口线替代
因为Bluetooth的功能十分实用、一经提出,立刻有一种一呼百应的感觉,随着成本的下降,蓝芽的用途也越来越广(当然了,这个过程也不是一帆风顺的了),大量的中低端手机也开始装备上了这项技术,以其更丰富、完善的协议栈,略高的传输速率,以及相对于红外线来说摆脱了必须毫无障碍的束缚,几乎完全取代了原来商务手机上普遍装备的红外接口。
蓝芽来到中国,把“牙”替换成了更有东方美感的“芽”字。
蓝芽实际上并不是一种简单的协议,相反,十分复杂
从网络结构和组网方式讲,蓝芽在10米区域内形成一个网络,其中可以有1个主设备,7个从设备,一共8个激活的设备,当然睡觉的设备还可以有很多,不打呼噜就行了。对于更多的设备,可以使用ad hoc的方式互联,学网络的同学们看到这个来精神了吧,不过我可不打算讲了。
从应用来看,BT支持语音通信和串行线模拟,并且通过Profile来支持各种周边智能设备的应用,比如耳机、打印机……并且定义了一套服务发现和调用机制,还是瞒有意思的。
蓝芽最有意思的模过于第2层互联和应用层的Profile了,至于底层的跳频什么的倒是新意不大。另外就是,虽然蓝芽使用的频率和微波炉烹饪的频率毫无二致,但发射功率还是很小的,基本不足以把我们这么大块的肉弄熟。
Linux下的蓝芽协议栈
Linux下有若干个蓝芽协议栈,目前生存状况比较健康的是bluez和affix,后者大概是Nokia支持的吧,前者则是目前蓝芽的Linux官方版本,集成在Linux内核之中,也就是说,如果你有一个比较新的2.6内核,那么,你多半已经支持蓝芽了,而如果还不支持的话,重新编译一下也就好了。
不要觉得Linux的协议栈比不上Windows里面的,事实是,这里风景独好,bluez协议栈支持的硬件设备远远多于windows系统支持的。如果你和我一样只用Linux,那么,买了蓝芽适配器之后,大概就可以把臃肿的驱动光盘丢进垃圾桶,然后心情愉快的使用蓝芽了,跟我来吧,
内核的协议栈支持主要包含这么几个部分:
HCI. 这个是最底层的了,称为 Host Control Interface. 之所以称为 HCI 是源于蓝芽的应用模型的。蓝芽是连接智能外设的无线接口,接口的一侧是设备,另一侧就是主机 (Host) 了,采用类似记法的还有 USB, IEEE1394,所以,从设计初衷来看,这几个东东都是针对差不多的市场的,当然,各有所长了。一个蓝芽适配器是否能被驱动起来,就看 HCI 的支持性了。最常见的蓝芽适配器就是笔者持有的这类 USB 接口的了,对于大部分标准的蓝芽设备,它的驱动模块是: hci-usb,对于我们的 2.6 内核,插入这个适配器,该模块就被自动加载了。
在 HCI 之上是 L2CAP,Logical Link Control and Adaptation Protocal 这一层的功能承上启下,向上层提供异步数据传输的链路控制功能,所谓异步,就是不存在一个主时钟来同步所有传输的一种传输方式,通常用于数据的传输;与之相反,同步传输是完全与时钟同步的,通常用在诸如语音或是多媒体通话之中,在蓝芽中,语音同步传输也是被支持的,bluez 协议栈中的 SCO 就是支持同步模式的。
L2CAP之上有两个协议被较广地使用着:RFCOMM和BNEP,前者用于取代传统的串行口,包括串行口上的各种应用,比如,传真和拨号上网、打印机、文件图片等数据传输;后者则可以提供一个以太网接口,更适于计算机组网。自然地,对于手机和计算机之间,RFCOMM 总是更常被用到。
截止到这里就是内核提供的几乎所有蓝芽协议栈了,不过,仅有这些,蓝芽还不足以为我所用,只有有了用户态的协议栈和工具相配合,才有幸福的蓝芽生活 :)
用户空间中的蓝芽协议栈与相关工具
接着刚才的协议栈,这次势在用户空间实现的了:
在最上层,蓝芽定义了很多的Profile,每个Profile对应着一种应用,比如打印、耳机(Headset)、文件传输、Fax/Modem拨号功能等。其中,文件交换对应着Obex协议,这是一个基于蓝芽、红外(IrDA)、串口等介质的文件(对象)交换协议,这几种介质被列到一起一点也不会让人感到意外,毕竟前两个都是用来在某种意义上取代串口的。当然,有些Profile,比如一些人机交互设备 (键盘鼠标之类的) 的profile 是在内核中实现的。
实际上,我们还有一个重要的协议没有介绍,这就是SDP --- 服务发现协议,这个协议可以认为和RFCOMM处于统一层次,因为它并不承载于RFCOMM之上,不过,这个协议却十分特殊而重要,通过它,我们才能识别出某一蓝芽设备提供了哪些服务(Profile),从而为我所用。
嗯,协议栈已经有了,那我们怎么使用蓝芽呢? 回忆一下怎么把大象放到冰箱里吧:
打开冰箱门
把大象放进冰箱
关上冰箱门
就是这么简单,一个蓝芽服务也是这么容易:
找到蓝芽设备,这是HCI层负责的,使用 bluez-utils 包提供的 hcitool 来找到蓝芽设备;
找到服务,RFCOMM 是通过不同的频道 (channel) 来提供不同的Profile的,所以,我们需要找到我们要用的服务在设备上的哪个频道上,这是通过同一个软件包里的 sdptool 来完成的,没错,就是 SDP,服务发现协议。
连接恰当的服务,使用
蓝芽的特点就是如上所属的那些了,而用户态的工具所要完成的任务就是:
发现服务
使用服务