舉栗子
ble mesh 中存在一類代理節點(proxy node),其作用是通過GATT,將接受到的數據,發送給mesh 網絡中,不具備gatt 能力的設備。
例如:天貓精靈需要wifi 配網,需要獲取到wifi 網絡的賬號和密碼,這個時候需要用手機app ,通過bt gatt 連接到天貓精靈,發送數據,然後如果mesh 網絡中,其他節點需要這個賬號和密碼信息,天貓精靈可以通過adv轉發這些信息。
這個過程中,天貓精靈就是一個proxy server 的角色,手機是一個proxy client 角色, mesh 燈組 等設備屬於不具備gatt 連接類型設備
萬物皆數據
所有藍牙協議的核心作用就是定義好一套數據幀格式
然後世界內,所有需要應用藍牙的人,都來遵守同一套規則,然後就能正常通信
如果你NB,不願遵守,也可以自創一套,那不是咱現在討論的 bt proxy 協議。迴歸正題, Proxy PDU
Proxy PDU
整個數據幀分爲三部分,SAR標誌符,類型標誌符,數據前兩部分長度固定,共佔用一個字節(opcode),實際數據長度取決於用戶定義(variable)。
但是受限與GATT層一幀數據的大小(默認ATT_MTU=23),過長的PDU,會被分割和重組(SAR),多次發送。
SAR(分割與重組),二進制兩個bit,四個值分別定義如下。
思考
怎麼判斷一個PDU有發送完成?
直到收到的數據幀SAR標誌位爲00或者11
怎麼發送一個超長的PDU?
根據ATT_MTU的大小,將數據分割,第一包數據SAR01,中間N包數據SAR10,最後一包數據11
發送數據的類型,指示後續data爲數據會發送到那一層,方便用正確的規則去解析後面的實際數據
僅有四種數據類型,6bit ,0x04-0x3f保留
0x01 mesh beacon:新設備和mesh 節點之間的 廣播包,兩種
- Unprovisioned Device beacon ,配網之前的pdu
- Secure Network beacon
0x00 Network PDU :network layer defines the Network PDU format
配置中間角色
在上述栗子中, 手機與燈組的溝通,需要天貓精靈作爲中間角色,傳遞消息。
但是我們用戶在手機端,並不需跟所有的燈溝通,我們只需控制其中一個燈,這個時候就可以通過一些配置,給天貓精靈發送一些過濾條件,僅僅接受所關注的那個燈所發出的訊息。
記住,手機作爲client, 天貓精靈作爲server , 是client 配置server
Filter types
白名單
僅僅接受目的地地址destination addresses ,在白名單中的設備
黑名單
除了黑名單以內的所有設備,其他destination addresses 的所有設備都會接受
其實也很明白,白名單內全收,黑名單內全部不收
Proxy configuration
0x02 Proxy configuration messages
這類PDU,是用來 配置代理過濾條件。
在整個proxy 行爲中,有兩個數據的流動:
- 燈組 --> 天貓精靈
- 手機 <–> 天貓精靈
燈組 --> 天貓精靈
數據格式與Network PDU完全相同
在 Proxy configuration messages僅關注如下類型的數據:
The CTL field shall be set to 1.
The TTL field shall be set to 0.
The DST field shall be set to the unassigned address
核心的操作對象就是這個地址DST
手機 <–> 天貓精靈
操作手段,action 有如下四種,opcode 佔有一個字節,定義如下
這四種行爲不難理解,設置模式,增加或減少,返回狀態。
Proxy Server behavior
- 一旦連接建立,Proxy Server初始化爲白名單模式,並且白名單爲空
- 白名單模式下,一旦收到client 端的有效信息,需要將SRC unicast address,加入白名單
- 黑名單模式下, 一旦收到client 端的有效信息,需要將SRC unicast address,移除黑名單
- 一旦連接建立,server 需要發送Secure Network Beacon client
- 一旦收到client端的Secure Network Beacon, server端需要做一些處理
- 發送的message,SRC需要設置爲primary element unicast address
- 收到Set Filter Type message ,先清除,再回狀態
- 收到Add Addresses to Filter message ,回狀態; 如已經存在或者空間不夠,忽略
- 收到Remove Addresses from Filter message ,回狀態,如果不存在,忽略
- 收到unexpected value of the SAR field ,直接disconect
- 收到Reserved for Future Use ,忽略
- SAR timmer =20s,超時斷開
總結:
server初始化默認白名單爲空
無論哪種模式,一旦連接建立,給client SRC address 金水
server收到command,先處理,再回狀態,client根據callback判斷是否有成功執行
無效命令和超時都會斷開連接
Proxy Client behavior
- 發送的消息,SRC 設置爲primary element unicast,SEQ同樣使用sequence number of its
primary element - 接受到無效信息,直接斷開
- 接受到保留的類型數據,忽略
- 超時同設是20s,超時斷連
流程圖
如果看懂了client 和server端的行爲 及 消息類型,應該很容易理解白名單和黑名單的流程圖