Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1325844
  • 博文数量: 175
  • 博客积分: 2743
  • 博客等级: 少校
  • 技术积分: 4024
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-30 01:41
文章分类

全部博文(175)

文章存档

2015年(1)

2013年(53)

2012年(71)

2011年(50)

分类: LINUX

2012-10-20 14:55:32

  当蓝牙SIG(Special Interest Group,特别兴趣组,由爱立信等厂商组成)成立的时候,其发起者曾经指出,当蓝牙能够被集成入单芯片之中、成本下降到5美元的时候,将得到极大地普 及。而今,小小的一个五号电池大小的几十块人民币的东西就可以提供这个功能了,蓝牙也真的进入了我们的生活。利用蓝牙在手机之间传送图片不是什么新鲜事, 现在做的是要连接Linux主机和蓝牙手机


15.2.1  蓝牙技术概述
    蓝牙最早由瑞典的爱立信公司提出,其名称源于古代瑞典的一位国王,因为总吃某种果品,把牙齿染成蓝色的,被称作蓝牙(bluetooth)。那时的瑞典统治整个北欧,盛极一时,同样有野心的爱立信于是使用这个名字来命名这个被他们寄予厚望的短距离互联技术。

    Bluetooth用于连接个人周边的外围设备,比如无线耳机、打印机、扫描仪、手机、计算机等等,在这些设备之间交换文件和数据,替代低速串行线的工作,常用用途如下:

(l)文件共享、传输。

(2)语音传输。

(3)远程打印。

