內(nèi)蒙古德明電子科技有限公司產(chǎn)品解決方案 聯(lián)系電話:15384841043張工
OTAA(Over-The-Air Activation),是LoRaWAN的一種空中入網(wǎng)方式。當node在上電的時候處于非入網(wǎng)狀態(tài)時,需要先入網(wǎng)才能和服務(wù)器進行通信。其操作就是node發(fā)送join_request message,請求入網(wǎng),然后服務(wù)器同意入網(wǎng),并且返回Join-accept message,node再對信息進行解析,獲取通信參數(shù),之后就可以和服務(wù)器通信了。
準備工作
node端在做OTAA入網(wǎng)之前,需要先具備三個參數(shù):
這些參數(shù)可以通過程序固話在里面,或者通過串口或其他方式在入網(wǎng)操作前告訴node。
當這些準備工作都做好了之后,node設(shè)備就能夠入網(wǎng)了。
1.node發(fā)起入網(wǎng)請求,也就是發(fā)送join_request message,
根據(jù)LoRaWAN specification 可知,join_request message的格式如下:
MHDR | APPEUI | DevEUI | DevNonce | MIC |
---|---|---|---|---|
1字節(jié) | 8字節(jié) | 8字節(jié) | 2字節(jié) | 4字節(jié) |
其中
字段 | 描述 |
---|---|
MHDR | 數(shù)據(jù)包頭,其中包含了數(shù)據(jù)包的類型,也就是說從這個包頭可以知道,這是一個join_request message |
APPEUI | 應(yīng)用EUI |
DevEUI | node的長地址,由node自己定義 |
DevNonce | 一個隨機數(shù),用來生成密碼 |
MIC | 4字節(jié)的校驗 |
需要注意的是Join_request message是未加密的
2.GW將此數(shù)據(jù)上傳至NS
GW對MAC層的數(shù)據(jù)不進行解析,而是直接將其進行base64編碼之后,封裝成JSON包上傳至NS,MAC層的數(shù)據(jù)位于rxpk.data
樣例數(shù)據(jù):
{
"rxpk": [
{
"tmst": 532505620,
"chan": 6,
"rfch": 0,
"freq": 471.9,
"stat": 1,
"modu": "LORA",
"datr": "SF12BW125",
"codr": "4/5",
"lsnr": -17,
"rssi": -81,
"size": 23,
"data": "AAEAACAAxSYsFhAWIAB3SgBUe0At4Zo="
}
]
}
此處,將data進行base64解碼,我們就可以看到MAC層數(shù)據(jù)了,因為join_request message數(shù)據(jù)是未加密的
data部分的內(nèi)容如下:
/x00 /x01 /x00 /x00 /x20 /x00 /xc5 /x26
/x2c /x16 /x10 /x16 /x20 /x00 /x77 /x4a
/x00 /x54 /x7b /x40 /x2d /xe1 /x9a
各部分的內(nèi)容分別為:
字段 | 內(nèi)容 |
---|---|
MHDR | /x00 |
AppEUI | /x01 /x00 /x00 /x20 /x00 /xc5 /x26 /x2c |
DevEUI | /x16 /x10 /x16 /x20 /x00 /x77 /x4a /x00 |
DevNonce | /x54 /x7b |
MIC | /x40 /x2d /xe1 /x9a |
3.NS向AS發(fā)送設(shè)備入網(wǎng)包
樣例數(shù)據(jù):
{
"join": {
"request": {
"frame": "AAEAACAAxSYsFhAWIAB3SgBUe0At4Zo"
}
}
}
將join.frame進行base64 解碼,得到的內(nèi)容為:
/x00 /x01 /x00 /x00 /x20 /x00 /xc5 /x26
/x2c /x16 /x10 /x16 /x20 /x00 /x77 /x4a
/x00 /x54 /x7b /x40 /x2d /xe1 /x9a
可以看到,原先的MAC 層的data數(shù)據(jù)沒有變化
4.AS同意入網(wǎng)并且向NS回復(fù)同意入網(wǎng)
樣例數(shù)據(jù):
{
"join": {
"moteeui": "4a770020161016",
"accept": true
}
}
5.NS生成MoteAddr,并將node端的信息發(fā)送給AS
樣例數(shù)據(jù):
{
"join": {
"appeui": "2c26c50020000001",
"moteeui": "4a770020161016",
"details": {
"moteaddr": "48000002",
"devicenonce": 31572
}
}
}
6.AS生成密鑰,并將相關(guān)信息告訴NS
樣例數(shù)據(jù):
{
"join": {
"moteeui": "4a770020161016",
"complete": {
"frame": "IPqAKXQ7LS/CmYVCDy8K3k4",
"networkkey": "de03331aeb4254e9727b6fafbf13db3d"
}
}
}
可以看到,networkkey直接發(fā)送給NS了,這也就是NwkSKey,之所以明文告訴NS,是因為:
1.NS不做解密的工作,所以不能通過APPKEY解密負載得到
2.networkkey在NS對上下行數(shù)據(jù)進行校驗的時候會使用到
7.NS將數(shù)據(jù)告訴GW,GW再轉(zhuǎn)換成MAC包,發(fā)送給node
樣例數(shù)據(jù):
{
"txpk": {
"tmst": 537505620,
"freq": 471.9,
"rfch": 0,
"powe": 14,
"modu": "LORA",
"datr": "SF12BW125",
"codr": "4/5",
"ipol": true,
"size": 17,
"data": "IPqAKXQ7LS/CmYVCDy8K3k4"
}
}
需要注意的是,此時的data部分是經(jīng)過base64編碼以及AES加密的,直接解碼,看到的數(shù)據(jù)是無效的,需要再進行解密,解密需要使用APPKEY,也就是之前介紹的APPKEY.
txpk.data部分就是LoRaWAN MAC的join_accept message.
8.node解析join_accept message 部分
根據(jù)LoRaWAN specification 可知,join_accept message的格式如下:
MHDR | AppNonce | NetID | DevAddr | DLSettings | RxDelay | CFList(pad16) | MIC |
---|---|---|---|---|---|---|---|
1字節(jié) | 3字節(jié) | 3字節(jié) | 4字節(jié) | 4字節(jié) | 1字節(jié) | 0/16字節(jié) | 4字節(jié) |
其中
字段 | 描述 |
---|---|
MHDR | 數(shù)據(jù)包頭,其中包含了數(shù)據(jù)包的類型,也就是說從這個包頭可以知道,這是一個join_accept message |
AppNonce | 3字節(jié)的unique ID,服務(wù)器生成的,產(chǎn)生AppSKey/NwkSKey 會用到 |
NetID | 網(wǎng)絡(luò)ID,產(chǎn)生AppSKey/NwkSKey 會用到 |
DevAddr | 設(shè)備的短地址 |
DLSettings | 設(shè)置RX1和RX2的下行接受串口的速率 |
RxDelay | 從發(fā)送完成到打開RX1接受串口的事件 |
CFList(pad16) | 我也不知道是什么,目前看到的都是0個字節(jié) |
MIC | 4字節(jié)的校驗 |
需要注意的是Join_accept message是加密的,需要使用APPKEY解密
txpk.data:
"data": "IPqAKXQ7LS/CmYVCDy8K3k4"
base64解碼:
/x20 /xfa /x80 /x29 /x74 /x3b /x2d /x2f
/xc2 /x99 /x85 /x42 /x0f /x2f /x0a /xde
/x4e
這個數(shù)據(jù)是未解密的,我們還需要解密
解密后為
/x20 /x43 /x75 /xcb /x24 /x00 /x00 /x02
/x00 /x00 /x48 /x03 /x00 /x82 /xc9 /xd0
/xf9
具體的情況如下:
字段 | 解密前 | 解密后 |
---|---|---|
MHDR | /x20 | /x20 |
AppNonce | /xfa /x80 /x29 | /x43 /x75 /xcb |
NetID | /x74 /x3b /x2d | /x24 /x0 /x0 |
DevAddr | /x2f /xc2 /x99 /x85 | /x2 /x0 /x0 /x48 |
DLSettings | /x42 | /x3 |
RxDelay | /x0f | /x0 |
CFList | ||
MIC | /x2f /x0a /xde /x4e | /x82 /xc9 /xd0 /xf9 |
可以看到,DevAddr為0x48000002,而AppSKey和NwkSKey無法直接看出來,需要再計算
計算公式如下:
聲明:本文內(nèi)容及配圖由作者撰寫及網(wǎng)上轉(zhuǎn)載。文章觀點僅代表作者本人,文章及其配圖僅供學(xué)習(xí)之用,如有內(nèi)容圖片侵權(quán)或者其他問題,請聯(lián)系本站作侵刪。