準(zhǔn)備
1)nRF52840 Dongle
2)Mesh節(jié)點(diǎn)
3)手機(jī)作為配網(wǎng)器(蘋(píng)果手機(jī)安裝nRF Mesh APP)
說(shuō)明
1)節(jié)點(diǎn)使用的例程目錄:nrf5sdkformeshv500src\examples\light_switch\client
2)抓包使用的軟件:Wireshark
3)抓包方法:使用Nordic的nRF52840 Dongle配合Wireshark對(duì)藍(lán)牙設(shè)備抓包(BLE)
配置
先打開(kāi)Wireshark,這時(shí)候能收到節(jié)點(diǎn)的未配網(wǎng)設(shè)備信標(biāo),在Device一欄選擇自己的節(jié)點(diǎn),避免抓到無(wú)效的數(shù)據(jù)。
在Debug模式下可以通過(guò)MCU寄存器看到設(shè)備地址,對(duì)應(yīng)例程advertiser.c中的advertiser_address_default_get()函數(shù):
然后通過(guò)set_gap_addr_type()函數(shù)修改之后就是實(shí)際的設(shè)備地址。
nRF Mesh APP的Settings中先使用Forget Network復(fù)位Mesh網(wǎng)絡(luò),然后在Applications Keys中生成自己需要數(shù)量的Appkey。
配置手機(jī)(既是節(jié)點(diǎn),也是配網(wǎng)器)主元素的通用開(kāi)關(guān)服務(wù)器模型訂閱和發(fā)布地址如下:
通過(guò)手機(jī)(配網(wǎng)器)配置使未配網(wǎng)設(shè)備成為Mesh節(jié)點(diǎn),配置其第二個(gè)元素通用開(kāi)關(guān)客戶端模型訂閱和發(fā)布地址如下:
配置完成后如下:
另外說(shuō)一下,只要不使用Forget Network復(fù)位Mesh網(wǎng)絡(luò),那么新配置的節(jié)點(diǎn)單播地址自動(dòng)往上增加。這個(gè)時(shí)候通過(guò)按下按鍵發(fā)送Mesh消息,可以在Wireshark中抓到包:
可以看到網(wǎng)絡(luò)層PDU因?yàn)榻?jīng)過(guò)加密和混淆處理,是看不到具體的數(shù)據(jù)的。
網(wǎng)絡(luò)層PDU字段定義:
網(wǎng)絡(luò)層PDU格式:
所以在抓到的包里面可以看到網(wǎng)絡(luò)層PDU由IVI,NID,Obfuscated,Encrypted data和NetMIC組成。
過(guò)濾
通過(guò)Wireshark抓到的包比較多,輸入(pbadv)||(provisioning)||(btmesh)||(beacon)可以對(duì)數(shù)據(jù)進(jìn)行過(guò)濾。
解密
在抓到的Mesh包右鍵→協(xié)議首選項(xiàng)→Bluetooth Mesh→Mesh Keys,然后輸入當(dāng)前使用的NetKey和AppKey。
NetKey和AppKey可以通過(guò)App的Settings中獲?。?br>
同樣也可以輸入設(shè)備密鑰DevKey,SRC Address輸入的是設(shè)備的單播地址。
DevKey和SRC Address可以通過(guò)App的Network中選擇對(duì)應(yīng)節(jié)點(diǎn)獲取:
分析
經(jīng)過(guò)上面的處理,就可以對(duì)Mesh消息進(jìn)行分析。
以上面這條消息為例,可以看到消息的序列號(hào)是20,源地址是4,目的地址是1,節(jié)點(diǎn)的單播地址是0x0003,所以它第二個(gè)元素的單播地址就是0x0004,手機(jī)(配網(wǎng)器)的單播地址是0x0001,所以其主元素的單播地址就是0x0001,這樣就知道這條Mesh消息的流向。
訪問(wèn)層的操作碼是0x8202,參數(shù)是0009010a。其中操作碼為Generic OnOff Set,這個(gè)是SIG官方定義的:
通用開(kāi)關(guān)模型的字段定義:
那么這條消息的意思就是開(kāi)關(guān)狀態(tài)設(shè)置為關(guān),事務(wù)ID為0x09,漸變時(shí)間是0x01,延遲是0x0a。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-696087.html
TID:可以在應(yīng)用層判斷消息是否重復(fù),每傳輸一次消息,TID的值就會(huì)增加1。在例程中的按鍵事件處理函數(shù)button_event_handler()中可以看到:
至于Transition Time和Delay參數(shù),如果Transition Time參數(shù)存在,那么Delay參數(shù)也應(yīng)該存在,如果Transition Time參數(shù)不存在,那么Delay參數(shù)也不應(yīng)該存在。
漸變時(shí)間表示一個(gè)設(shè)備從一個(gè)狀態(tài)轉(zhuǎn)換為另一個(gè)狀態(tài)的時(shí)間,長(zhǎng)度1字節(jié),低6位表示漸變時(shí)間的具體數(shù)值,高2位表示漸變時(shí)間的步長(zhǎng),字段定義如下:
其中漸變時(shí)間的具體數(shù)值,取值范圍0x00至0x3E,定義如下:
漸變時(shí)間的步長(zhǎng)定義如下:
根據(jù)抓到的包中值0x01,則步長(zhǎng)為100ms,數(shù)值為0x01,結(jié)果為100ms;而延遲時(shí)間默認(rèn)的步長(zhǎng)是5ms,抓到的包中值0x0a,那么延遲時(shí)間就是50ms,和例程中定義的一致。
由于二進(jìn)制狀態(tài)不支持漸變,當(dāng)轉(zhuǎn)換為0x01 (On)時(shí),轉(zhuǎn)換開(kāi)始時(shí)立即改變Generic OnOff狀態(tài),當(dāng)轉(zhuǎn)換為0x00 (Off)時(shí),漸變時(shí)間結(jié)束時(shí)改變狀態(tài)。我的理解就是可以通過(guò)漸變時(shí)間來(lái)控制燈延時(shí)熄滅,當(dāng)關(guān)燈時(shí),燈狀態(tài)改變的時(shí)間比開(kāi)燈時(shí)狀態(tài)改變的時(shí)間多出來(lái)一個(gè)漸變時(shí)間。
當(dāng)轉(zhuǎn)換為0x01 (On)時(shí):
當(dāng)轉(zhuǎn)換為0x00 (Off)時(shí):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696087.html
到了這里,關(guān)于基于nRF52840 Dongle配合Wireshark對(duì)Mesh網(wǎng)絡(luò)抓包并解析(Nordic)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!