前言: 这片博文翻译自 《LoRaWAN™ 1.1 Specification》的第8到16章class B的部分(此文需有class A的基础),所以每个小标题前面的序号也是和协议原文对应的。在此之上,也加入了一些笔者的理解,方便大家对比学习,也欢迎指正~!
如果终端要在固定的间隔时间打开接收窗口来接收服务器下发的消息,就需要使用class b模式。
Lorawan的class b模式在终端上加了同步接收窗口。 Lorawan的class a模式的限制之一是终端发送消息的aloha机制。当用户或服务器想主动联系终端的时候无法获知确切的联系时间(–笔者–:只有终端主动发上行数据,服务器才可以发下行数据联系到终端)。
Class b的目的就是预知终端处于接收状态的时间。所以除了有class a在任意时间上发消息后打开接收窗口的机制外,class b还通过网关规律地下发信标beacon来同步所有终端的时间,从而终端可以在可预知的时间周期性额外打开接收窗口(–笔者–:服务器也可以在和终端校准时间后计算得知终端打开接收窗口的时间,并利用这个时间实现下发数据)。
Note:class a切换为class b是由终端的应用层决定的。当网络端要控制class a到class b的切换,用户需要用class
a的上行数据带下来一个下行数据到应用层,终端应用层就会识别到切换class的指令,这个过程是和lorawan层无关的。
对于一个支持class b的终端设备来说,所有的网关必须同步广播给终端设备一个提供参考时间的信标beacon。终端基于这个参考时间就可以周期性打开接收窗口,也叫做ping slot。网络设备可以利用这个接收窗口对终端发起下行通信。网络利用其中一个ping slot发起下行通信的动作叫做ping。发起下行通信的网关是由网络服务器根据终端最后一条上行的信号质量决定的。因为这个原因,如果终端移动并且发现了具有网关唯一性beacon有所变动,终端必须向网络服务器发起上行通信,从而让服务器更新下行的路由。
在终端运行在class b之前,以下信息是网络服务器需要知道的:
所有的终端都在class a的模式下入网,然后终端的应用层决定切换class b,按照如下的步骤:
在例子中,beacon周期(beacon_period)是128s,打开ping slot接收窗口的周期是32s。大部分时间pingslot是不会被服务器用到的(–笔者–:因为服务器不会一直下发数据),所以当终端在唤醒后无线接收器没有在相应频道接收到前导码就会马上关闭接收窗口。若监测到了前导码,无线接收器就会持续接收下行直到解调完成。mac层会处理帧:在推送给应用层前检查下发的地址是否是终端地址以及数据完整性校验是否有效。
Class b和Class a的上行帧大致相同,不同之处在于在帧头的fctrl位,class a不使用这个标志位,置为RFU(–笔者:–意思是Reserved for Future Usage,留着将来用),class b会在上行中将class b标志位置1通知网络服务器设备已经切换到class b并准备好接收下行ping。
下行的fpending位表示服务器消息队列中还有消息待发给终端,终端需要继续接收。(这点和class a相同)。
下行ping使用到格式和class a下行帧相同,但是遵循不同的频道频点规则。
单播就是给一个终端发消息,多播是给多个终端发消息。同一个多播终端组的终端共享一个相同的多播地址和密钥。Lorawan class b规范不会远程建立多播组或分配所需要的多播密钥。建立多播组或分配多播密钥是终端自己或通过终端应用层来做的。
同class a
多播mac消息大体上和单播类似,有以下几个不同:
在class a切换class b之前,终端必须首先收到一个网络信标beacon来和网络同步时间。一旦进入class b,终端必须周期性检索并接收一个网络信标,根据网络时间来校准所有的内部时钟漂移。
Note:例如,一个精度为+/-10ppm的设备内部时钟每个beacon周期可能会偏移+/-1.3ms。
在发生了信标丢失后,设备必须在收到最后一个beacon信标后保持2小时对class b模式。这种在class b模式下收不到beacon对状态叫beacon-less。它只能依赖于设备自己的时钟来计算时间。
在beacon-less对状态下,单播、多播和beacon接收窗口必须进一步扩大来适应终端可能存在对时钟漂移。
在保持class b模式的2小时内一旦收到beacon,就会再延长2小时的class b模式保持时间。
终端设备使用beacon的精确周期来校准内部时钟的不精确频率。使用温度传感器可以进一步减少时钟漂移。
为确保class b模式正确运行,终端设备必须根据beacon精确地打开接收窗口。这部分叫做所需时间(Required Timing)。
在两个成功接收beacon之间的间隔叫做beacon-period。beacon帧传输时间与beacon_reserved的起始时间对齐。每一个beacon都由beacon警戒时间beacon_guard来确保接收(在beacon警戒beacon_guard时间内没有pingslot打开,以避免接收冲突)。警戒时间间隔的长度与接收空中最长帧的时间对应,以此来确保在警戒时间之前pingslot的下行接收不会和beacon接收冲突。照此看来,可以打开pingslot的时间是从beacon_reserved尾到下一个beacon_guard的头(即beacon_window).
事实上,beacon在空中的传输时间要远小于beacon_reserve时间。这是为了将来扩展网络的广播控制。
Beacon_window间隔被分成212=4096个ping slot,每一个ping slot为30ms,编号从0到4095。
终端设备定义slot number n来计算确切的接收时间,在开始接收beacon(和beacon_reserved起始时间对齐)后的Ton秒打开接收。
*
最后一个pingslot的打开时间为从beacon start开始计算:beacon_reserved + 4095 * 30ms = 124970ms或从下一个beacon开始的前3030ms(beacon_guard time+1*30ms = 3030ms)。
为了避免同时接收的碰撞问题和over-hearing问题,n(即slot index)在每一个beacon周期都会随机变化。
以下是用到的参数:
Devaddr:设备32bit的网络单播或多播地址。
Pingnb:每个beacon周期的pingslot数量,必须是2的指数倍(0~128)。即2k,(k从0到7)——在代码中pingnb的计算方法是27/2k = 2(8-k),应该是为了防止超过128.
Pingperiod:用pingslot数量pingnb来表示设备唤醒周期pingperiod(212/pingnb)。
Pingoffset:在每个beacon start时计算的随机偏移,范围在0到(pingperio-1)。
Beacontime:在beacon帧bcnpayload中带下来的时间。
Slotlen:一个pingslot的时间,为30ms。
在每一个beacon周期,终端和服务器都会计算一个新的伪随机偏移来同步接收窗口。使用aes加密和16位0x00key来产生伪随机数,从而计算出pingoffset,从而节点可以打开接收窗口。
如果终端设备同时支持单播和若干个多播窗口,这种算法会被用到多次,对于单播地址用一次,对于多播单组地址用一次。
如果终端的单播和多播接收发生了冲突,终端设备应该优先监听多播窗口。如果多播和多播发生了冲突,fpending标志位可用于设定首选。
随机机制避免和单播和多播的同时碰撞(冲突),如果冲突在一个beacon周期内发生,一般不会在下一次beacon周期发生。
所有class a用到的mac命令,在class b模式下同样支持,class b还外加了以下的命令:
注:ed表示终端,gw表示网关
Pingslotinforeq(ed发):终端告诉服务器ping slot periodicity。
Pingslotinfoans(gw):服务器对终端的回应。
Pingslotchannelreq(gw):服务器向终端请求修改ping channel。
Pingslotchannelans(ed):终端对服务器请求的回应。
Beaconfreqreq(gw):服务器请求终端修改beacon接收频率。
Beaconfreqans(ed):终端对服务器请求对回应。
使用pingslotinforeq命令,终端告诉服务器单播的ping slot periodicity。这个命令只针对单播,多播完全取决于应用层,不需要用此命令。
笔者:在代码里定义了LORAWAN_DEFAULT_PING_SLOT_PERIODICITY,即periodicity。
若终端想要改变slot periodicity的值,需要先切回class a,通过发送pingslotinforeq的mac命令给服务器并获取服务器下发的pingslotinfoans响应,然后再以新periodicity的配置切回class b。
这个命令是服务器下发给终端来修改终端接收beacon的频率
这部分代码不同于class a中的newchannelreq的mac命令。
频率是24bits的无符号整型,实际的beacon频段是以hz为单位的100*frequ。所以beacon channel可以在100mhz到1.67ghz(步长以100倍的整数倍增长),终端设备可以判断频率是否是硬件接收的可用频率。
一个有效的非零频率使设备在固定频道监听beacon,即使默认是指定跳频信标(美国ism频段)。
若值是0则告知终端设备使用定义在信标物理层beacon physical layer中默认的beacon频率,在适当情况下恢复成跳频信标搜索。
在收到以上命令后终端回回应带有beaconfreqans的消息
设备返回一个状态值,若为0表示设备无法使用这个频率接收beacon,将保持以前的频率。若为1表示设备成功切换为服务器下发的频率接收beacon。
此命令是服务器向终端发送请求修改下行ping的频点或数据速率,此命令只能在class a的接收窗口中由一个上行带下来,而不能在class b的pingslot打开时下发。若在class b的ping-slot接收窗口收到此mac消息,终端也不会执行。
此命令和class a中的newchannelreq的mac命令不同。
频率是24bits的无符号整型,实际的beacon频段是以hz为单位的100*frequ。所以beacon channel可以在100mhz到1.67ghz(步长以100倍的整数倍增长),终端设备可以判断频率是否是硬件接收的可用频率。
若值为0则表示通知终端使用默认的频率。
data rate字段是实际数据速率的映射,在《lorawan regional parameters》文件中有定义.
在收到pingslotchannelreq的mac命令后,终端会回一个pingslotfreqans(pingslotchannelans)
beacontimingreq & beacontimingans被废弃了,改为使用devicetimereq&ans.
除了透传终端和网络服务器的消息,网关还可以在固定时间下发信标beacon来同步时间。所有的beacon无线数据包都使用隐式模式,也就是说没有lora 物理帧头r和crc.
beacon的前导码长度长于10个未调制字符。这使得终端可以实现低功耗占空比信标搜索。
信标帧的长度和射频物理层紧密相关。因此信标帧实际帧长度和内容回随着region变化。beacon内容、调制参数和频率各不相同。(在《lorawan regional parameters》文件中定义)。
信标的内容bcnpayload包括网络共同部分和网关特殊部分。
通用部分:rfu(为0),time(单位为秒,从1980年1月6日00:00:00算起模232),整个网络通用部分通过crc(16bits)校验是否正确。Crc-16是根据ieee 802.15.4-2003 section7.2.1.8来校验rfu+time字段。使用的多项式是p(x)=x16+x12+x5+x0
网关特殊部分在下发beacon的时候提供来另外的信息,每一个网关都不相同。若rfu有用到,应该等于0.
对于固定不动的终端来说,监听和同步网络通用部分就足够了。对于移动的终端来说,还需解调网关特殊部分,使得终端从一个区域移动到另一个区域时可以告知网络服务器。
Note:所有的网关都参与并同时下发beacon信标,所以对于正在监听的终端设备来说,即使同时收到从不同网关下发的beacon,碰撞冲突是不可见的。不是所有的网关都必须参与beacon过程,参与下发beacon的网关是随机化的。虽然会有冲突产生,但是终端设备仍然可以解调最强的beacon信号。
utc时间为1980年1月6日00:00:00(也叫做gps epoch)
beacon从utc时间开始每128s下发一次。BT=k*128+TBeaconDelay
TBeaconDelay为1.5ms +/- 1us的延迟。是网关从接收模式转为传输模式的轻微延迟。
所有的终端使用beacon start时间作为参考时间打开ping slot,因此网络服务器在发送下行时将tbeacondelay计算进来。
当网络端尝试与class b终端进行下行通信,网络端将根据终端最后一个上行选取离终端最近的网关下发。因此网络服务器可以对于每一个class b终端设备维护一个下行路由。一旦class b切换了网关区域,终端设备需要和网络服务器通信从而让网关服务器更新下行路由。可以通过发送上行confirmed或者unconfirmed的数据。
终端设备需要在两个基本策略中选择:
若设备切换区域通知服务器失败了,将会导致class b的下行暂时无法生效。网络服务器需要等待终端的下一个上行来转换下行通信。