全面介绍LoRaWAN终端OTAA入网方式
在之前的文章中向大家介绍了LoRa终端OTAA与ABP入网方式工作原理区别介绍、在弱网区域下,LoRa终端的入网方式该如何选取。本文主要介绍了OTAA节点是如何入网的。此文来自小七老师,小七老师是腾讯云在线课堂物联网讲师。
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相关知识,希望大家持续关注我们。
您的留言或需求: