連接藍牙設備

當藍牙SIG(特別興趣組,由愛立信等廠商組成)成立的時候,其發起者曾經指出,當藍牙能夠被集成入單芯片之中、成本下降到5美元的時候,將得到極大地普及。而今,小小的一個五號電池大小的幾十塊人民幣的東西就可以提供這個功能了,藍牙也真的進入了我們的生活。利用藍牙在手機之間傳送圖片不是什麼新鮮事,現在做的是要連接Linux主機和藍牙手機。

15.2.1  藍牙技術概述

藍牙最早由瑞典的愛立信公司提出,其名稱源於古代瑞典的一位國王,因爲總吃某種果品,把牙齒染成藍色的,被稱作藍牙(bluetooth)。那時的瑞典統治整個北歐,盛極一時,同樣有野心的愛立信於是使用這個名字來命名這個被他們寄予厚望的短距離互聯技術。

Bluetooth用於連接個人周邊的外圍設備,比如無線耳機、打印機、掃描儀、手機、計算機等等,在這些設備之間交換文件和數據,替代低速串行線的工作,常用用途如下。

l     文件共享、傳輸。

l     語音傳輸。

l     遠程打印。

l     RS-232串行口線替代。

因爲Bluetooth的功能十分實用,有了它既不需要麻煩的手機數據線了,也不需要像紅外數據傳輸一樣需要將兩個設備對準,因此一經提出,立刻有一種一呼百應的感覺,隨着成本的下降,藍牙的用途也越來越廣(當然了,這個過程也並非一帆風順,成本的下降用了很多年才完成),大量的中低端手機也開始裝備上了這項技術,以其更豐富、完善的協議棧,略高的傳輸速率,以及相對於紅外線來說擺脫了必須毫無障礙的束縛,幾乎完全取代了原來商務手機上普遍裝備的紅外接口。

藍牙來到中國之初,在臺灣地區註冊商標的時候把“牙”替換成了更有東方美感的“芽”字,不過後來已經統一爲了“牙”。藍牙實際上並不是一種簡單的協議,它的協議很複雜。

l     從網絡結構和組網方式講,藍牙在10米區域內形成一個網絡,其中可以有1個主設備,7個從設備,一共8個激活的設備,當然休眠的設備還可以有很多。對於更多的設備,可以使用adhoc的方式互聯,本書不對此話題做更深入的介紹。

l     從應用來看,藍牙支持語音通信和串行線模擬,並且通過Profile來支持各種周邊智能設備的應用,比如耳機、打印機等等,並且定義了一套服務發現和調用機制。

藍牙最有意思的莫過於第2層互聯和應用層的Profile了,至於底層的跳頻新意不大。另外,雖然藍牙使用的頻率和微波爐烹飪的頻率毫無二致,但發射功率還是很小的,與手機相比,這個功率微不足道。

15.2.2  Linux下的藍牙協議棧

Linux下有若干個藍牙協議棧的實現,目前生存狀況比較健康的是bluez和affix,後者是Nokia支持的,前者則是目前藍牙的Linux官方版本,集成在Linux內核之中,也就是說,如果用戶有一個比較新的2.6內核,那麼,多半已經支持藍牙了,而如果還不支持的話,重新編譯一下或直接使用官方內核也就可以了。

不要誤認爲Linux的協議棧比不上Windows裏面的,bluez協議棧支持的硬件設備遠遠多於Windows系統支持的。如果和作者一樣只用Linux,那麼,買了藍牙適配器之後就可以使用藍牙了。

內核的協議棧支持主要包含以下幾個部分。

l     HCI。這個是最底層的了,稱爲Host Control Interface(主機控制接口)。之所以稱爲HCI是源於藍牙的應用模式的。藍牙是連接智能外設的無線接口,接口的一側是設備,另一側就是主機(Host)了,採用類似記法的還有USB、IEEE1394,所以,從設計初衷來看,這幾個產品都是針對差不多的市場的,只是各有所長。一個藍牙適配器是否能被驅動起來,就看HCI的支持性了。最常見的藍牙適配器就是作者持有的這類USB接口的了,對於大部分標準的藍牙設備,它的驅動模塊是hci-usb,對於2.6內核,插入這個適配器,該模塊就被自動加載了。

l     在HCI之上是L2CAP(Logical Link Control and Adaptation Protocal,邏輯鏈路控制與適配層),這一層的功能承上啓下,向上層提供異步數據傳輸的鏈路控制功能,所謂異步,就是不存在一個主時鐘來同步所有傳輸的一種傳輸方式,通常用於數據的傳輸;與之相反,同步傳輸是完全與時鐘同步的,通常用在諸如語音或是多媒體通話之中。此外,在藍牙中,語音同步傳輸也是被支持的,bluez協議棧中的SCO就是支持同步模式的。

