1.0

LoRaWAN_APB入网参数设置

2.0 OTAA入网

OTAA(Over-The-Air Activation),是LoRaWAN的一种空中入网方式。当node在上电的时候处于非入网状态时,需要先入网才能和服务器进行通信。其操作就是node发送join_request message,请求入网,然后服务器同意入网,并且返回Join-accept message,node再对信息进行解析,获取通信参数,之后就可以和服务器通信了。

APPEUI node自定义的8字节长地址
APPKEY 服务器和node端都事先存好,用于对Join_acept message 做加解密处理
DevNonce 2字节的随机数,用于生成随机的AppSKey和NwkSKey
这些参数可以通过程序固话在里面,或者通过串口或其他方式在入网操作前告诉node。

第一步
1.node发起入网请求,也就是发送join_request message,

根据LoRaWAN specification 可知,join_request message的格式如下:
| | |

| | |

MHDR APPEUI DevEUI DevNonce MIC
1字节 8字节 8字节 2字节 4字节

其中

字段 描述
MHDR 数据包头,其中包含了数据包的类型,也就是说从这个包头可以知道,这是一个join_request message
APPEUI 应用EUI
DevEUI node的长地址,由node自己定义
DevNonce 一个随机数,用来生成密码
MIC 4字节的校验
需要注意的是Join_request message是未加密的

第二步
2.GW将此数据上传至NS

GW对MAC层的数据不进行解析,而是直接将其进行base64编码之后,封装成JSON包上传至NS,MAC层的数据位于rxpk.data

样例数据:

