當藍牙SIG(特別興趣組,由愛立信等廠商組成)成立的時候,其發起者曾經指出,當藍牙可以被集成入單芯片之中、成本降低到5美圓的時候,將獲得極大地普及。而今,小小的一個五號電池大小的幾十塊人民幣的東西就能夠提供這個功能了,藍牙也真的進入了咱們的生活。利用藍牙在手機之間傳送圖片不是什麼新鮮事,如今作的是要鏈接Linux主機和藍牙手機。安全
藍牙最先由瑞典的愛立信公司提出,其名稱源於古代瑞典的一位國王,由於總吃某種果品,把牙齒染成藍色的,被稱做藍牙(bluetooth)。那時的瑞典統治整個北歐,盛極一時,一樣有野心的愛立信因而使用這個名字來命名這個被他們寄予厚望的短距離互聯技術。服務器
Bluetooth用於鏈接我的周邊的外圍設備,好比無線耳機、打印機、掃描儀、手機、計算機等等,在這些設備之間交換文件和數據,替代低速串行線的工做,經常使用用途以下。網絡
l 文件共享、傳輸。app
l 語音傳輸。異步
l 遠程打印。ide
l RS-232串行口線替代。工具
由於Bluetooth的功能十分實用,有了它既不須要麻煩的手機數據線了,也不須要像紅外數據傳輸同樣須要將兩個設備對準,所以一經提出,馬上有一種一呼百應的感受,隨着成本的降低,藍牙的用途也愈來愈廣(固然了,這個過程也並不是一路順風,成本的降低用了不少年才完成),大量的中低端手機也開始裝備上了這項技術,以其更豐富、完善的協議棧,略高的傳輸速率,以及相對於紅外線來講擺脫了必須毫無障礙的束縛,幾乎徹底取代了原來商務手機上廣泛裝備的紅外接口。spa
藍牙來到中國之初,在臺灣地區註冊商標的時候把「牙」替換成了更有東方美感的「芽」字,不事後來已經統一爲了「牙」。藍牙實際上並非一種簡單的協議,它的協議很複雜。命令行
l 從網絡結構和組網方式講,藍牙在10米區域內造成一個網絡,其中能夠有1個主設備,7個從設備,一共8個激活的設備,固然休眠的設備還能夠有不少。對於更多的設備,可使用adhoc的方式互聯,本書不對此話題作更深刻的介紹。設計
l 從應用來看,藍牙支持語音通訊和串行線模擬,而且經過Profile來支持各類周邊智能設備的應用,好比耳機、打印機等等,而且定義了一套服務發現和調用機制。
藍牙最有意思的莫過於第2層互聯和應用層的Profile了,至於底層的跳頻新意不大。另外,雖然藍牙使用的頻率和微波爐烹飪的頻率毫無二致,但發射功率仍是很小的,與手機相比,這個功率微不足道。
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更常被用到,另外一方面,計算機之間的組網則更經常使用更高速的無線局域網而不是藍牙。
截止到這裏就是內核提供的幾乎全部藍牙協議棧了,不過,僅有這些,藍牙還不足覺得用戶所用,只有有了用戶態的協議棧和工具相配合才能使用藍牙。
下面介紹用戶空間的實現部分。
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 鏈接恰當的服務並使用。
藍牙的特色就是如上所述的那些了,而用戶態的工具所要完成的任務就是發現服務和使用服務了。
首先,用戶須要啓動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碼了。
HCI已經啓動了,如今就能夠用它來尋找藍牙設備了,固然,必定要先開啓藍牙設備的藍牙功能,這個不是廢話,手機的藍牙是默認關閉的,只有在手動控制之下才會發送信號,容許被掃描到,不過設備的個體差別性太大,這裏無法介紹,做者假設讀者已經本身摸索或參照說明書打開了設備的藍牙電源。尋找藍牙設備如清單15.3所示。
清單15.3 尋找藍牙設備
inspiration :/ home / gnawux # hcitool scan
18 Scanning ...
00:17:00:7 B :18: B8 Motorola SLVR
以後藍牙設備就會被順利地找到,固然,前提是不要忘了打開手機的藍牙開關,並容許被找,這個功能平時最好不要打開,以防在公共場合遇到安全問題。
利用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文件傳輸服務以及圖片推送服務等,利用這些服務,能夠利用手機撥號上網或是與手機交換圖片、音樂等文件。
首先介紹如何利用藍牙取代手機數據線,以便進行撥號等工做。以後介紹利用藍牙傳送文件的幾個用法,都是藉助於前面提到的OBEX協議。
你們知道,藍牙的一個基本功能就是模仿串口,而串口的重要做用之一(多是最重要的了)就是撥號,傳統的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創建撥號網絡。
這是使用手機或計算機提供的「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
如今,計算機進入了接收模式,在手機側發送文件到計算機就能夠了。
使用「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的圖形化界面工具)等工具,此處不一一介紹。