在之前的文章中向大家介绍了“该如何选择LoRaWAN终端入的网方式”,本文主要介绍了OTAA节点是如何入网的。此文来自微信公众号“小七说LoRa”,内容已获小七老师授权,小七老师是腾讯云在线课程讲师,点击链接https://mp.weixin.qq.com/s/WvGmi81zBMzbAX8OUb-DpA可以观看课程视频。

OTAA的全称是Over The Air Activation。它的入网步骤是这样的:节点发出的Join Request请求通过网关转发到服务器,也就是NS;NS会对该请求做一些判断处理之后,将Join Accept响应通过网关发送给节点。

网关的主要作用是将节点的数据与服务器的数据互相转发。服务器我们可以选择一些在线的服务器,比如TTN、腾讯云物联网开发平台等,我们也可以搭建开源的服务器,比如chirpstack,我们还可以购买一些已经内置了服务器的网关。

无论是TTN、腾讯云物联网开发平台、chirpstack还是内置服务器,基本上都是免费使用的。腾讯云物联网平台于2021年1月升级为部分收费的模式,1000台设备以内是免费使用的。

OTAA节点入网需要与NS有两次数据交互过程。一次是节点向NS发送join request请求,一次是NS向节点发送 join accept响应。在节点发送join request请求之前,我们需要准备OTAA节点的三个参数DevEUI、AppEUI和AppKey。在节点接收到join accept之后,节点需要成功解析join accept之后,才是入网成功,接下来对每一个步骤进行详细的说明。

对于OTAA节点,我们如何获取到DevEUI、AppEUI和AppKey这三个参数呢?有的厂商会在节点上贴一个二维码,通过扫描二维码可以获得这三个参数;有的厂商可以通过at指令来获取这三个参数,具体的at指令需要查看厂商提供的手册;还有的厂商只会将devEUI贴在节点上,然后将devEUI、appEUI和appKey通过其他方式发送给客户,以保证三个参数的安全性。

DevEUI就是节点的身份标识,就像我们每个人在企业中的工号一样。

AppEUI是应用ID,我们可以把AppEUI理解为企业中的部门名称。刚刚我们在前面提到过的几个NS服务器中,如果使用TTN服务器,需要配置AppEUI;如果使用腾讯云物联网平台或者chirpstack的话,对于AppEUI这个参数节点可以设置为任意值

AppKey是节点用来计算会话秘钥的,节点使用AppKey从join accept中计算出会话秘钥NwkSKey和AppSKey用于节点入网成功之后的通信,这就是一个完整的入网请求流程。

节点发送Join request请求,通过网关透传转发给NS服务器。NS判断请求是否合法,合法的情况下,NS下发join accept消息到网关,网关再将消息发送给节点。节点收到join accept之后会从join accept中解析出devAddr、appSKey和nwkSKey,之后节点就可以使用解析后的这三个参数对数据进行加密发送给NS了。

我们通过举例说明Join request请求的报文格式,一个join request请求中包含了节点的AppEUI参数、DevEUI参数还有一个随机值参数,叫做DevNonce

在LoRaWAN协议中,第一个字节称为Mac Header标志,简称为MHDR,用来表示消息类型。00固定表示这是一个join request消息。第二到第九这8个字节固定填充AppEUI,第十到第十七字节固定填充DevEUI,第十八十九字节就是一个随机值DevNonce。最后四个字节是对AppEUI、DevEUI和DevNonce这部分数据计算出的校验值。注意DevNonce这个参数,很多做开发的朋友踩过一个坑,都与这个DevNonce有关,等会儿和大家分享。

一个完整的Join accept消息格式如下,第一个字节是我们刚刚提到的MHDR协议头,Join accept消息的协议头固定是十六进制的0x20。然后依次是AppNonce,它是NS生成的一个随机数;NetID是NS的一个参数,可以简单理解成NS的ID;DevAddr就是NS为节点生成的一个短地址,节点Join成功之后DevAddr就成了节点在NS上的唯一身份标识,同一个NS中不会出现两个相同的DevAddr;DLSettings中配置了节点两个接收窗口的接收速率参数;RxDelay中配置了节点在发送数据完成之后间隔多长时间打开第一个接收窗口,这个值默认都是1秒;CFList是一个可选参数,它可以更改节点在入网成功之后的通信信道信息。

NS下发给节点的join accept消息是加密消息,需要节点先使用appKey解密之后才能拿到明文的JoinAccept报文。然后节点再使用DevNonce、AppKey和从Join accept中解析出来的appNonce计算出两个会话秘钥nwkSKey和appSKey。

一个完整的OTAA流程的交互报文我们已经介绍完了,在实际的使用中,大家在刚刚接触LoRaWAN的时候很容易遇到入网不成功的问题。入网不成功有多种可能的原因,将原因主要总结为以下三点:

  • 在NS上注册的节点三参数与节点配置的三个参数不匹配导致。如果devEUI或者AppEUI配置不一致的话,服务器就不会下发Join Accept消息;如果AppKey配置不一致的话,就会导致节点无法成功解析Join Accept消息。这个不匹配主要是人为因素,一般是因为用户将参数填写错误导致的,相对容易排查到。
  • 节点发送的Join Request请求网关没有接收到,一般是硬件故障或者是环境导致无线信号特别差引起的。硬件出现故障的概率比较低,一般需要重点检查是不是无线信号较差,可以考虑将节点与网关的距离设置的近一点、或者尽量清除节点与网关之间的障碍物,然后再进行尝试。
  • 还有一个很少见的原因也极不容易排查到。很多开发者可能在刚刚学习阶段会将Join Request中的各个参数在代码中写死,Devnonce在代码中设置成了固定值,这种做法,将导致第一次Join成功之后再重新Join始终无法成功。这就是我们前面提到的Devnonce引出的一个坑。

