這里的一切都是站在一個上層應用開發(fā)者的角度去理解藍牙,做一些形象的比喻,幫助理解整個藍牙通信流程。(PS:初稿需要修改)
比劃下協(xié)議棧
協(xié)議棧這個東西按照字面意思解:
協(xié)議表示事先已經(jīng)約定好了
棧 表示分層的意識
協(xié)議棧表示 已經(jīng)約定好的分層通信模型

一個簡單的例子:
應用層 這里定義里通俗的通信語言(假設應用層發(fā)送 Hello)
邏輯鏈路層這里表示已經(jīng)經(jīng)過事先約定好的模型處理過的上傳數(shù)據(jù)(Hello已經(jīng)處理為0x48,0x65,0x6C,0x6C,0x6F)
物理層這里表示傳輸?shù)奈锢砻浇?,例如電纜,無線電等(這里已經(jīng)變成了帶有高低電平的無線波信號)
藍牙通信模型
藍牙通信的模型其實可以看成一個標準的B\S架構(gòu)。
即存在藍牙服務端和藍牙客戶端。
HeadSet Profile
藍牙耳機協(xié)議:
服務端: 帶有藍牙功能的手機
客戶端: 藍牙耳機
打電話時手機通過藍牙發(fā)送音頻信號給藍牙耳機。
Synchronization Profile
這個協(xié)議可以傳輸文件。
服務端: 藍牙手機A
客戶端: 藍牙手機B
手機A通過藍牙分享一個文件到手機B。
總結(jié):
Bluetooth定義了9種應用(usage)Profile。
CTP Profile: Cordless Telephone Profile,無繩電話。
IP Profile: Intercom Profile,這是在兩個設備之間建立語音連接,換句話說,把兩個昂貴的藍牙設備變成廉價的對講機。
HS Profile: HeadSet Profile,用于連接耳機。
DNP Profile: Dial-up Networking Profile,用于為PC提供撥號網(wǎng)絡功能。
FP Profile: Fax Profile,傳真功能。
LAP Profile: LAN Access Profile,使用PPP協(xié)議建立局域網(wǎng)。
OPP Profile: Object Push Profile,用于設備之間傳輸數(shù)據(jù)對象。
FTP Profile: File Transfer Profile,用于文件傳輸。
SP Profile: Synchronization Profile,用于不同的Bluetooth設備同步,保持數(shù)據(jù)的一致性。
Bluetooth定義了4種是基本的Profile,這些Profile會被其它的Profile使用。
GAP Profile: Generic Access Profile,該Profile保證不同的Bluetooth產(chǎn)品可以互相發(fā)現(xiàn)對方并建立連接。
SDAP Profile: Service Discovery Application Profile,通過該Profile,一個Bluetooth設備可以找到其它Bluetooth設備提供的服務,以及查詢相關的信息。
SPP Profile: Serial Port Profile,模擬串口通訊
GOEP Profile: Generic Object Exchange Profile,通用對象交換。這個Profile的名字有些費解,它定義的是數(shù)據(jù)的傳輸,包括同步,文件傳輸,或者推送其它的數(shù)據(jù)。你可以把它理解為內(nèi)容無關的傳輸層協(xié)議,可以被任何應用用來傳輸自己定義的數(shù)據(jù)對象
。
藍牙的Profile都可以看成B\S架構(gòu)。 GAP可能不太好用B\S解釋。
說說藍牙協(xié)議棧如何實現(xiàn)的
有了上面的知識, 再去理解下協(xié)議棧是來干什么的。
服務端
啟動一個監(jiān)聽,監(jiān)聽的話肯定需要一個內(nèi)容, 藍牙標準化了這個內(nèi)容, 使用UUID表示。
HCRPrintServiceClass_UUID = '{00001126-0000-1000-8000-00805F9B34FB}'
客戶端
發(fā)起一個請求, 請求總需要一個目標, 這個目標就是UUID.
協(xié)議棧
就是起到一個封裝解析并傳遞數(shù)據(jù)的作用。
舉個例子:(服務端【B】 客戶端【C】)
1:C發(fā)給B: 01
2:B收到, 協(xié)議棧去解析01(假設是詢問服務端是否準備就緒)
3:B返回C:01
4:C收到, 協(xié)議棧去解析01(假設是表示服務端準備就緒)
5:C認為B已經(jīng)OK, 繼續(xù)發(fā)送數(shù)據(jù)
Android Bluedroid
Bluedroid是Android上的藍牙協(xié)議棧, 這個協(xié)議棧, 默認已經(jīng)實現(xiàn)了很多的基礎的Profile。
OPP, PBAP 這兩個協(xié)議是純上層 Bluetooth.apk 實現(xiàn)的。
原理也很簡單, APP啟動一個 BluetoothServerSocket 監(jiān)聽相應的UUID, 假設請求到來的話, 直接把數(shù)據(jù)轉(zhuǎn)到上傳APP層處理。
藍牙玩?zhèn)€新花樣
有了上面的知識后, 自己就可以實現(xiàn)一個手機上未實現(xiàn)的Profile。
我這里實現(xiàn)了一個
#藍牙串口服務
SerialPortServiceClass_UUID = '{00001101-0000-1000-8000-00805F9B34FB}'
這個東西實現(xiàn)之后, 就可以把手機當成一個藍牙打印機使用了, 已經(jīng)成功的連接了各大外賣平臺, 可以讓它們把數(shù)據(jù)直接發(fā)送到手機上。