本文在藍牙技術聯盟發布的Mesh Profile的基礎上,做了一些協議上的定制,細化了部分協議規則,作為藍牙Mesh模組軟件規范,指導芯片或者模組廠家軟件設計,開發智能單品并對接生活物聯網平臺,包括自有品牌項目與天貓精靈生態項目均遵循本規范。
名詞解釋
名詞 | 描述 |
藍牙Mesh | 藍牙網狀網絡連接技術。 |
BLE | Bluetooth Low Energy 藍牙低功耗技術。 |
CID | Company Identifier,公司標識符。阿里巴巴的標識符為0x01A8。 |
Relay | 中繼功能:中繼節點能在藍牙Mesh網絡中接收和轉發其他設備的消息,通過消息在節點之間的中繼,實現更遠距離的傳輸和更大規模的網絡。承擔這一角色的節點一般需要固定的電源和一定的計算資源。 |
Proxy | 代理功能:代理節點能夠實現GATT和藍牙Mesh節點之間的Mesh消息發送與接收。通過Proxy代理使得BLE藍牙設備能通過GATT接入Mesh網絡。承擔這一角色的節點一般需要固定的電源和一定的計算資源。 |
Unprovisioned Device | 未配網設備,還未加入藍牙Mesh網絡的設備。 |
Node | 節點,加入藍牙Mesh網絡的設備。 |
Provisioning | 配網過程,設備加入藍牙Mesh網絡的過程。 |
Low Power | 低功耗功能:功率受限的節點可能會利用低功耗特性來減少無線電接通時間并節省功耗。同時低功耗節點(LPN)可以與friend節點協同工作。 |
LPN | Low Power Node,低功耗節點。 |
Friend | 功率不受限的節點很適合作為Friend節點。Friend節點能夠存儲發往低功耗節點(LPN)的消息和安全更新;當低功耗節點需要時再將存儲的信息傳輸至低功耗節點。 |
GLP | Genie Low Power,精靈低功耗方案。 |
NetKey | 藍牙Mesh網絡中用于區分不同網絡的關鍵密鑰。 |
AppKey | 藍牙Mesh網絡中用于區分同一網絡中不同應用的關鍵密鑰。 |
PB-ADV | 一種通過藍牙Mesh beacon給Mesh設備進行配網的交互方式。 |
PB-GATT | 一種通過藍牙GATT給Mesh設備進行配網的交互方式。 |
Mesh網關 |
|
基本要求
藍牙Mesh設備必須支持PB-ADV、PB-GATT。
藍牙Mesh設備必須支持Mesh協議里定義的Proxy功能。
非低功耗藍牙Mesh設備必須支持Mesh協議里定義的Relay功能,并且可以被正確打開和關閉。
LPN和Friend功能可選。
低功耗控制類設備(例如支持開關屬性,支持下行控制)采用精靈低功耗(GLP)方案。
藍牙Mesh設備要求至少支持1個NetKey、2個AppKey。
特殊產品如果僅需支持部分功能將在產品規范中明確說明具體需要支持的功能。
UUID格式
UUID應用于Unprovisioned Device Beacon廣播和PB-GATT廣播中。廣播包中的Device UUID是識別設備的關鍵信息,UUID中各字段采用小端模式進行存儲,對Device UUID的定義如下表所示。
字段 | size(字節數) | 描述 |
CID | 2 | Company Identifier,公司標識符。阿里巴巴的標識符為0x01A8。 |
PID | 1 |
|
ProductID | 4 | 生活物聯網平臺頒發,一型一號。 |
MAC地址 | 6 | 生活物聯網平臺頒發,一機一號,藍牙Mesh設備的MAC地址與Device Name一致。 |
FeatureFlag | 1 |
|
FeatureFlag1 | 1 |
|
FeatureFlag2 | 1 |
|
上表中的RFU保留字段和要求置0的字段必須全部置為0。在產品生命周期中,當產品的ProductID、MAC地址未變化時,CID、PID不允許發生變化。
對于UUID版本號為1時,FeatureFlag2是作為RFU字段使用的,由于歷史原因,存在很多不規范的臟數據,因此不作為Mesh新特性標志位的使用,對于UUID版本號為2時,FeatureFlag2是作為Mesh新特性標志位來使用。
Genie Mesh SDK獲取與對接的聯系方式請參見獲取SDK。
藍牙Mesh廣播包格式
未配網廣播 Unprovisioned Device Beacon
藍牙Mesh設備上電后如處于未配網狀態,需要廣播Unprovisioned Device Beacon,每次廣播時長不小于120ms,廣播間隔500ms,廣播持續時間一般為10分鐘,具體產品的廣播啟動方式和廣播持續時間以產品需求為準。如果超時后仍未被配網,設備關閉PB-ADV廣播。
未配網廣播數據示例如下:
0x14
0x2B
0x00
A8 01 71 81 02 00 00 55 43 CB 07 DA 78 02 00 00
0x00
0x00
Mesh Beacon
Unprovisioned Device beacon
Device UUID
OOB Information
Length
Type
Beacon Type
Beacon Data
Advertising data header
Advertising data payload
PB-GATT廣播
不支持PB-ADV的設備,如手機,需要先和節點建立GATT連接,通過Mesh Provisioning Service通信。因此建立GATT連接之前,設備需要廣播PB-GATT的廣播包。GATT廣播包中的UUID也同樣參照UUID格式。PB-GATT廣播數據格式參考Mesh Profile Specification。
PB-GATT廣播發送規則參照BLE廣播發送規則,每次廣播間隔建議100ms~160ms。
AIS廣播
AIS廣播請參考藍牙BLE基礎規范。
AIS廣播發送規則參照BLE廣播發送規則,每次廣播間隔建議100ms~160ms。
Proxy廣播
Proxy廣播數據格式參考Mesh Profile Specification。
Proxy廣播發送規則參照BLE廣播發送規則,每次廣播間隔建議100ms~160ms。
廣播包發送規則
設備狀態與切換規則
設備狀態包括未配網廣播狀態、配網狀態、已配網狀態。
當未配網設備上電后,設備需要進入未配網廣播狀態;廣播持續時間默認10分鐘,具體產品的廣播啟動方式和廣播持續時間以產品需求為準。
如果設備通過App解除配網,或者設備通過硬件復位方式清除配網信息(包括Mesh網絡信息、心跳配置、組播配置)后,設備需要重新進入未配網廣播狀態。
當設備響應連接建立請求(回復link ack或者通過PB-GATT建立連接)后,設備進入配網狀態。
當設備完成配網流程(以Provision完成配置為標志事件)則進入已配網狀態;否則恢復至未配網廣播狀態。
未配網廣播狀態
當設備處于未配網廣播狀態時,設備需要同時廣播Unprovisioned Device Beacon、PB-GATT廣播、AIS廣播。
配網狀態
設備同一時間只允許建立一個配網連接(Mesh或者GATT)。當設備處于配網狀態,停止廣播Unprovisioned Device Beacon及其他GATT廣播包。
已配網狀態
當設備處于已配網狀態,要求設備不再響應配網連接建立請求,并同時發送proxy廣播和AIS廣播。
配網流程
藍牙Mesh設備配網流程遵循藍牙Mesh標準的Provisioning流程,其中幾個使用自定義數據的步驟描述如下。
Provisioning Capabilities階段。
藍牙Mesh設備在Provisioning Capabilities階段提供OOB(Out of Band)方式,要求唯一支持Static OOB方式,其中的AuthValue計算過程如下:
擴展AuthValue標志位取值
AuthValue計算方法
0
AuthValue = SHA256(Product ID,MAC,Secret)
前16字節1
AuthValueProvisioner = SHA256(ProductID,MAC,Secret,RandomProvisioner)
前16字節,AuthValueDevice = SHA256(ProductID,MAC,Secret,RandomDevice)
前16字節即將設備證書的ProductID,MAC,Secret,配網過程中的隨機數通過字符串用英文逗號連接,然后進行SHA256摘要計算,取前16字節。注意這里用于計算SHA256的英文字母全部為小寫。注意自有品牌項目擴展AuthValue標志位必須為1。
擴展AuthValue標志位為0時的SHA256計算示例如下:
數據字段
數據格式與示例
計算使用的輸入字符串
Product ID
十進制數值:168930,對應十六進制數值:0x293e2
"000293e2"
MAC地址
"AB:CD:F0:F1:F2:F3"(掃描到的藍牙設備MAC地址)
"abcdf0f1f2f3"
Device Secret
"53daed805bc534a4a93c825ed20a7063"
"53daed805bc534a4a93c825ed20a7063"
連接后字符串Device
"000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063"
SHA256結果輸出(HEX)
c1c76741553236fb7da0a586e62298c231dac2885e735feba6b8b4417c 7d9e72
AuthValue(HEX)
c1c76741553236fb7da0a586e62298c2
擴展AuthValue標志位為1時的SHA256計算示例如下:
數據字段
數據格式與示例
計算使用的輸入字符串
Product ID
十進制數值:168930,對應十六進制數值:0x293e2
"000293e2"
Mac Address
"AB:CD:F0:F1:F2:F3"(掃描到的藍牙設備MAC地址)
"abcdf0f1f2f3"
Secret
"53daed805bc534a4a93c825ed20a7063"
"53daed805bc534a4a93c825ed20a7063"
RandomDevice
"7889b0af417b967bdcd7b814d2bbffaf"
"7889b0af417b967bdcd7b814d2bbffaf"
RandomProvisioner
"aa484b099ae4c7762fcb1b71968ba7df"
"aa484b099ae4c7762fcb1b71968ba7df"
連接后字符串Device
"000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063,7889b0af417b967bdcd7b814d2bbffaf"
SHA256結果輸出Device(HEX)
0f66e504a5d3609c06db70162345a0375d9b9d71d4cbe346a1c55d5c25738329
AuthValueDevice(HEX)
0f66e504a5d3609c06db70162345a037
連接后字符串Provisioner
"000293e2,abcdf0f1f2f3,53daed805bc534a4a93c825ed20a7063,aa484b099ae4c7762fcb1b71968ba7df"
SHA256結果輸出Device(HEX)
f45f15d1e38339b79fda5b63c3970ff01ba40285fe20b303ff332f54f8de729c
AuthValueDevice(HEX)
f45f15d1e38339b79fda5b63c3970ff0
Provisioning Confirmation階段。
這個階段,生活物聯網平臺和Mesh設備會使用Static OOB方式來做認證,如果生活物聯網平臺和Mesh設備兩邊計算得到的Confirmation值不相同,則認證失敗,結束流程。 Mesh協議在此階段中有一個步驟是設備端生成一個隨機數并發送給Mesh網關,Mesh網關會把這個隨機數發送給云端鑒權,生活物聯網平臺會保存設備端每次發送的隨機數,如果設備端發送的隨機數是之前使用過的,則平臺將會拒絕該設備配網,所以務必保證每次生成的隨機數都不重復。
Provisioning Data階段。
對于多Element設備,生活物聯網平臺在該階段只會下發Primary Element的Unicast Address。其余Element的Unicast Address則根據上一Element的地址自行增加1。
Provision完成配置階段。
生活物聯網平臺在Provisioning Complete之后,會下發AppKey。其余配置根據UUID版本有以下區別。
UUID版本
配置方式
0
生活物聯網平臺會下發一次主element的Config_Model_App_bind,設備需要返回成功的status,否則會配網失??;剩余model需要自行綁定AppKey。生活物聯網平臺會下發一次主element的Config_Model_Subscription_Add,設備需要返回成功的status,否則會配網失?。皇S鄊odel需要自行綁定Subscription Address。
1,2
生活物聯網平臺不會下發Config_model_app_bind和Config_Model_Subscrption_Add消息。IoT設備需要自行給所有Element的所有model綁定下發的AppKey,并根據產品類型為各個model訂閱相應的組播地址(具體品類組播地址請參閱各產品軟件規范)。藍牙Mesh設備完成配網后需要進行消息上報,上報消息包括該設備所有支持的可上報的屬性。
說明當前三方接入主要使用UUID版本1,版本0已不推薦使用。版本2僅限Genie Mesh SDK使用。
Mesh數據發送和接收
數據接收
通常情況下,我們建議設備端的scan window、interval、period分別為10ms、10ms、100ms。
數據發送
Mesh數據發包每次持續時間200ms左右,每次發包間隔20ms,每次打包向37、38、39三個廣播頻段同時發送數據。當發送長包時,每個分包數據按上述時序發送完畢后,即發送下一個分包數據。
當發送長包時,每個分包數據按上述時序發送200ms,當第一個分包數據發送完后馬上發送第二個分包數據,按次序發送分包數據后,根據需要可等待若干毫秒后進行重傳。重傳間隔不能小于400ms,建議按照重傳間隔=(200ms+100ms*TTL+200ms*分包數)來計算。發送數據TTL建議不大于5。
設備狀態上報
設備在屬性發生變化時,需要向Mesh網關的訂閱地址(0xF000)發送含狀態變化后相應屬性值的Vendor Message Attribute Indication消息或者Vendor Message Attribute Status消息。
當待上報的屬性值很重要(如安防報警消息),需要收到Mesh網關的回復才停止發送,可以發送Vendor Message Attribute Indication消息。
當設備需要周期上報屬性值時,一般發送Vendor Message Attribute Status消息,而非Vendor Message Attribute Indication消息。
如部分上報消息對業務邏輯影響不大(如設備固件版本號等),建議發送Vendor Message Attribute Status消息。
Vendor Message Attribute Indication消息發包規則
發送Indication消息,之后打開scan,如果在重傳間隔內(參考Mesh數據發送和接收中關于重傳間隔的約定)收到Mesh網關回復的Vendor Message Attribute Confirmation消息,則停止發送,否則可以重發若干次直到收到Confirmation消息。
Vendor Message Attribute Status消息發包規則
注意減少不必要的消息發送,對業務邏輯影響不大的消息,控制重發次數。
如果設備需要周期上報屬性值,注意周期需要在幾十秒以上的量級,最好是發送周期可以動態調整。
無周期屬性上報的設備的屬性同步
當設備接收到下行的控制指令時,首先按照協議規定回復對應的狀態消息;如果此時設備狀態發生了變化,則通過Indication再次上報設備狀態。具體交互流程可參照下圖。
有周期屬性上報的設備的屬性同步
當設備接收到下行的控制指令時,首先按照協議規定回復對應的狀態消息;如果此時設備狀態發生了變化,則等待下一個上報周期到時再上報設備狀態。具體交互流程可參照下圖。
設備主動上報場景
當設備狀態因為其他原因(用戶直接操作設備、設備達到一定條件等其他因素后)發生改變時,設備需要通過發送Vendor Message Attribute Indication消息或者Vendor Message Attribute Status消息,主動上報設備當前的狀態(僅上報改變的具體某一狀態,不需要上報設備所有屬性)。當某些設備需要周期性持續上報狀態時(比如溫濕度傳感器,缺水狀態上報,材料短缺上報等),此類消息上報的周期需要大于30秒(上報內容根據業務場景由各設備自行決定,原則上上報的數據越少越好);如上報頻率過高,可能會導致該產品上行鏈路被限制。
設備seq規則
藍牙Mesh設備需要區分不同單播地址的seq,建議支持至少10個unicast address的seq存儲,各地址的seq在設備上電期間要求保持連續更新。
多element設備重新配網,建議保存配網前各地址的seq,并在重新配網后恢復使用。
TID規范
當Mesh消息中包含TID字段(如Generic OnOff Set指令、Vendor Message Attr Set指令等)時,需要遵守以下規則。
所有有關聯的業務使用相同的TID,比如設備接收到設置或查詢指令時,設備回復到狀態消息的TID(如果有)必須與下行到設置或查詢指令中包含到TID一致。
設備主動上行使用的TID范圍為128~191(0x80~0xBF)。
當Mesh設備收到一條發送給本設備(或本設備屬于目標組)時,記錄該TID;如果設備在6秒內收到相同TID的消息,忽略后收到的消息(需要回復對應的狀態消息,但業務層面不處理該消息);被記錄的TID在6秒后丟棄。
當消息當目標設備不是本設備(或本設備不屬于目標組)時,忽略該消息,并且不記錄TID。
組播地址
藍牙Mesh設備每個element要求至少支持8個組播地址。當藍牙Mesh設備收到增加組播地址訂閱配置消息(Config Model Subscription Add Message)時發現該element存儲的組播地址已滿時,需按照Mesh Profile Specification丟棄新增加的組播地址,并在組播地址訂閱配置狀態消息(Config Model Subscription Status Message)中Status Code字段返回錯誤碼0x05(Insufficient Resources)。
設備默認品類組播地址參考設備組播地址中的定義,設備需要在Provision完成配置階段將設備上所有element的所有model與相應的組播地址進行綁定。
用戶在配置設備位置、別名時,生活物聯網平臺會修改設備的組播地址訂閱;在該過程中,生活物聯網平臺會對設備上某個element的其中一個model進行增加或刪除組播地址訂閱配置(Config Model Subscription Add/Config Model Subscription Delete),設備需要將接收到的組播地址的配置(增加或刪除)同步至該element上所有的model。
心跳功能
藍牙Mesh設備要求支持heartbeat功能,具體配置消息參考Mesh Profile Specification。
對于支持心跳功能的設備,將會通過給設備主elemet配置心跳設置參數進行設置。要求設備能嚴格按照所配置的參數發出對應的心跳包,發包規則參考Mesh數據發送和接收。
當心跳參數中對應的心跳包發送次數為無限次時,設備需要保存該心跳參數,在設備斷電或重啟后,重新加載該心跳參數。
通用開關服務模型
支持開關功能(powerstate屬性)的設備都必須支持通用開關服務模型(Generic On Off Server Model)。
通用開關服務模型詳細的消息格式定義請參考Mesh Model Specification。
設備需要實現對獲取開關狀態指令(Generic OnOff Get,Opcode 0x8201)的處理與響應,回復開關狀態消息(Generic OnOff Status,Opcode 0x8204)。在回復開關狀態消息時,只填充必選字段當前開關狀態,不填充可選字段目標開關狀態與剩余時間(作為生活物聯網平臺Mesh規范預留字段)。
字段
字段長度
備注
Opcode
2
0x82 0x04
當前開關狀態(必選)
1
設備當前開關狀態
目標開關狀態(不填充)
1
設備目標開關狀態
剩余時間(不填充)
1
設備切換到目標狀態還剩余的時間
IV Index Update
為保證生活物聯網平臺Mesh設備能夠長時間穩定運行,對于的IV index update過程中做了如下要求。
模組在seq number達到0xB0E500的時候開始進行IV Index Update流程。
由于很多低功耗設備會一直處于睡眠或斷電狀態,無法進行計時,所以我們要求忽略協議里規定的入網96小時之后才能進行IV index update和Recovery的時間限制。
要求如果設備在返回網絡后收到第一個secure network beacon的IV index等于當前設備的IV index+1且IV Update Flag為0,應選擇直接進行IV Index update,而不應忽略Secure Network Beacon。
對于需要長時間休眠的低功耗設備,為了防止無法接收到IV更新信息,要求設備至少每48小時喚醒一次,且進行至少15秒及以上的連續掃描。
設備上電與重啟規范
藍牙Mesh設備上電后需要延遲隨機0~10秒后發送Vendor Message Attribute Indication消息或者Vendor Message Attribute Status消息,上報消息包括該設備所有支持的可上報的屬性(必選)和上電事件(可選),注意需要把設備屬性和上電消息分開上報,先上報設備屬性,再上報上電事件。設備上電事件示例如下。
0xD4
0xA8
0x01
0x80
0x09
0xF0
0x03
Opcode
TID
Attr Name
Event
0xD401A8
0x80
事件上報
設備上電
藍牙Mesh設備重啟規范參照設備上電規范,將設備重啟視作設備上電。
設備復位規范
在設備復位后,再次進行配網時,要求設備在Provision完成配置階段按照各產品規范中定義的默認配置重新配置組播。當設備進行復位時,設備根據各產品規范決定是否刪除設備應用配置信息(比如風扇的開關狀態,冰箱設置的各區域溫度等應用層面的配置)。當設備進行復位時,如果存在GATT鏈接,要求斷開所有GATT連接。
軟件復位(解除配網)
藍牙Mesh設備需要支持通過Config Node Reset的軟復位的方法來移除節點,當設備進行軟件復位的時候,移除設備上保存的配網信息,設備進入未配網廣播狀態。同時根據各產品特性決定是否刪除設備配置信息。如果在軟件復位過程中需要重啟設備,則要求此時盡可能不影響設備正常工作。
硬件復位(恢復出廠設置)
藍牙Mesh設備通過硬復位恢復模塊出廠設置時,需要移除設備上保存的配網信息,設備進入未配網廣播狀態。藍牙Mesh設備進行硬件復位時,首先需要通過Vendor Message Attribute Indication消息上報硬件復位事件,當完成上報后(如上報消息未收到對應的回復,要求上報時間至少持續3秒)再進行硬件復位動作(刪除配網信息、進入未配網廣播狀態等動作)。
0xD4
0xA8
0x01
0x80
0x09
0xF0
0x23
Opcode
TID
Attr Name
Event
0xD401A8
0x80
事件上報
硬件復位
OTA升級
模組需要根據自身產品形態支持通過BLE OTA升級。具體請參看藍牙BLE OTA規范。
精靈低功耗(GLP)
如果模組要應用于下行數據接收的低延時低功耗設備(例如單火開關,電池供電的窗簾電機)時,可以采用精靈低功耗(Genie Low Power)方案,在開放平臺上創建產品時在屬性里選擇精靈低功耗,這樣精靈在給這個設備發送數據的時候,會在1.2s的時間內持續不斷地發送數據。所以設備只需要每1.2s醒來60ms,可以在低功耗的情況下能及時接收到精靈下發的數據。
相比LPN方案需要低功耗節點與Friend節點需要建立連接,精靈低功耗的方案無需建立連接,并且休眠和激活的占空比是固定的,可以精確的計算出設備的待機功耗。
自定義低功耗
如果模組要應用于上行數據上傳的低功耗設備(例如電池類門磁、紅外傳感器等)時,可以采用自定義低功耗方案,在開放平臺上創建產品時在屬性里選擇自定義低功耗,可以根據設備需求自定義數據上報方案,例如觸發上報或者自定義的定時上報等,用戶可以基于標準協議進行對應的上報方案修改。需要注意的是,如果采用自定義低功耗,設備無法與精靈實時保持連接,精靈下發的信息也無法觸達到設備端,設備端上報的信息可以觸達精靈,這是跟精靈低功耗GLP的重要區別。