NS会有一个缓存机制,会保存同一个节点每次Join request消息中的Devnonce,在一定时间内,如果同一个节点入网请求消息中的Devnonce与NS缓存中的Devnonce雷同,那么NS会拒绝该终端的本次入网请求。NS这么处理是为了保证节点的数据安全性。只要更改Devnonce的值,节点就能重新成功入网了。

在接下来的文章中,将会继续分享更多的LoRa相关知识,希望大家持续关注我们。

LoRaAN终端OTAA入网方式的详细介绍相关推荐

  1. 全面了解LoRaWAN终端ABP入网方式

    ABP(Activation by Personalization)作为LoRaWAN的一种个性化激活入网方式,那么大家知道LoRaWAN终端ABP入网方式的具体步骤吗? 在本次的视频课程中,小七老师 ...

  2. 转 安卓Android系统超级终端命令行大全 超详细介绍(六、七、八、九..)

    2019独角兽企业重金招聘Python工程师标准>>> Android系统在超级终端下必会的命令大全(六) kill 1.作用 kill命令用来中止一个进程. 2.格式 kill [ ...

  3. php获取sessionstorage,关于PHP session 存储方式的详细介绍

    PHP为sesion的存储提供了三种方式: 文件/ 内存/ 自定义存储,默认是使用文件存储.在访问量大的网站上采用这种方式就不大合适,因为这样会导致大量的输入输出的冗余. 下面介绍一种基于Mysql数 ...

  4. 用python操作浏览器的三种方式,详细介绍并附代码

    第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如: import time from selenium import webdriver def mac():     driver ...

  5. led显示屏P4安装方式功能详细介绍

    led显示屏P4是点间距为4mm的室内全彩led显示屏,点密度为62500点/㎡,2015年以前led显示屏P4是比较高大上的一款产品,点间距比较小,清晰度高.随着led灯珠封装技术的不断发展, le ...

  6. LoRa节点ABP入网方式怎么样

    在之前的文章中为大家介绍了"LoRaWAN终端OTAA入网方式",现在为大家介绍ABP节点入网,此文来自微信公众号"小七说LoRa",内容已获小七老师授权,小七 ...

  7. LoRa终端两种入网方式OTAA与ABP工作原理的区别

    在之前的文章中介绍了"LoRa终端如何以OTAA方式入网TTN服务器",现在为大家介绍LoRa终端两种入网方式OTAA与ABP工作原理的区别,此文来自微信公众号"小七说L ...

  8. 在弱网区域下,LoRa终端入网方式OTAA与ABP该如何选择

    在之前的文章中为大家介绍了"LoRa节点如何以OTAA方式入网TTN服务器",现在为大家介绍在弱网区域下LoRa节点入网方式OTAA与ABP该如何选择,本文来自微信公众号" ...

  9. LoRaWAN设备类型、终端入网方式及消息上下行

    LoRaWAN 协议针对低功耗.电池供电的传感器等应用进行了不同等级的优化, 分成不同级别的终端类型(Class A/B/C),以优化网络延迟和电池寿命间的平衡关系.所有的LoRaWAN终端都必须满足 ...

最新文章

  1. 【廖雪峰python入门笔记】函数
  2. servlet第2讲(下集)----创建servlet实例(继承HttpServlet)
  3. JVM运行时对它所管理的内存划分区域(为面试准备)
  4. linux更改甜器名称,Linux添加swap分区
  5. AI攻破高数核心,1秒内精确求解微分方程、不定积分
  6. 解决Anaconda第三方库下载慢
  7. stm32编程初始化设备步骤
  8. 所有键盘鼠标模拟方式原理及实现
  9. npm run build 报错: No such file or directory
  10. 我有一个还在蹒跚学步的小孩是否应该学习Python?
  11. Linux服务器之间使用scp免密传输文件
  12. 四海众联E350N水滴吸顶AP适配说明
  13. 家用 NAS 服务器搭建 | 前篇
  14. 榕树贷款 探索人工智能技术 打造金融机构转型新引擎
  15. 大数据集群的部署安装
  16. input苹果6点击事件无效
  17. cs python课程 加州大学_加州大学伯克利分校是如何培养计算机学生的
  18. Qt 中的信息输出机制:QDebug、QInfo、QWarning、QCritical 的简单介绍和用法
  19. xp系统无法连接到指定计算机名,winxp系统提示windows无法访问指定设备路径或文件如何解决...
  20. 【疯壳·机器人教程2】人形街舞机器人-机体组装及测试

热门文章

  1. plc学习入门有什么技巧
  2. switch双属性php,thinkphp-条件判断-SWITCH标签
  3. 恒温烙铁使用注意事项
  4. Windows 10 Mscomctl.ocx缺失解决方法
  5. 概率机器人(Probability Robotics)笔记 Chapter 9: 占据栅格建图(Occupancy Grid Mapping)
  6. go get 命令介绍
  7. Echarts世界地图汉化及其数据包
  8. [HDF5]如何使用CMake一起编译自己的代码和HDF5库
  9. 小米2020校招软件开发工程师笔试题二
  10. 自媒体怎么快速入门?这几个技巧一定要掌握好