被玩壞了的 Android Bluetooth

這里的一切都是站在一個上層應用開發(fā)者的角度去理解藍牙,做一些形象的比喻,幫助理解整個藍牙通信流程。(PS:初稿需要修改)

比劃下協(xié)議棧

協(xié)議棧這個東西按照字面意思解:
協(xié)議表示事先已經(jīng)約定好了
表示分層的意識
協(xié)議棧表示 已經(jīng)約定好的分層通信模型

stack.png

一個簡單的例子:
應用層 這里定義里通俗的通信語言(假設應用層發(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ā)送到手機上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容