LoRaWAN协议(五)--OTAA入网方式详述
前言
OTAA(Over-The-Air Activation),是LoRaWAN的一种空中入网方式。当node在上电的时候处于非入网状态时,需要先入网才能和服务器进行通信。其操作就是node发送join_request message,请求入网,然后服务器同意入网,并且返回Join-accept message,node再对信息进行解析,获取通信参数,之后就可以和服务器通信了。
顺便分享几个工具网站给大家:
OTAA方式入网步骤
准备工作
node端在做OTAA入网之前,需要先具备三个参数:
- APPEUI node自定义的8字节长地址
- APPKEY 服务器和node端都事先存好,用于对Join_acept message 做加解密处理
- DevNonce 2字节的随机数,用于生成随机的AppSKey和NwkSKey
这些参数可以通过程序固话在里面,或者通过串口或其他方式在入网操作前告诉node。
当这些准备工作都做好了之后,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)
下一篇文章,我会把这个解密的过程,以及NwkSKey/AppSKey的计算过程,配合C语言,再分析一下。
**本期的LoRaWAN协议分析就到这里了,如果本文有什么错误,或者对LoRaWAN有什么不理解的,欢迎联系我,邮箱(454626653@qq.com),在左边也有链接,谢谢大家。
**
LoRaWAN协议(五)--OTAA入网方式详述的更多相关文章
- LoRaWAN协议(六)--OTAA KEY生成过程
前言 通过OTAA方式入网的设备,通讯时使用的KEY需要通过服务器获得,在入网之间,设备无法通讯. 相关的OTAA入网流程已经在上一章中讲解过了,有兴趣的可以去看看**LoRaWAN协议(五)__OT ...
- LoRaWAN协议(四)--入网方式概述
前言 在LoRaWAN中,node最终和服务器能够正常数据交互,需要先入网,入网的本质,也就是获得一些通信相关的参数,有以下几个: NwkSKey AppSKey DevAddr DevEui 其中 ...
- LoRaWAN协议(三)--Server端数据协议
LoRaWAN Server 端架构 LoRaWAN 的server包括 NS(Network server).AS(application server).CS(Custom server).... ...
- LoRaWAN协议(七)--完整数据流程
以下的GW指Gateway 所用指令: root@lora-iot-sk:~# tcpdump -i lo -nn -x 'length>100' 入网流程 GW -> NS join_r ...
- LoRaWAN协议(一)------架构解析
摘自:http://www.cnblogs.com/answerinthewind/p/6200497.html LoRaWAN协议(一)-----架构解析 (1)LoRaWAN分层 LoRaWAN总 ...
- 【转】ZigBee终端入网方式深入分析
前述 继之前对终端Direct Join的分析,发现很多东西还很模糊,存在很多问题.终于找到时间继续深入挖下去,这次应该比较完整地搞清了终端的入网机制,并纠正之前的几个认识偏差. 由于Z-Stack网 ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- HTTP协议 (五) 代理
HTTP协议 (五) 代理 阅读目录 什么是代理服务器 Fiddler就是个典型的代理 代理作用一:FQ 代理作用二:匿名访问 代理作用三:通过代理上网 代理作用四:通过代理缓存,加快上网速度 代理作 ...
- Spring事务Transaction配置的五种注入方式详解
Spring事务Transaction配置的五种注入方式详解 前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学 ...
随机推荐
- [后端人员耍前端系列]KnockoutJs篇:使用KnockoutJs+Bootstrap实现分页
一.引言 由于最近公司的系统需要改版,改版的新系统我打算使用KnockoutJs来制作Web前端.在做的过程中,遇到一个问题——如何使用KnockoutJs来完成分页的功能.在前一篇文章中并没有介绍使 ...
- Java多线程12:ReentrantLock中的方法
公平锁与非公平锁 ReentrantLock有一个很大的特点,就是可以指定锁是公平锁还是非公平锁,公平锁表示线程获取锁的顺序是按照线程排队的顺序来分配的,而非公平锁就是一种获取锁的抢占机制,是随机获得 ...
- Task:取消异步计算限制操作 & 捕获任务中的异常
Why:ThreadPool没有内建机制标记当前线程在什么时候完成,也没有机制在操作完成时获得返回值,因而推出了Task,更精确的管理异步线程. How:通过构造方法的参数TaskCreationOp ...
- Python自动化测试(1)-自动化测试及基本技术手段概述
生产力概述 在如今以google为首的互联网时代,软件的开发和生产模式都已经发生了变化, 在<参与感>一书提到:某位从微软出来的工程师很困惑,微软在google还有facebook这些公司 ...
- 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程
一.目前流行的源程序版本管理软件和项目管理软件有Microsoft TFS.GitHub.SVN.Coding等. 二.各有什么优缺点 三.在GitHub注册账户的过程 Microsoft TFS的优 ...
- Intellij Idea 2016 配置Tomcat虚拟目录
默认的idea是不需要配置虚拟目录了,它完全托管项目,但是有些时候,在开发过程中,是需要以虚拟目录的形式开发,即以:http://localhost:8080/虚拟目录名/index.html 这种形 ...
- [安卓] 14、安卓HTTP——POST和GET用法分析
内容简介 本文通过建立一个简单的Servlet服务器来分析安卓上用HTTP和服务器通信的细节,旨在演示C/S模式下服务器端和客户端的工作过程. 目录 part.1 用MyEclipse建立一个简单的s ...
- redis系列-主从复制
redis自身提供了主从的机制,通过配置可以实现服务的备份(Master->Slave). 配置项 slaveof <masterip> <masterport> mas ...
- make file教程(转)
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- Java-异常处理练习
1.建立exception包,编写TestException.java程序,主方法中有以下代码,确定其中可能出现的异常,进行捕获处理. package Yichang; public class Te ...