{
“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层数据了,因为join_request message数据是未加密的

data部分的内容如下:

\x00 \x01 \x00 \x00 \x20 \x00 \xc5 \x26
\x2c \x16 \x10 \x16 \x20 \x00 \x77 \x4a
\x00 \x54 \x7b \x40 \x2d \xe1 \x9a
各部分的内容分别为:

字段 内容
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发送设备入网包

样例数据:

{
“join”: {
“request”: {
“frame”: “AAEAACAAxSYsFhAWIAB3SgBUe0At4Zo”
}
}
}
将join.frame进行base64 解码,得到的内容为:

\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数据没有变化

第四步
4.AS同意入网并且向NS回复同意入网

样例数据:

{
“join”: {
“moteeui”: “4a770020161016”,
“accept”: true
}
}
第五步
5.NS生成MoteAddr,并将node端的信息发送给AS

样例数据:

{
“join”: {
“appeui”: “2c26c50020000001”,
“moteeui”: “4a770020161016”,
“details”: {
“moteaddr”: “48000002”,
“devicenonce”: 31572
}
}
}
第六步
6.AS生成密钥,并将相关信息告诉NS

样例数据:

{
“join”: {
“moteeui”: “4a770020161016”,
“complete”: {
“frame”: “IPqAKXQ7LS/CmYVCDy8K3k4”,
“networkkey”: “de03331aeb4254e9727b6fafbf13db3d”
}
}
}
可以看到,networkkey直接发送给NS了,这也就是NwkSKey,之所以明文告诉NS,是因为:
1.NS不做解密的工作,所以不能通过APPKEY解密负载得到
2.networkkey在NS对上下行数据进行校验的时候会使用到

第七步
7.NS将数据告诉GW,GW再转换成MAC包,发送给node

样例数据:

{
“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部分是经过base64编码以及AES加密的,直接解码,看到的数据是无效的,需要再进行解密,解密需要使用APPKEY,也就是之前介绍的APPKEY.

txpk.data部分就是LoRaWAN MAC的join_accept message.

第八步
8.node解析join_accept message 部分

根据LoRaWAN specification 可知,join_accept message的格式如下:

MHDR AppNonce NetID DevAddr DLSettings RxDelay CFList(pad16) MIC
1字节 3字节 3字节 4字节 4字节 1字节 0/16字节 4字节

其中

字段 描述
MHDR 数据包头,其中包含了数据包的类型,也就是说从这个包头可以知道,这是一个join_accept message
AppNonce 3字节的unique ID,服务器生成的,产生AppSKey/NwkSKey 会用到
NetID 网络ID,产生AppSKey/NwkSKey 会用到
DevAddr 设备的短地址
DLSettings 设置RX1和RX2的下行接受串口的速率
RxDelay 从发送完成到打开RX1接受串口的事件
CFList(pad16) 我也不知道是什么,目前看到的都是0个字节
MIC 4字节的校验
需要注意的是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

这个数据是未解密的,我们还需要解密

解密后为
\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无法直接看出来,需要再计算

计算公式如下:

NwkSKey = aes128_encrypt(AppKey, 0x01 | AppNonce | NetID | DevNonce | pad16)
AppSKey = aes128_encrypt(AppKey, 0x02 | AppNonce | NetID | DevNonce | pad16)

LoRaWAN入网参数设置相关推荐

  1. LoRaWAN入网方式以及加密进阶版

    LoRaWAN入网方式以及加密进阶版 文章目录 LoRaWAN入网方式以及加密进阶版 首先了解一下关于LoRaWAN入网的一些参数解释:(OTAA模式) OTAA入网过程: 大致过程: 具体过程: 关 ...

  2. 2021年大数据Hadoop(二十九):​​​​​​​关于YARN常用参数设置

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 关于yarn常用参数设置 设置container分配最小内 ...

  3. 设置最大值_电机变频器参数设置不当会怎样

    我们知道变频器驱动电机运行是需要设置参数的,包括变频器运行控制模式如启动.停止,频率给定的命令来源,变频器频率的上下限.加减速等等参数都要根据实际情况来正确的设置. 控制模式与接线方式的不统一造成的, ...

  4. Socket中的异常和参数设置

    1.常见异常 1.java.net.SocketTimeoutException . 这个异 常比较常见,socket 超时.一般有 2 个地方会抛出这个,一个是 connect 的 时 候 , 这 ...

  5. Selenium2(WebDriver)总结(二)---Firefox的firebug插件参数设置(补充)

    Selenium2(WebDriver)总结(二)---Firefox的firebug插件参数设置(补充) 本文是对上一节的补充:http://www.cnblogs.com/puresoul/p/4 ...

  6. Vcastr 2.2 flv 网络播放器 参数设置

    Vcastr 2.2 flv 网络播放器 参数设置 参数名称 参数说明 默认值 vcastr_file 方法2传递影片flv文件地址参数,多个使用|分开 空 vcastr_title 影片标题参数,多 ...

  7. myeclipse.ini内存参数设置及其含义

    =================================== 目前的配置 -vmargs -Xmx1024m -XX:MaxPermSize=256m -XX:ReservedCodeCac ...

  8. oracle自动分区maxvalue,分区表中的maxvalue参数设置-Oracle

    分区表中的maxvalue参数设置 结论:partition p3 values less than (maxvalue)   分区表中maxvalue如果用具体参数来代替,则整个表中可插入的最大值不 ...

  9. R语言ggplot2可视化分面图(facet_grid)、自定义缩小分面图标签栏的高度、但是不改变标签栏标签文本的大小、通过element_text函数的margin参数设置实现

    R语言ggplot2可视化分面图(facet_grid).自定义缩小分面图标签栏的高度.但是不改变标签栏标签文本的大小.通过element_text函数的margin参数设置实现 目录

最新文章

  1. 如何利用 notedown 完成 ipynb与markdown之间的格式转换?
  2. python编程入门与案例详解pdf-这些年我读过的技术经典图书(附电子版下载地址)...
  3. Hazelcast入门指南第4部分
  4. java javax.xml.ws_如何通过javax.xml.ws.Service进行调用
  5. 【多线程】并发执行指定数量的线程
  6. nand flash 原理简介
  7. 百度地图API学习之路(1)
  8. 如何不打开excel文件搜索其中内容---在线绿色工具
  9. Photoshop CS2 视频教程-PS链接图层(转)
  10. 【北亚数据恢复】DELL EqualLogic PS6100服务器raid5磁盘阵列中硬盘出现坏道离线的数据恢复
  11. canvas教程4-canvas的绘制功能
  12. python对dataframe时序数据按时间顺序读取
  13. R语言ggplot2包之坐标轴
  14. python正则表达式(2)
  15. iPad3/iPad2/iPad 5.1.1完美越狱WIN版详细教程
  16. ppt中的面积显示图表中有数据被盖住了显示不出来_关于PPT图表的用法,看这一篇就够了...
  17. 开始读《Oracle Database 12c Security》
  18. Java获取今天是几号
  19. 5 Business logic vulnerabilities 业务逻辑漏洞
  20. 小程序 canvas 海报(图片、字体封装方法)解决导出海报模糊问题

热门文章

  1. php的知识体系结构图,高中英语全部知识体系结构图汇总
  2. 使用FFmpeg将一张图片和一段音频转换成视频
  3. 《Better Performance at Lower Occupancy》解读
  4. Flak 自定义URL转换器
  5. 插入u盘计算机未响应,u盘启动电脑无反应,教您电脑插上U盘后无法启动解决方法...
  6. Robocup3D第一次笔记
  7. CentOS命令行改色。
  8. java基于springboot+vue+elementui的实验室预约管理系统 前后端分离
  9. Beam Search集束搜索
  10. bic计算机原理,CBTC系统区域控制器(ZC)功能及原理探究