l     L2CAP之上有兩個協議被較廣泛地使用:RFCOMM和BNEP。前者用於取代傳統的串行口,包括串行口上的各種應用,比如,傳真和撥號上網、打印機、文件圖片等數據傳輸;後者則可以提供一個以太網接口,被用於計算機組網。對於手機和計算機之間,RFCOMM更常被用到,另一方面,計算機之間的組網則更常用更高速的無線局域網而不是藍牙。

截止到這裏就是內核提供的幾乎所有藍牙協議棧了,不過,僅有這些,藍牙還不足以爲用戶所用,只有有了用戶態的協議棧和工具相配合才能使用藍牙。

15.2.3  用戶空間中的藍牙協議棧與相關工具

下面介紹用戶空間的實現部分。

l     在最上層,藍牙定義了很多的Profile,每個Profile對應着一種應用,比如打印、耳機(Headset)、文件傳輸、Fax/Modem撥號功能等。其中,文件交換對應着OBEX協議,這是一個基於藍牙、紅外(IrDA)、串口等介質的文件(對象)交換協議,這幾種介質被列到一起一點也不會讓人感到意外,畢竟前兩個都是用來在某種意義上取代串口的。當然,有些Profile,比如一些人機交互設備(鍵盤鼠標之類的)的Profile是在內核中實現的。

l     SDP爲服務發現協議,這個協議可以認爲和RFCOMM處於同一層次,因爲它並不承載於RFCOMM之上,不過,這個協議卻十分特殊而重要,通過它,才能識別出某一藍牙設備提供了哪些服務(Profile),從而進一步使用。

協議棧已經有了,使用藍牙是非常簡單的事情。

l     找到藍牙設備,這是HCI層負責的,使用bluez-utils包提供的hcitool來找到藍牙設備。

l     找到服務,RFCOMM是通過不同的頻道(channel)來提供不同的Profile的,所以需要找到要用的服務在設備上的哪個頻道上,這是通過同一個軟件包裏的sdptool來完成的,就是SDP,服務發現協議。

l     連接恰當的服務並使用。

藍牙的特點就是如上所述的那些了,而用戶態的工具所要完成的任務就是發現服務和使用服務了。

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   gnawux@inspiration :~$ 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   gnawux@inspiration :~$ 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  向手機推送文件

gnawux@inspiration :~$ 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服務

gnawux@inspiration :~$ sdptool add OPUSH

106  OBEX Object Push service registered

現在進入接收狀態,注意要使用計算機(local)的地址和頻道號,這些信息可以通過清單15.4所示方法得到,見清單15.11。

清單15.11  接收手機推送的文件

gnawux@inspiration :~$ 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列目錄清單

 gnawux@inspiration :~$ 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 )"...| <? xml version ="1.0" ?>

116   <! DOCTYPE folder - listing SYSTEM "obex - folder - listing . dtd">

 <folder - listing >

118   <parent - folder />

 <folder name =" audio " size ="0" type =" folder " modified ="20060805 T 144844 Z" user

 - perm =" RW" />

<!--[if !supportLists]-->120        <!--[endif]--><folder name =" video " size ="0" type =" folder " modified ="20060805 T 144844 Z"

      user - perm =" RW" />

 <folder name =" picture " size ="0" type =" folder " modified ="20060805 T 144844 Z"

 user - perm =" RW" />

<!--[if !supportLists]-->121        <!--[endif]--><folder name =" MMC( Removable )" size ="0" type =" folder " modified ="19700101 T

      000000 Z"      user - perm =" RW"

124    </folder - listing >done

  Disconnecting ... done

可以看到,有4個有讀寫(RW)權限的目錄,再看看audio裏面有什麼,見清單15.13。

清單15.13  obexftp查看audio目錄

126  gnawux@inspiration :~$ 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 "...| <? xml version ="1.0" ?>

 <! DOCTYPE folder - listing SYSTEM "obex - folder - listing . dtd">

132   <folder - listing >

 <parent - folder />

<!--[if !supportLists]-->134       <!--[endif]--><file name ="a.mp 3" size ="977920" type =" audio /mp 3" modified ="20060805 T 145050

       Z" user   - perm =" RW"

136   </folder - listing >done

 Disconnecting ... done

可以看到,這裏有一個MP3文件,把它取下來,如清單15.14所示。

清單15.14  obexftp下載

138   gnawux@inspiration :~$ 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下載

gnawux@inspiration :~$ 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的圖形化界面工具)等工具,此處不一一介紹。
發佈了116 篇原創文章 · 獲贊 11 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章