這里是關(guān)于第三篇藍(lán)牙m(xù)esh相關(guān)的文章廓译,該寫(xiě)什么瓷蛙?有三個(gè)東西可以寫(xiě):1.藍(lán)牙m(xù)esh中的節(jié)點(diǎn) 2.藍(lán)牙m(xù)esh中的專業(yè)術(shù)語(yǔ) 3.藍(lán)牙m(xù)esh協(xié)議棧邻悬。經(jīng)過(guò)反復(fù)思考验庙,基于對(duì)新了解藍(lán)牙m(xù)esh網(wǎng)絡(luò)朋友的角度出發(fā),還是覺(jué)得應(yīng)該寫(xiě)藍(lán)牙m(xù)esh協(xié)議棧邮破。因?yàn)樯弦黄v的是藍(lán)牙m(xù)esh的網(wǎng)絡(luò)拓?fù)湔┩悖饕撬{(lán)牙m(xù)esh 相關(guān)的概念,在上一篇的基礎(chǔ)上再講這一篇抒和,下一篇再講藍(lán)牙m(xù)esh中的專業(yè)術(shù)語(yǔ)矫渔,這個(gè)學(xué)習(xí)路徑相對(duì)簡(jiǎn)單與輕松。
藍(lán)牙m(xù)esh協(xié)議棧摧莽,準(zhǔn)確來(lái)講是由兩個(gè)部分組成庙洼。配網(wǎng)協(xié)議和節(jié)點(diǎn)消息發(fā)送協(xié)議(七層網(wǎng)絡(luò)系統(tǒng)架構(gòu))。
如果將藍(lán)牙m(xù)esh協(xié)議棧,等同于7層網(wǎng)絡(luò)協(xié)議油够,這是不準(zhǔn)確的蚁袭。為什么這么說(shuō)?在前一篇中講到石咬,設(shè)備在未加入網(wǎng)絡(luò)前叫未配網(wǎng)設(shè)備揩悄,加入網(wǎng)絡(luò)后叫做節(jié)點(diǎn)。這個(gè)過(guò)程叫做配網(wǎng)流程鬼悠。而實(shí)現(xiàn)這個(gè)配網(wǎng)流程的是配網(wǎng)協(xié)議删性,而不是7層網(wǎng)絡(luò)架構(gòu)。所以可以這么說(shuō)焕窝,設(shè)備配網(wǎng)成功前使用的是配網(wǎng)協(xié)議蹬挺,設(shè)備配網(wǎng)成功后,使用的是七層網(wǎng)絡(luò)協(xié)議它掂。我們?cè)诮佑|藍(lán)牙m(xù)esh的第一個(gè)操作巴帮,那絕對(duì)是將設(shè)備配網(wǎng),如果你不知道配網(wǎng)協(xié)議虐秋,那就悲劇了榕茧。
配網(wǎng)協(xié)議
首先,看一下配網(wǎng)協(xié)議熟妓,由3個(gè)層組成:1雪猪、承載層(Bearer) 2、傳輸層(Transport) 3起愈、配網(wǎng)協(xié)議層(Provisioning Protocol)
配網(wǎng)協(xié)議的承載層跟7層網(wǎng)絡(luò)架構(gòu)的承載層差不多是一樣的只恨,都是使用BLE的廣播或者GATT連接進(jìn)行數(shù)據(jù)交互,但是在服務(wù)和特性抬虽,以及消息數(shù)據(jù)報(bào)上有細(xì)微的區(qū)別官觅。
ProxyPDU在代碼中通常放在Network Layer里面合并處理,所以有的書(shū)籍或者文章中阐污,將配網(wǎng)協(xié)議的前兩層用七層架構(gòu)的前兩層進(jìn)行描述休涤。但Provisioning Protocol在藍(lán)牙m(xù)esh中是唯一,在代碼中要單獨(dú)處理笛辟。配網(wǎng)協(xié)議和配網(wǎng)流程的每個(gè)步驟功氨,后面的文章中再做詳細(xì)的解讀。
代理功能:為了兼容舊的不支持藍(lán)牙m(xù)esh廣播包傳播的設(shè)備(比如手機(jī))手幢,具備代理功能的設(shè)備可以與舊設(shè)備建立低功耗藍(lán)牙GATT連接捷凄,在mesh廣播數(shù)據(jù)包和mesh GATT連接數(shù)據(jù)包之間轉(zhuǎn)換,支持代理功能的節(jié)點(diǎn)被稱為代理節(jié)點(diǎn)(Proxy Node)围来。(如果暫時(shí)對(duì)手機(jī)不支持藍(lán)牙m(xù)esh廣播包傳輸這句話不理解的朋友跺涤,我會(huì)在后面的文章中給出解釋)
在上一篇中顾复,有提到過(guò)這個(gè)問(wèn)題寸潦。為什么手機(jī)不支持藍(lán)牙m(xù)esh廣播包瑟慈?如果熟悉BLE的朋友肯定知道将谊,手機(jī)既可以做主機(jī)搜索附近的設(shè)備,也可以做從機(jī)院刁,向四周發(fā)送廣播信號(hào)糯钙。但是這里說(shuō)的廣播包是指藍(lán)牙m(xù)esh協(xié)議中的配網(wǎng)廣播包,手機(jī)在出廠的時(shí)候并不會(huì)把mesh協(xié)議自帶到系統(tǒng)里面退腥。我們?cè)诎咽謾C(jī)當(dāng)成從機(jī)超营,向外廣播時(shí),是我們自己定義的廣播內(nèi)容阅虫,手機(jī)只是有這個(gè)通道。這也是為什么手機(jī)APP沒(méi)法通過(guò)廣播的形式對(duì)設(shè)備進(jìn)行配網(wǎng)的原因不跟,通道里面?zhèn)魇裁磧?nèi)容颓帝,需要我們自己定義。
手機(jī)APP實(shí)現(xiàn)配網(wǎng)流程一定是走代理協(xié)議建立GATT連接的方式窝革。因?yàn)樵谇耙黄姓f(shuō)過(guò)购城,整個(gè)藍(lán)牙m(xù)esh 是基于廣播和GATT連接這兩個(gè)核心,它只有這兩種方式虐译。對(duì)應(yīng)的是廣播承載器和GATT承載器瘪板,在后面講到承載層的時(shí)候,還會(huì)再詳細(xì)的講這個(gè)部分漆诽。
藍(lán)牙m(xù)esh協(xié)議棧的本質(zhì)
從藍(lán)牙1.0到藍(lán)牙5.0侮攀,每一個(gè)版本的出現(xiàn),只要手機(jī)支持厢拭,對(duì)應(yīng)的全部功能就可以使用兰英。但是藍(lán)牙m(xù)esh不是,藍(lán)牙m(xù)esh 是藍(lán)牙4.0后藍(lán)牙Sig發(fā)布的一套協(xié)議規(guī)范供鸠,并不是硬件能力相關(guān)的東西畦贸。所以,藍(lán)牙m(xù)esh協(xié)議棧的本質(zhì)是在藍(lán)牙BLE4.0或者BLE5.0版本基礎(chǔ)上建立的一個(gè)應(yīng)用程序楞捂,應(yīng)用層是藍(lán)牙m(xù)esh薄坏,底層是BLE4.0,或者BLE5.0寨闹。
節(jié)點(diǎn)消息七層網(wǎng)絡(luò)架構(gòu)
這里面的每一層胶坠,都足夠?qū)懸黄恼拢@里也不詳細(xì)的講解鼻忠。
模型層定義了用于標(biāo)準(zhǔn)化典型用戶場(chǎng)景操作的模型涵但,這些模型在藍(lán)牙m(xù)esh模型規(guī)范或其他更高的層規(guī)范中定義杈绸。更高層次模型規(guī)范的例子包括照明和傳感器模型。
通俗點(diǎn)講矮瘟,就是協(xié)議中的應(yīng)用層瞳脓,你可以根據(jù)自己的業(yè)務(wù)需求,按藍(lán)牙模型規(guī)范澈侠,制定符合自己業(yè)務(wù)需求的模型劫侧。
基礎(chǔ)模型層定義配置和管理mesh網(wǎng)絡(luò)所需的訪問(wèn)層狀態(tài)、消息和模型哨啃。
訪問(wèn)層定義了高層應(yīng)用程序如何使用上層傳輸層烧栋。它定義應(yīng)用程序數(shù)據(jù)的格式;它定義和控制在上層傳輸層執(zhí)行的應(yīng)用程序數(shù)據(jù)加密和解密;并且在將傳入的應(yīng)用程序數(shù)據(jù)轉(zhuǎn)發(fā)到更高的層之前,它會(huì)檢查是否在正確的網(wǎng)絡(luò)和應(yīng)用程序鍵的上下文中接收到了傳入的應(yīng)用程序數(shù)據(jù)拳球。
上層傳輸層對(duì)應(yīng)用程序數(shù)據(jù)進(jìn)行加密审姓、解密和身份驗(yàn)證,并提供訪問(wèn)消息的機(jī)密性祝峻。它還定義了如何使用傳輸控制消息來(lái)管理節(jié)點(diǎn)之間的上層傳輸層魔吐,包括由Friend特性使用時(shí)。
底層傳輸層定義了如何將上層傳輸層的消息分割并重新組裝成多個(gè)底層傳輸層的pdu莱找,以將較大的上層傳輸層消息傳遞給其他節(jié)點(diǎn)酬姆。它還定義了一個(gè)單獨(dú)的控制消息來(lái)管理分割和重組。
網(wǎng)絡(luò)層定義如何向一個(gè)或多個(gè)元素處理傳輸消息奥溺。它定義了允許傳輸pdu由承載層傳輸?shù)木W(wǎng)絡(luò)消息格式辞色。網(wǎng)絡(luò)層決定是否中繼/轉(zhuǎn)發(fā)消息,接受它們作進(jìn)一步處理浮定,或拒絕它們相满。它還定義了網(wǎng)絡(luò)消息如何加密和身份驗(yàn)證。
承載層定義網(wǎng)絡(luò)消息如何在節(jié)點(diǎn)之間傳輸桦卒。定義了兩種承擔(dān)者雳灵,廣告承擔(dān)者和關(guān)貿(mào)總協(xié)定承擔(dān)者。將來(lái)可能會(huì)定義更多的承擔(dān)者闸盔。
藍(lán)牙m(xù)esh網(wǎng)絡(luò)中有一個(gè)比較讓人頭疼的問(wèn)題:數(shù)據(jù)大小端編碼問(wèn)題悯辙,什么是大小端?
大端編碼
當(dāng)多字節(jié)值定義為以“大端”發(fā)送時(shí),適用本節(jié)中的約定迎吵。例如躲撰,值0x123456應(yīng)以0x12、0x34和0x56(最高有效字節(jié)優(yōu)先)的形式傳輸击费。
小端編碼
當(dāng)多字節(jié)值定義為以“小端”發(fā)送時(shí)拢蛋,適用本節(jié)中的約定。例如蔫巩,值0x123456應(yīng)該以0x56谆棱、0x34和0x12的形式傳輸(最低有效字節(jié)優(yōu)先)快压。
一個(gè)字節(jié)的時(shí)候,大小端都是一樣垃瞧。
藍(lán)牙m(xù)esh 中的大小端規(guī)范
對(duì)于網(wǎng)絡(luò)層蔫劣、下層傳輸層、上層傳輸層个从、mesh beacons和Provisioning脉幢,所有多字節(jié)的數(shù)值都應(yīng)以大端方式發(fā)送。
對(duì)于訪問(wèn)層和基礎(chǔ)模型嗦锐,所有的多八位數(shù)值應(yīng)以小端序
大小端只是針對(duì)協(xié)議中的某個(gè)字段內(nèi)部嫌松,當(dāng)一個(gè)數(shù)據(jù)由多個(gè)字段組成時(shí),多個(gè)字段的位置不適用大小端的規(guī)則奕污。
2.1整個(gè)網(wǎng)絡(luò)的本質(zhì)
配網(wǎng)過(guò)程是比較無(wú)聊卻又不得不做的一個(gè)事情萎羔。假設(shè)一種場(chǎng)景,一棟樓里面有很多個(gè)燈碳默,管理員張三將網(wǎng)絡(luò)配置好后外驱,如何將網(wǎng)絡(luò)共享給員工李四管理。這里就有一個(gè)網(wǎng)絡(luò)分享的問(wèn)題腻窒,在第一部分的初步認(rèn)識(shí)部分提到過(guò)用JSON數(shù)據(jù),這個(gè)功能對(duì)應(yīng)到APP中就是網(wǎng)絡(luò)的導(dǎo)入與導(dǎo)出磅崭。
將這個(gè)JSON數(shù)據(jù)從一臺(tái)手機(jī)上導(dǎo)出后儿子,能在另一臺(tái)手機(jī)上操控整個(gè)網(wǎng)絡(luò),那么就說(shuō)明了整個(gè)網(wǎng)絡(luò)設(shè)置參數(shù)全部都在JSON數(shù)據(jù)中砸喻。從這個(gè)上帝視角上看柔逼,可以把Mesh網(wǎng)絡(luò)分成3個(gè)部分:(1)用戶的操作(2)JSON數(shù)據(jù) (3)協(xié)議。如果將Mesh網(wǎng)絡(luò)比作一個(gè)加工廠的話割岛,用戶的操作是原材料愉适,那協(xié)議就是流水線,而JSON數(shù)據(jù)就是流水線上機(jī)器的運(yùn)行參數(shù)癣漆。同樣的參數(shù)放在同樣機(jī)器上维咸,運(yùn)行結(jié)果是一樣的,所以JSON數(shù)據(jù)從一臺(tái)手機(jī)惠爽,共享到另外一臺(tái)手機(jī)癌蓖,對(duì)網(wǎng)絡(luò)的控制是一樣的。
那么JSON數(shù)據(jù)的內(nèi)容是什么呢婚肆,具體內(nèi)容看下圖:
對(duì)其中每個(gè)字段做一個(gè)簡(jiǎn)單的解釋:
meshUUID:每個(gè)網(wǎng)絡(luò)的唯一標(biāo)識(shí)符租副,程序自動(dòng)生成的加密隨機(jī)數(shù)。在網(wǎng)絡(luò)導(dǎo)入時(shí)较性,可能不是本網(wǎng)絡(luò)的信息用僧,所以需要通過(guò)這個(gè)唯一標(biāo)識(shí)符進(jìn)行過(guò)濾结胀。
Provisioners:配網(wǎng)器。通常來(lái)說(shuō)责循,弄一個(gè)配網(wǎng)器就夠了糟港。但配網(wǎng)器可以存在多個(gè),比如建立多個(gè)配網(wǎng)器實(shí)現(xiàn)不同的地址分配方式沼死、不同的地址區(qū)間着逐。但是同一時(shí)間只能有一個(gè)配網(wǎng)器處于激活狀態(tài)。
nodes:節(jié)點(diǎn)意蛀。網(wǎng)絡(luò)中存在幾個(gè)節(jié)點(diǎn)耸别,Nodes中就有幾個(gè)Object。
id:開(kāi)發(fā)者給網(wǎng)絡(luò)標(biāo)記的標(biāo)識(shí)符县钥。假如我們的APP秀姐,不想接受其他開(kāi)發(fā)者的網(wǎng)絡(luò)數(shù)據(jù),我們可以根據(jù)id對(duì)網(wǎng)絡(luò)進(jìn)行過(guò)濾若贮,在網(wǎng)絡(luò)導(dǎo)入時(shí)省有,只接收指定ID的數(shù)據(jù)。
groups:分組信息谴麦。將多個(gè)節(jié)點(diǎn)統(tǒng)一管理蠢沿,可根據(jù)場(chǎng)景自行設(shè)置。比如將客廳的幾個(gè)燈放在一組匾效,實(shí)現(xiàn)同時(shí)開(kāi)關(guān)燈舷蟀。
netKeys:網(wǎng)絡(luò)密鑰。應(yīng)用于網(wǎng)絡(luò)層的安全通信面哼。
$schema:表示該JSON Schema文件遵循的規(guī)范野宜。
version:版本號(hào)。
timestamp:最后一次修改網(wǎng)絡(luò)的時(shí)間魔策。
meshName:網(wǎng)絡(luò)名稱匈子。
appKey:應(yīng)用程序密鑰。應(yīng)用與上層傳輸層的安全通信闯袒。
總結(jié)虎敦,可以看出mesh網(wǎng)絡(luò)數(shù)據(jù)主要由(1)配網(wǎng)器(2)節(jié)點(diǎn) (3)分組 (4)密鑰 ; 這4個(gè)部分組成政敢。分別對(duì)應(yīng)到(1)設(shè)備加入網(wǎng)絡(luò)的過(guò)程(2)網(wǎng)絡(luò)中所有節(jié)點(diǎn)的信息(3)分組控制功能(4)安全通信原茅。
2.2 配網(wǎng)器與地址
這里是狹義上的配網(wǎng)器,代碼中的配網(wǎng)器堕仔,內(nèi)容如下:
從配網(wǎng)器的JSON數(shù)據(jù)中擂橘,我們可以看到配網(wǎng)器由5部分組成:(1)配網(wǎng)器名稱 (2)配網(wǎng)器唯一標(biāo)識(shí)符UUID (3)可分配單播地址的范圍 (4)可分配組播地址的范圍 (5)可分配虛擬地址的范圍。
配網(wǎng)器的主要功能就是分配地址摩骨,那在mesh網(wǎng)絡(luò)中通贞,地址是怎么定義的朗若?
網(wǎng)絡(luò)層定義了4種地址類型,地址長(zhǎng)度為16位昌罩。 如下圖: 單播地址范圍從0x0001到0x7FFF哭懈,可以有32767個(gè)單播地址。 虛擬地址范圍從0x8000到0xBFFF茎用,可以有16384個(gè)虛擬地址遣总。 組播地址范圍從0xC000到0xFFFF,可以有16384個(gè)組播地址轨功。組播地址包括256個(gè)固定組播地址和16128個(gè)可動(dòng)態(tài)分配的組播地址旭斥。
總結(jié),地址就是一個(gè)整數(shù)古涧,配網(wǎng)器確定如何給節(jié)點(diǎn)分配垂券。配網(wǎng)器只需要遍歷網(wǎng)絡(luò)中的節(jié)點(diǎn),就知道哪些地址已經(jīng)分配下去羡滑。如果需要重新分配一個(gè)地址菇爪,則分配一個(gè)沒(méi)使用過(guò)的地址就行。
2.3 節(jié)點(diǎn)
節(jié)點(diǎn)的信息并不是完全一致柒昏,可以從配網(wǎng)器節(jié)點(diǎn)和藍(lán)牙設(shè)備節(jié)點(diǎn)看出區(qū)別凳宙。左邊是配網(wǎng)器節(jié)點(diǎn),右邊是設(shè)備節(jié)點(diǎn)职祷。對(duì)所有屬性做簡(jiǎn)單的介紹氏涩。
features:如下圖,左邊是配網(wǎng)器節(jié)點(diǎn)的Features堪旧,右邊是設(shè)備節(jié)點(diǎn)的Features。proxy指代理功能奖亚,friend指朋友功能淳梦,relay指轉(zhuǎn)發(fā)功能,lowPower指低功耗功能昔字。4個(gè)功能都是3種狀態(tài)爆袍,0表示未開(kāi)啟,1表示已開(kāi)啟作郭,2表示不支持陨囊。舉個(gè)例子,APP中設(shè)置節(jié)點(diǎn)打開(kāi)或者關(guān)閉轉(zhuǎn)發(fā)功能夹攒,實(shí)際上就是改變對(duì)應(yīng)節(jié)點(diǎn)Feature特性中的relay字段蜘醋。
secureNetworkBeacon:用于讓藍(lán)牙m(xù)esh節(jié)點(diǎn)來(lái)明確子網(wǎng)狀態(tài)及自身的安全狀態(tài)。在IV Index Update以及Key Refresh過(guò)程中使用咏尝。
unicastAddress:節(jié)點(diǎn)的單播地址压语。
configComplete:節(jié)點(diǎn)的成分?jǐn)?shù)據(jù)是否配置完成啸罢。配網(wǎng)過(guò)程中,在未配網(wǎng)設(shè)備完成配網(wǎng)流程后胎食,有一個(gè)將設(shè)備信息加入到網(wǎng)絡(luò)的過(guò)程扰才,會(huì)從設(shè)備上獲取成分?jǐn)?shù)據(jù),并將一些網(wǎng)絡(luò)信息配置到節(jié)點(diǎn)上厕怜。比如當(dāng)前網(wǎng)絡(luò)的NetworkKey和APPKey等衩匣。
vid:version id,節(jié)點(diǎn)版本號(hào)粥航。
cid:Company Identifier琅捏,節(jié)點(diǎn)所用的藍(lán)牙芯片公司,在Sig注冊(cè)的標(biāo)識(shí)符躁锡。比如:奉加微的CID是0x0504午绳,對(duì)應(yīng)的公司名是PHYPLUS Inc。
DefaultTTL:默認(rèn)的轉(zhuǎn)發(fā)次數(shù)映之。消息在網(wǎng)絡(luò)中最多會(huì)被轉(zhuǎn)發(fā)多少次拦焚。
UUID:節(jié)點(diǎn)的唯一標(biāo)識(shí)符。
security:節(jié)點(diǎn)的安全等級(jí)杠输,有低(low)和高(high)兩種等級(jí)赎败,直接體現(xiàn)在TransMIC(傳輸?shù)南⑼暾詸z查)是使用32位還是64位,相差4字節(jié)蠢甲。在訪問(wèn)層PDU計(jì)算分包個(gè)數(shù)時(shí)僵刮,需要考慮到這個(gè)值到來(lái)的4字節(jié)的差異影響。
crpl:包含一個(gè)16位的值鹦牛,表示設(shè)備中重放保護(hù)列表項(xiàng)的最小數(shù)量搞糕。
blacklisted:當(dāng)節(jié)點(diǎn)正在被刪除的過(guò)程中,該標(biāo)志被設(shè)置為“true”曼追,并且在密鑰刷新過(guò)程中被排除在新的網(wǎng)絡(luò)密鑰分發(fā)之外;否則設(shè)置為false 窍仰。
pid:product id,產(chǎn)品ID礼殊,三元組之一驹吮,一機(jī)一號(hào)。
name:節(jié)點(diǎn)名稱晶伦。
deviceKey:設(shè)備密鑰碟狞,只有節(jié)點(diǎn)和配置客戶端知道的訪問(wèn)層密鑰。設(shè)備密鑰應(yīng)被綁定到節(jié)點(diǎn)已知的每個(gè)網(wǎng)絡(luò)密鑰婚陪。這些綁定不能被更改族沃。設(shè)備密鑰是三元組的元素之一Secret。設(shè)備密鑰主要用于配網(wǎng)、加密交換網(wǎng)絡(luò)密鑰等信息竭业,兩者之間傳輸內(nèi)容智润。
2.4 節(jié)點(diǎn)中的元素
elements:元素是節(jié)點(diǎn)中的可尋址實(shí)體。每個(gè)節(jié)點(diǎn)至少有一個(gè)元素未辆,即主元素窟绷,還可以有一個(gè)或多個(gè)附加的輔助元素。元素的數(shù)量和結(jié)構(gòu)是靜態(tài)的咐柜,在節(jié)點(diǎn)的整個(gè)生命周期內(nèi)不會(huì)改變(也就是說(shuō)兼蜈,只要節(jié)點(diǎn)是網(wǎng)絡(luò)的一部分)。
如上圖拙友,左邊是配網(wǎng)器節(jié)點(diǎn)为狸,包含兩個(gè)元素。包含主元素和一個(gè)輔助元素遗契。
右邊是藍(lán)牙設(shè)備節(jié)點(diǎn)辐棒,僅包含一個(gè)主元素的情況,未給元素命名牍蜂,右元素少了一個(gè)name屬性漾根。
主元素使用在配網(wǎng)期間分配給節(jié)點(diǎn)的第一個(gè)單播地址來(lái)尋址。每個(gè)附加的輔助元素都使用連續(xù)的后續(xù)地址進(jìn)行尋址鲫竞。這些單播元素地址允許節(jié)點(diǎn)識(shí)別節(jié)點(diǎn)中的哪個(gè)元素正在發(fā)送或接收消息辐怕。
如果元素的數(shù)量和結(jié)構(gòu)發(fā)生變化,例如由于固件更新从绘,必須重新配置節(jié)點(diǎn)寄疏。當(dāng)執(zhí)行固件更新時(shí)改變了元素的數(shù)量或結(jié)構(gòu)時(shí),使用節(jié)點(diǎn)移除過(guò)程僵井。
消息在模型中基于操作碼和元素地址分派陕截。
一個(gè)元素不允許包含以相同方式使用相同消息的模型的多個(gè)實(shí)例(例如,接收“On”消息)批什。當(dāng)同一元素中的多個(gè)模型使用相同的消息時(shí)农曲,這些模型被稱為“重疊”≡荆“為了在一個(gè)節(jié)點(diǎn)內(nèi)實(shí)現(xiàn)多個(gè)重疊模型的實(shí)例(例如朋蔫,控制多個(gè)可以打開(kāi)和關(guān)閉的燈具)罚渐,節(jié)點(diǎn)需要包含多個(gè)元素却汉。
2.5 節(jié)點(diǎn)中元素的模型
models:模型定義了節(jié)點(diǎn)的基本功能。一個(gè)節(jié)點(diǎn)可以包含多個(gè)模型荷并。模型定義了所需的狀態(tài)合砂,在這些狀態(tài)上操作的消息,以及任何相關(guān)的行為源织。
mesh應(yīng)用程序是使用客戶機(jī)-服務(wù)器體系結(jié)構(gòu)與發(fā)布-訂閱范例通信來(lái)指定的翩伪。模型的ModelID決定這個(gè)模型對(duì)應(yīng)什么功能微猖。
下圖是模型的結(jié)構(gòu),左邊是有訂閱分組缘屹,右邊是未訂閱
2.6 節(jié)點(diǎn)中的NetworkKeys和網(wǎng)絡(luò)中的NetworkKeys
節(jié)點(diǎn)中的netKeys:與節(jié)點(diǎn)綁定的networkKeys凛剥。單個(gè)netKey對(duì)象包括key的索引和更新?tīng)顟B(tài)。
右邊網(wǎng)絡(luò)中的NetKeys包含的是NetworkKey的完整信息轻姿。
phase:key刷新的階段犁珠,3種取值,0表示處于正常使用中互亮,1表示正在發(fā)布新key給所有節(jié)點(diǎn)犁享,2表示在發(fā)送網(wǎng)絡(luò)信標(biāo),確認(rèn)所有節(jié)點(diǎn)是否都有新key豹休。
minSecurity:與此網(wǎng)絡(luò)密鑰相關(guān)聯(lián)的子網(wǎng)的最低安全級(jí)別炊昆。如果子網(wǎng)中與此網(wǎng)絡(luò)密鑰相關(guān)聯(lián)的所有節(jié)點(diǎn)都已通過(guò)網(wǎng)絡(luò)進(jìn)行發(fā)放,則執(zhí)行安全發(fā)放步驟威根,那么子網(wǎng)的此屬性的值將設(shè)置為.high;否則凤巨,該值將被設(shè)置為.low,而子網(wǎng)則被認(rèn)為不太安全医窿。
key:在加密過(guò)程中實(shí)際使用的完整的密鑰內(nèi)容磅甩。
timestamp:最后一次修改的時(shí)間戳。
name:密鑰名稱姥卢。
index:密鑰索引卷要,在節(jié)點(diǎn)綁定的netKeys中,就是這個(gè)index独榴。通過(guò)這個(gè)index僧叉,再找到完整的密鑰內(nèi)容進(jìn)行加解密。
2.7 節(jié)點(diǎn)中的AppKey和網(wǎng)絡(luò)中的AppKeys
AppKeys:與節(jié)點(diǎn)綁定的ApplicationKeys棺榔。單個(gè)ApplicationKey對(duì)象包括key的索引和更新?tīng)顟B(tài)瓶堕。
appKeys必須綁定到NetworkKey上才能使用,AppKey是用于應(yīng)用層數(shù)據(jù)加解密症歇,應(yīng)用層的數(shù)據(jù)必須依托網(wǎng)絡(luò)層才能往下傳輸出去郎笆,所以在給節(jié)點(diǎn)綁定應(yīng)用秘鑰時(shí),必須要確定節(jié)點(diǎn)是否綁定了網(wǎng)絡(luò)密鑰忘晤,然后確定將應(yīng)用秘鑰綁定到哪個(gè)網(wǎng)絡(luò)密鑰宛蚓。那么應(yīng)用密鑰已經(jīng)包含了網(wǎng)絡(luò)密鑰的信息,在模型中選擇應(yīng)用秘鑰就可以知道设塔,數(shù)據(jù)在整個(gè)消息發(fā)送過(guò)程中凄吏,是如何進(jìn)行加解密操作。
boundNetKey:NetworkKey的索引。
2.8 NetworkTransmit和RelayRetransmit
NetworkTransmit:網(wǎng)絡(luò)傳輸狀態(tài)痕钢,用于控制節(jié)點(diǎn)發(fā)出網(wǎng)絡(luò)層PDU重傳的次數(shù)和時(shí)間點(diǎn)图柏。這個(gè)結(jié)構(gòu)體包含節(jié)點(diǎn)在網(wǎng)絡(luò)層中發(fā)送消息的原始參數(shù)。
RelayRetransmit:網(wǎng)絡(luò)中繼重傳狀態(tài)任连,用于控制網(wǎng)絡(luò)層收到消息后的中繼行為蚤吹。
count(UInt8):網(wǎng)絡(luò)層PDU重復(fù)發(fā)送的次數(shù),取值范圍是1至8随抠。這個(gè)count是指定時(shí)器重復(fù)發(fā)送的次數(shù)距辆,每發(fā)一次,count自減一暮刃,count為0時(shí)定時(shí)器停止跨算。
interval(UInt16):發(fā)布周期,單位為毫秒椭懊。定時(shí)器兩次數(shù)據(jù)發(fā)送的時(shí)間間隔诸蚕;發(fā)送周期 = 步長(zhǎng) x 步長(zhǎng)時(shí)間單位。步長(zhǎng)時(shí)間單位固定為10ms氧猬,所以發(fā)布周期的取值范圍為10ms至320ms背犯。
2.9分組
分組包含一個(gè)名稱,分組地址和父節(jié)點(diǎn)地址盅抚。目前不支持多層級(jí)分組功能漠魏,即分組中包含分組是不支持的。所以parentAddress都是0x0000妄均。