藍(lán)牙m(xù)esh規(guī)范中定義了兩種承載器:廣播承載器和GATT承載器蚜锨。因?yàn)槟壳笆忻嫔纤惺謾C(jī)氏堤,都沒有包含完整的藍(lán)牙m(xù)esh協(xié)議棧,所以在APP中只能以代理的方式和設(shè)備建立連接才能通信搏明,造成的結(jié)果是在APP端只有GATT承載器鼠锈。廣播承載器的部分只能在節(jié)點(diǎn)與節(jié)點(diǎn)之間進(jìn)行數(shù)據(jù)傳輸時(shí)用到,APP端目前都是配網(wǎng)器的角色星著。
Advertising bearer
在手機(jī)端是沒有這個(gè)承載器的购笆,原因已經(jīng)在之前的文章中說過了。對(duì)于廣播承載器虚循,只貼一張圖
GATT bearer
GATT承載器能夠讓那些不支持廣播承載的設(shè)備也能加入藍(lán)牙m(xù)esh網(wǎng)絡(luò)同欠。GATT承載器通過在兩個(gè)設(shè)備之間建立GATT連接并使用代理協(xié)議來發(fā)送和接收代理數(shù)據(jù)報(bào)样傍。
就是用傳統(tǒng)的BLE4.0的操作方式,建立GATT服務(wù)端和客戶端铺遂,跟大多數(shù)BLE使用場(chǎng)景一樣衫哥,GATT服務(wù)端只能實(shí)例化一個(gè)藍(lán)牙m(xù)esh代理服務(wù),就是一個(gè)服務(wù)端不能同時(shí)連接多個(gè)客戶端襟锐。配網(wǎng)器連接代理節(jié)點(diǎn)撤逢,節(jié)點(diǎn)將消息傳遞給其他節(jié)點(diǎn)。
手機(jī)是服務(wù)端粮坞,根據(jù)協(xié)議規(guī)定蚊荣,手機(jī)同時(shí)只能連接一臺(tái)mesh設(shè)備。大家都知道手機(jī)可以連接多臺(tái)BLE4.0設(shè)備莫杈,為什么藍(lán)牙m(xù)esh協(xié)議規(guī)范要規(guī)定只能連接一臺(tái)設(shè)備互例?
當(dāng)下有個(gè)配網(wǎng)需求,“一鍵配網(wǎng)”筝闹,指將搜索到的為配網(wǎng)設(shè)備媳叨,一鍵同時(shí)都加入網(wǎng)絡(luò)。能不能同一時(shí)間給多臺(tái)設(shè)備配網(wǎng)丁存?
所謂的藍(lán)牙m(xù)esh代理服務(wù)肩杈,就是在客戶端按照下圖中的特征配置,與指定的特性進(jìn)行通信解寝。
這里要說明一點(diǎn):藍(lán)牙m(xù)esh協(xié)議扩然,實(shí)際上包括設(shè)備配網(wǎng)協(xié)議與配網(wǎng)后的7層網(wǎng)絡(luò)架構(gòu)協(xié)議。配網(wǎng)數(shù)據(jù)的發(fā)送和節(jié)點(diǎn)的消息發(fā)送是兩種不同的協(xié)議層次聋伦。但是他們都會(huì)使用到承載層夫偶,所以可以看到設(shè)備在配網(wǎng)前后使用的代理特性是不一樣的,在APP界面上觉增,搜索未配網(wǎng)設(shè)備和搜索已配網(wǎng)設(shè)備的頁(yè)面也是分開的兵拢,這樣做的好處,在代碼實(shí)現(xiàn)層面的結(jié)構(gòu)更清晰逾礁。當(dāng)然是可以做到把未配網(wǎng)設(shè)備和配網(wǎng)設(shè)備都放在同一個(gè)頁(yè)面说铃,但不管是從消費(fèi)者使用方便還是程序業(yè)務(wù)邏輯上講,都沒有任何好處嘹履。
承載層的具體職責(zé)
1.將來自網(wǎng)絡(luò)層的數(shù)據(jù)報(bào)腻扇,通過GATT連接發(fā)送出去
2.識(shí)別接收到的數(shù)據(jù)類型,識(shí)別類型后傳給網(wǎng)絡(luò)層進(jìn)行下一步處理砾嫉。
承載層一共支持4種消息類型:
- networkPdu = 0
- meshBeacon = 1
- proxyConfiguration = 2
- provisioningPdu = 3
因?yàn)樗{(lán)牙m(xù)esh存在兩種不同的協(xié)議棧幼苛,在APP端程序中承載層暴露給網(wǎng)絡(luò)層調(diào)用的承載器是兩種:GattBearer和PBGattBearer。PBGattBearer是負(fù)責(zé)配網(wǎng)協(xié)議的承載器焕刮,僅支持provisioningPdu這種消息類型舶沿。GattBearer負(fù)責(zé)其他三種消息類型墙杯,networkPdu、meshBeacon括荡、proxyConfiguration高镐。這兩個(gè)承載器支撐起整個(gè)APP端藍(lán)牙m(xù)esh協(xié)議的數(shù)據(jù)傳輸。
承載層需要暴露給其他層調(diào)用的接口:
- 發(fā)送數(shù)據(jù)的接口
- 接收數(shù)據(jù)后往網(wǎng)絡(luò)層傳遞數(shù)據(jù)的接口
- 承載器的狀態(tài)查詢接口一汽,指底層BLE是否已經(jīng)建立連接
- 打開承載器接口避消,建立GATT連接
- 關(guān)閉承載器接口,關(guān)閉GATT連接
- 承載器打開成功后的回調(diào)接口
- 承載器操作異常的回調(diào)接口
- 承載器關(guān)閉成功后的回調(diào)接口
- 是否支持消息類型接口
- BLE設(shè)備信息回調(diào)接口召夹,如設(shè)備UUID岩喷,name,RSSI
- 承載層內(nèi)部的數(shù)據(jù)的分包與數(shù)據(jù)重組
思考:在之前的文章中提到過监憎,手機(jī)端因?yàn)闆]有完整的協(xié)議棧纱意,只能使用GATT承載器。從節(jié)點(diǎn)拓?fù)鋱D上看鲸阔,一個(gè)Friend節(jié)點(diǎn)可以對(duì)應(yīng)多個(gè)低功耗節(jié)點(diǎn)偷霉,那么低功耗節(jié)點(diǎn)設(shè)備是否有完整的mesh協(xié)議棧,它是如何實(shí)現(xiàn)與mesh網(wǎng)絡(luò)進(jìn)行通信的褐筛?