(4)RS-232串行口线替代。


    因为Bluetooth的功能十分实用,有了它既不需要麻烦的手机数据线了,也不需要像红外数据传输一样需要将两个设备对准,因此一经提出,立刻有 一种一呼百应的感觉,随着成本的下降,蓝牙的用途也越来越广(当然了,这个过程也并非一帆风顺,成本的下降用了很多年才完成),大量的中低端手机也开始装 备上了这项技术,以其更丰富、完善的协议栈,略高的传输速率,以及相对于红外线来说摆脱了必须毫无障碍的束缚,几乎完全取代了原来商务手机上普遍装备的红 外接口。

    蓝牙来到中国之初,在台湾地区注册商标的时候把“牙”替换成了更有东方美感的“芽”字,不过后来已经统一为了“牙”。蓝牙实际上并不是一种简单的协议,它的协议很复杂。

   (l)从网络结构和组网方式讲,蓝牙在10米区域内形成一个网络,其中可以有1个主设备,7个从设备,一共8个激活的设备,当然休眠的设备还可以有很多。对于更多的设备,可以使用adhoc的方式互联。


   (2)从应用来看,蓝牙支持语音通信和串行线模拟,并且通过Profile来支持各种周边智能设备的应用,比如耳机、打印机等等,并且定义了一套服务发现和调用机制。

    蓝牙最有意思的莫过于第2层互联应用层的Profile了,至于底层的跳频新意不大。另外,虽然蓝牙使用的频率和微波炉烹饪的频率毫无二致,但发射功率还是很小的,与手机相比,这个功率微不足道。、

    PS:跳频技术是把频带分成若干个跳频信道(hop channel),在一次连接中,无线电收发器按一定的码序列(即一定的规律,技术上叫做"伪随机码",就是"假"的随机码)不断地从一个信道"跳"到另一个信道只有收发双方是按这个规律进行通信的,而其他的干扰不可能按同样的规律进行干扰(信号干扰,就是对一个有规律的信号的有规律的干扰);跳频的瞬时带宽是很窄的,但通过扩展频谱技术使这个窄带宽成百倍地扩展成宽频带,使干扰可能的影响变成很小。(扩展频谱技术——Spread Spectrum主要又分为「跳频技术」及「直接序列」两种方式。

   与其它工作在相同频段的系统相比,蓝牙跳频更快,数据包更短,这使蓝牙比其它系统都更稳定。跳频是蓝牙使用的关键技术之一。对应于单时隙包,蓝牙的跳频 速率为1600跳每秒,对应于多时隙包,跳频速率有所降低;但在建链时(包括寻呼和查询)则提高为3,200跳每秒。使用这样高的跳频速率,蓝牙系统具有 足够高的抗干扰能力。

    

    Ad Hoc:来源于拉丁语,意思是“专用的、特定的”。

      Ad Hoc网络是一种无中心自组织的多跳无线网络,它不以任何已有的固定设施为基础而能随时随地组建临时性网络(又可称为临时网),不需要一个接入点或服务器。它是具有特殊用途的对等式网络, 使用无线通信技术 ,网络中的节点互相作为其邻居(在其直接通信范围内的节点)的路由器 ,通过节点转发实现节点间的通信。

  ad hoc网络是由一组带有无线通信收发设备的移动节点组成,多跳,临时与无中心的自治系统。

  它有以下几个主要特点:

  (1)自组织。这种网络可以不需要任何预先架设的无线通信基础设施,所有节点通过分层协议体系与分布式算法,来协调每个结点各自的行为。结点可以快速,自主和独立的组网。

  (2)对等结构:所有节点在物理上都是相同的设备,即设备都是对等的。Ad-hoc网又称为对等网。

  (3)多跳路由

  (4)拓扑动态变化


蓝牙协议栈如下图所示:


较为完整的协议栈示意图:


15.2.2  Linux下的蓝牙协议栈
    Linux下有若干个蓝牙协议栈的实现,目前生存状况比较健康的是bluez和affix,后者是Nokia支持的,前者则是目前蓝牙的Linux官方版 本,集成在Linux内核之中,也就是说,如果用户有一个比较新的2.6内核,那么,多半已经支持蓝牙了,而如果还不支持的话,重新编译一下或直接使用官 方内核也就可以了。

    不要误认为Linux的协议栈比不上Windows里面的,bluez协议栈支持的硬件设备远远多于Windows系统支持的。如果和作者一样只用Linux,那么,买了蓝牙适配器之后就可以使用蓝牙了。

    内核的协议栈支持主要包含以下几个部分:

   (1)HCI。这个是最底层的了,称为Host Control Interface(主机控制接口)。之所以称为HCI是源于蓝牙的应用模式的。蓝牙是连接智能外设的无线接口接口的一侧是设备,另一侧就是主机(Host)了, 采用类似记法的还有USB、IEEE1394,所以,从设计初衷来看,这几个产品都是针对差不多的市场的,只是各有所长。一个蓝牙适配器是否能被驱动起 来,就看HCI的支持性了。最常见的蓝牙适配器就是作者持有的这类USB接口的了,对于大部分标准的蓝牙设备,它的驱动模块是hci- usb,对于2.6内核,插入这个适配器,该模块就被自动加载了。

   (2)在HCI之上是L2CAP(Logical Link Control and Adaptation Protocol,逻辑链路控制与适配层),这一层的功能承上启下,向上层提供异步数据传输的链路控制功能,所谓异步,就是不存在一个主时钟来同步所有传输的一种传输方式,通常用于数据的传输;与之相反,同步传输是完全与时钟同步的,通常用在诸如语音或是多媒体通话之中(用于流的传输,对比MOST。此外,在蓝牙中,语音同步传输也是被支持的,bluez协议栈中的SCO就是支持同步模式的。

   (3)L2CAP之上有两个协议被较广泛地使用:RFCOMM和BNEP。前者用于取代传统的串行口,包括串行口上的各种应用,比如,传真和拨号上网、 打印机、文件图片等数据传输;后者则可以提供一个以太网接口,被用于计算机组网。对于手机和计算机之间,RFCOMM更常被用到,另一方面,计算机之间的 组网则更常用更高速的无线局域网而不是蓝牙。

    截止到这里就是内核提供的几乎所有蓝牙协议栈了,不过,仅有这些,蓝牙还不足以为用户所用,只有有了用户态的协议栈(蓝牙协议栈+用户态的协议栈?)和工具相配合才能使用蓝牙。


15.2.3  用户空间中的蓝牙协议栈与相关工具
    下面介绍用户空间的实现部分。

    (1)在最上层,蓝牙定义了很多的Profile(这些profile是由蓝牙技术联盟定义的,即蓝牙协议栈本身,还是用户态的协议栈?这些profile肯定有相应的接口吧?,每个Profile对应着一种应用(个人认为,理解为:对应着一种外设,更好),比如打印、耳机(Headset)、文件传输、Fax/Modem拨号功能等。其中,文件交换对应着OBEX(OBEX全称为Object Exchange,中文对象交换,所以称之为对象交换协议。它在此软件当中有着核心地位,文件传输和IrMC同步都会使用到它。OBEX协议构建在IrDA架构的上层)协议,这是一个基于蓝牙、红外(IrDA)、串口等介质的文件(对象)交换协议,这几种介质被列到一起一点也不会让人感到意外,毕竟前两个都是用来在某种意义上取代串口的。

    当然,有些Profile,比如一些人机交互设备(键盘鼠标之类的)的Profile是在内核中实现的。

    (2)SDP为服务发现协议,这个协议可以认为和RFCOMM处于同一层次,因为它并不承载于RFCOMM之上,不过,这个协议却十分特殊而重要,通过它,才能识别出某一蓝牙设备提供了哪些服务(Profile),从而进一步使用。


1.启动HCI设备
    首先,用户需要启动hcid,让HCI层的通信可以进行。对于Debian用户来说,需要安装bluez-utils包,并启动hcid。如果已经运行了bluetooth服务,插入USB适配器后,hcid就已经在运行了,看看相关信息,见清单15.2。

清单15.2  HCI接口信息

1    inspiration :/ etc/ bluetooth # hciconfig -a

hci 0:  Type : USB

3            BD Address : 11:11:11:11:11:11 ACL MTU: 678:8 SCO MTU: 48:10

        UP RUNNING PSCAN ISCAN

5            RX bytes :413 acl :0 sco :0 events :19 errors :0

        TX bytes :323 acl :0 sco :0 commands :19 errors :0

7            Features : 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00

        Packet type : DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3

9            Link policy : RSWITCH HOLD SNIFF PARK

        Link mode : MASTER

11           Name : 'inspiration -0'

        Class : 0x3e 0100

13           Service Classes : Networking , Rendering , Capturing , Object Transfer , Audio

        Device Class : Computer , Uncategorized

15           HCI Ver : 1.2 (0x2) HCI Rev : 0x1fe LMP Ver : 1.2 (0x2) LMP Subver : 0x1fe

             Manufacturer : Integrated System Solution Corp . (57)

    这个过程是自动的,当然也可以用hciconfig(8)来手工控制。hcid的配置文件位于/etc/bluetooth/hcid.conf, 通常使用软件包附带的版本就可以了,如果希望不用每次连接都在计算机这里确认一次PIN码的话,可以设置其中的security字段为auto,这样,每 次连接就会使用passkey设置的PIN码了。


2.寻找蓝牙设备
    HCI已经启动了,现在就可以用它来寻找蓝牙设备了,当然,一定要先开启蓝牙设备的蓝牙功能,这个不是废话,手机的蓝牙是 默认关闭的,只有在手动控制之下才会发送信号,允许被扫描到,不过设备的个体差异性太大,这里没法介绍,作者假设读者已经自己摸索或参照说明书打开了设备 的蓝牙电源。寻找蓝牙设备如清单15.3所示。

清单15.3  寻找蓝牙设备

inspiration :/ home / gnawux # hcitool scan

18   Scanning ...

        00:17:00:7 B :18: B8         Motorola SLVR

之后蓝牙设备就会被顺利地找到,当然,前提是不要忘了打开手机的蓝牙开关,并允许被找,这个功能平时最好不要打开,以防在公共场合遇到安全问题。


3.查看设备提供的服务
利用SDP协议,用户还可以查看每个设备都有功能,能提供什么服务,每种基于RFCOMM的服务都使用某种协议,占据一个“频道(channel)”,这是使用蓝牙服务时的一个重要参数。

下面是例子,先看看本机,见清单15.4。

清单15.4  本机提供的蓝牙服务

20    :~$ sdptool browse local

Browsing FF:FF:FF :00:00:00 ...

22   Service Name : OBEX Object Push

Service RecHandle : 0x10000

24   Service Class ID List :

  " OBEX Object Push " (0x1105)

26   Protocol Descriptor List :

  "L2CAP" (0x0100)

28     "RFCOMM " (0x0003)

    Channel : 9

30     " OBEX " (0x0008)

Profile Descriptor List :

32     " OBEX Object Push " (0x1105)

     Version : 0x0100

然后可以看看关心的设备提供的服务,手机提供的服务种类比较多,首先是SDP服务器,也就是服务发现服务器,有了这个服务,就可以接下来发现其他服务功能了,见清单15.5。

清单15.5  手机提供的SDP功能

34    :~$ sdptool browse 00:17:00:7 B :18: B8

Browsing 00:17:00:7 B :18: B8 ...

36   Service RecHandle : 0x0

Service Class ID List :

38    "SDP Server " (0x 1000)

Protocol Descriptor List :

40    "L2CAP" (0x 0100)

       "SDP" (0x 0001)

42   Profile Descriptor List :

  "SDP Server " (0x 1000)

44       Version : 0x 0100

手机的最基本功能就是用于(电话或网络)拨号,这里列出的第一项服务也是“拨号网络网关”,标识服务具体类型的字段是“Service Class ID”,它所在的频道是RFCOMM的频道1,如清单15.6所示。

清单15.6  手机提供的拨号网络功能

Service Name : Dialup Networking Gateway

46   Service Description : Dialup Networking Gateway

Service Provider : Motorola

48   Service RecHandle : 0x 10001

Service Class ID List :

50    " Dialup Networking " (0x 1103)

Protocol Descriptor List :

52    "L2CAP" (0x 0100)

       " RFCOMM " (0x 0003)

54        Channel : 1

Language Base Attr List :

56    code _ ISO 639: 0x 656e

 encoding :     0x6a

58    base _ offset : 0x 100

 code _ ISO 639: 0x7a68

60    encoding :     0x6a

 base _ offset : 0xc 800

62  Profile Descriptor List :

 " Dialup Networking " (0x 1103)

64        Version : 0x 0100

除 了拨号网络服务的频道位置相对固定之外,其他服务在不同手机上的频道通常是不同的,手机一般支持的其他服务包括音频/耳机服务、车载免提服务、 OBEX对象推送服务、OBEX文件传输服务以及图片推送服务等,利用这些服务,可以利用手机拨号上网或是与手机交换图片、音乐等文件。


15.2.4  使用蓝牙
    首先介绍如何利用蓝牙取代手机数据线,以便进行拨号等工作。之后介绍利用蓝牙传送文件的几个用法,都是借助于前面提到的OBEX协议。

1.用蓝牙代替串口
    大家知道,蓝牙的一个基本功能就是模仿串口,而串口的重要作用之一(可能是最重要的了)就是拨号,传统的DTE也就是Modem。实际上,通过 RFCOMM,蓝牙连接可以反映在/dev/rfcomm0这样的字符设备上,像串口一样操作。当然,最好先定义/etc /bluetooth/ rfcomm.conf,里面根据手机的设备号和频道号写上相应设置,见清单15.7。

清单15.7  rfcomm设置

rfcomm 0 {

66          # Automatically bind the device at startup

    bind yes ;

68

        # Bluetooth address of the device

70      device 00:17:00:7 B :18: B8;

72          # RFCOMM channel for the connection

    channel 1;

74

        # Description of the connection

76      comment " Motorola SLVR L7";

}

    这样,在启动bluetooth服务的时候,就已经自动连接上了,而不需要使用rfcomm(1)命令自己费力气了。现在,可以使用任意一个喜欢的串口程 序(minicom、gtkterm等等)来对/dev/rfcomm0进行操作了,当然也可以使用pppd建立拨号网络。


2.利用OBEX推送文件
    这是使用手机或计算机提供的“OBEX Object Push”(0x1105)服务,由另一方向其推送如文件。使用的工具是openobex-apps包里的obex test工具。首先是利用手机的Push服务向手机推送,对于本例中的手机,这是通过清单15.5所使用的sdptool命令得到的结果的一部分,清单 15.8所示。

清单15.8  手机提供的对象推送功能

78   Service Name : OBEX Object Push

Service Description : OBEX Object Push

80   Service Provider : Motorola

Service RecHandle : 0x 10008

82   Service Class ID List :

        " OBEX Object Push " (0x 1105)

84   Protocol Descriptor List :

        "L2CAP" (0x 0100)

86      " RFCOMM " (0x 0003)

       Channel : 8

88      " OBEX " (0x 0008)

可以看到,推送服务位于频道8,现在,在obex_test的命令行里指定设备和频道,如清单15.9所示。

清单15.9  向手机推送文件

 :~$ obex _ test -b 00:17:00:7 B :18: B8 8

90   Using Bluetooth RFCOMM transport

OBEX Interactive test client / server .

92  > c

Connect OK!

94   Version : 0x10. Flags : 0x00

> p wangxu . jpg me. jpg

96   PUT file (local , remote )> name = wangxu .jpg , size =34177

Going to send 34177 bytes

98   Made some progress ...

Made some progress ...

100  Made some progress ...

Made some progress ...

102  Made some progress ...

PUT successful !

104  > q

执行完obex-test之后,进入一个交互状态,首先建立连接,然后传送文件(本地文件名是wangxu.jpg,存在手机上叫me.jpg(这个是随意取的),最后退出。这个过程需要看着手机屏幕,可能要确认是否连接,文件存放在哪里,这个和手机有关。

现在也可以看看手机向计算机推送,首先应该让计算机进入接收状态,如果本地没有启动Object PUSH服务,可以利用sdptool把它加上,如清单15.10所示。

清单15.10  给计算机加上Object Push服务

 :~$ sdptool add OPUSH

106  OBEX Object Push service registered

现在进入接收状态,注意要使用计算机(local)的地址和频道号,这些信息可以通过清单15.4所示方法得到,见清单15.11。

清单15.11  接收手机推送的文件

 :~$ obex _ test -b FF:FF:FF :00:00:00 9

108  Using Bluetooth RFCOMM transport

OBEX Interactive test client / server .

110  > s

现在,计算机进入了接收模式,在手机侧发送文件到计算机就可以了。


3.使用obexftp上传下载
    使用“OBEX File Transfer”(0x1106)服务的obexftp是一个方便的工具,利用它可以查看手机上的内容,并进行上传下载,对于本例,对应的频道是9。先来查看一下有哪些目录,见清单15.12。

清单15.12  obexftp列目录清单

  :~$ obexftp -b 00:17:00:7 B :18: B8 -B 9 -l

112  Browsing 00:17:00:7 B :18: B8 ...

 Channel : 9

114  Connecting ... done

 Receiving "( null )"...|

116  

 

118  

 

 - perm =" RW" />

120       

      user - perm =" RW" />

 

 user - perm =" RW" />

121              000000 Z"      user - perm =" RW"

124    done

  Disconnecting ... done

可以看到,有4个有读写(RW)权限的目录,再看看audio里面有什么,见清单15.13。

清单15.13  obexftp查看audio目录

126   :~$ obexftp -b 00:17:00:7 B :18: B8 -B 9 -l audio

 Browsing 00:17:00:7 B :18: B8 ...

128   Channel : 9

 Connecting ... done

130   Receiving " audio "...|

 

132  

 

134              Z" user   - perm =" RW"

136   done

 Disconnecting ... done

可以看到,这里有一个MP3文件,把它取下来,如清单15.14所示。

清单15.14  obexftp下载

138    :~$ obexftp -b 00:17:00:7 B :18: B8 -B 9 -c audio -g a.mp3

 Browsing 00:17:00:7 B :18: B8 ...

140   Channel : 9

 Connecting ... done

142   Sending " audio "... done

 Receiving "a.mp3"... - done

144   Disconnecting ... done

经过一段漫长的等待,传送终于完成了。再把wangxu.jpg放到picture目录去,如清单15.15所示。

清单15.15  obexftp下载

 :~$ obexftp -b 00:17:00:7 B :18: B8 -B 9 -c picture -p wangxu .jpg

146  Browsing 00:17:00:7 B :18: B8 ...

Channel : 9

148  Connecting ... done

Sending " picture "... done

150  Sending " wangxu .jpg "...\ done

Disconnecting ... done

这些就是obexftp的基本用法,更复杂的用法可以参考它的手册页obexftp(1)。此外,还有obexserver、qobex(基于QT的图形化界面工具)等工具,此处不一一介绍。

阅读(1321) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~