实现自适应数据速率(ADR)¶
这篇论文深入研究了LoRaWAN®的自适应数据速率(ADR)特性,用于终端设备软件开发人员和构建LoRa®设备的团队管理人员LoRaWAN链路层规格.您将了解什么是ADR,学习何时使用ADR的最佳实践,并学习如何在您的终端设备上实现它。
读完这篇文章后,你应该掌握了处理ADR所需的基础知识,从声明你的终端设备应该实现ADR,到处理网络服务器发送给终端设备的MAC命令,再到通过遵循ADR回退方案恢复与网络服务器的连接。
已经使用软件如LoRaMAC-Node™处理美国存托凭证吗?本文将为您提供一些背景知识,您需要了解软件是如何工作的,检查代码,并确信您的终端设备正在遵循LoRaWAN链路层规范中定义的标准和最佳实践。
ADR及其主要好处¶
自适应数据速率(Adaptive Data Rate, ADR)描述了网络服务器在发送上行链路时单独控制数据速率、射频传输功率、使用的信道以及网络中每一端设备的重发次数的方案。
网络服务器使用从终端设备接收到的消息的接收信号强度指示器(RSSI)来确定终端设备距离最近的网关有多近。这允许网络服务器为每个终端设备选择最合适的设置。
ADR的好处是它有助于保持终端设备的电池寿命,并减少干扰,使网络上所有终端设备成功通信的最佳机会。
使用ADR前的默认上行链路设置¶
ADR更改终端设备发送上行链路时使用的默认设置。在使用ADR定义的设置之前,您的终端设备应用程序将首先使用以下描述的默认设置。下面是每个类别的默认设置。当终端设备第一次打开或重置时,应该使用这些设置启动。
不同地区的默认设置不同。要找到您所在地区的设置,请下载最新的LoRaWAN区域参数文档的LoRaWAN为开发人员LoRa Alliance®网站上的网页。
默认的发射功率¶
使用终端设备可以支持的最大功率水平,这是允许的区域,它将操作。在最新的LoRaWAN区域参数文件中,在标题部分找到你所在区域的指导方针数据速率和终端设备输出功率编码.例如,如果您的设备的目标是EU863-870区域,并且您正在引用文档RP002-1.0.3,您将参阅章节2.4.3, EU863-870数据速率和终端设备输出功率编码,在第26页。
默认的数据速率¶
默认的数据速率取决于设备的激活方式。
对于使用“个性化激活”(ABP)激活的设备,默认的数据速率是其运行区域内终端设备允许的最低数据速率。允许的最小数据速率在最新的LoRaWAN区域参数文档中指定,在您的区域中,标题为数据速率和终端设备输出功率编码.
对于使用over - air Activation (OTAA)激活的设备,默认的数据速率是在加入过程中导出的数据速率。
默认重传次数¶
默认的重传次数(NBTrans)是1(1)。
决定何时实施ADR¶
如果你的设备总是静态的(即,在相同的固定位置),那么你应该总是使用ADR。
如果您的终端设备是移动的,例如,如果它是一个地理位置跟踪器,ADR将不适合您的用例。当ADR使用时,网络服务器使用上行链路接收到的信号强度来调整数据速率、TX功率和通道计划,以确定设备看起来离网关有多近或多远。如果设备在网络服务器计算和传输新设置之前移动,那么这些设置将不适用于新位置。
移动端设备不一定是连续运动的,当它们静止时,它们可能需要发送常规的上行消息。当设备处于静态状态时,使用ADR会有好处。如果可能的话,设计你的终端设备,让你的代码可以判断设备当前是否处于运动状态。如果您的终端设备可以确定其状态,那么您可以使用ADR时,设备是静态的,停止使用ADR时,设备是在运动。
如何实施ADR¶
网络服务器通过在下行链路上设置ADR位来表示在任何给定的时间是否支持ADR。ADR位在帧控制中传递(FCtrl)字段,如下图所示。
当网络服务器支持ADR时设置,当网络服务器不支持ADR时不设置。通常情况下,网络服务器只是暂时挂起,以支持ADR。
无论ADR位是否通过网络服务器向下传递,如果终端设备是静态的,最好的做法是尝试实现ADR。
为了实现ADR,终端设备需要做以下工作:
通过向上传递ADR位,通知网络服务器它能够并且准备使用ADR。欲知详情,请浏览通知网络服务器端设备准备使用ADR本文档的一部分。
监听链路ADR请求(
LinkADRReq
)下行链路的MAC命令。如果可能,实现更改,并响应网络服务器。看到ADR MAC命令处理为更多的信息。一旦修改了默认设置,就实现ADR回退(以防新设置使终端设备无法再次与网络服务器通信)。有关更多信息,请参见ADR补偿.
即使终端设备不使用ADR(例如,如果它是移动设备),它仍然应该侦听forLinkADRReq
MAC命令在下行链路,并接受和实现通道掩码控制的变化。
通知网络服务器端设备准备使用ADR¶
终端设备通过在上行链路上设置ADR位来表示能够并且准备使用ADR。ADR位在帧控制中传递(FCtrl)字段,如下图所示。
设置ADR位表示终端设备准备使用ADR。只有当设备是移动的,因此无法实现ADR时,才会取消ADR位。
ADR MAC命令处理¶
即使终端设备没有在上行链路中传递ADR,也应该处理ADR MAC命令。即使没有使用ADR的移动设备也应该在ADR MAC命令中响应来自网络服务器的请求来更新它们的通道计划。
在本节中,我们将根据LoRaWAN 1.0.4规范描述ADR MAC命令以及如何处理它们。你不需要自己处理这些命令,除非你在你的终端设备上写你自己的LoRaWAN堆栈。但是,您可以通过检查数据包并将它们与下面的规范进行比较来验证您所使用的库是否实现了ADR。
ADR MAC命令通过下行链路传递到终端设备,与所有MAC命令的传递方式相同。有两种方法可以用来发送MAC命令:要么在帧选项(录像)字段的同时,其他数据被发送到帧负载(FRMPayload),或者在帧负载内部作为一个单独的下行链路。
当MAC命令与其他数据一起在下行链路上发送时(也称为肩扛),帧选项长度(FOptsLen)字段的值将被设置为大于0(0)的值录像字段。控件中的命令录像字段将不加密。
当MAC命令在一个单独的下行链路发送时,帧端口(FPort)字段被设置为0,并且FRMPayload字段中包含MAC命令。此外,录像字段将不存在,并且FOptsLen字段将被设置为0。
MAC命令可以单独发送,也可以同时发送一组MAC命令。所有MAC命令都以一个字节开头,该字节包含一个命令标识符(CID),该标识符表示在随后的字节中跟随哪个MAC命令类型。以下字节的长度取决于上述CID中标识的MAC命令类型。Link ADR Request MAC命令(LinkADRReq
)由CID识别0 x03
的结构,并且有另外四个八位元,如下图所示LinkADRReq
命令。
如上图所示,这些是感兴趣的字段LinkADRReq
MAC命令:
数据率(DataRate),在请求数据速率和TX输出功率(DataRate_TXPower)字段
LinkADRReq
命令。这表示终端设备在发送上行链路时应该使用的新数据速率。看到处理数据速率更新为更多的信息。TX输出功率(TXPower),在DataRate_TXPower字段
LinkADRReq
命令。这表示终端设备在发送上行链路时应该使用的新的TX功率。看到处理TX输出功率更新为更多的信息。通道掩码控制(ChMaskCntl)冗余字段和通道掩码(ChMask)字段
LinkADRReq
命令。这些指示了终端设备在发送上行链路时应该使用的通道。看到处理通道掩码更新为更多的信息。每上行帧传送次数(NBTrans),在冗余字段
LinkADRReq
命令。表示每个上行链路应该重传的次数。看到处理NBTrans更新为更多的信息。
终端设备响应LinkADRReq
命令,发送Link ADR Answer (LinkADRAns
) MAC命令返回到网络服务器。一个LinkADRAns
由两个八位元组成。第一个字段为CID,表示MAC命令类型。第二个是Status八位元组,表示接受了哪些请求的更改。
处理LinkADRReq MAC命令并使用LinkADRAns响应¶
处理a的步骤LinkADRReq
MAC命令是一个还是多个LinkADRReq
下行链路发送命令。
如果有多个LinkADRReq
下行链路中的命令,除了最后一条命令外,block中的每一条命令都会执行如下操作:
处理通道掩码控制和通道掩码更新,如果提供。即使终端设备未使用ADR,且上行链路中未通过ADR位,也要这样做。
中进行了通道掩码更新
LinkADRReq
,回答LinkADRAns
命令,接受或拒绝通道掩码更新。
如果有一个LinkADRReq
在下行链路中,或者如果这是多个块中的最后一个命令LinkADRReq
命令,执行如下操作:
检查数据速率、TX输出功率和NBTrans更新命令,并根据本节中的指导确定是否可以应用每个命令处理TX输出功率更新,处理数据速率更新,处理NBTrans更新在下面。
检查通道掩码控制和通道掩码更新,并确定是否可能应用所请求的更改,请遵循指导处理通道掩码更新.
下一步取决于你是否在上行中通过了ADR位:
如果上行链路中终端设备的ADR位通过:
如果所有的更新都可以应用:
应用所有更新并响应
LinkADRAns
命令接受请求的更新。如果任何更新不能应用:
不应用任何更新和响应
LinkADRAns
命令拒绝请求的更新。
如果上行链路中终端设备没有通过ADR位:
如果可以应用信道掩码控制和信道掩码更新:
应用更新并响应
LinkADRAns
命令接受通道掩码控制和通道掩码更新ChannelMaskACK并拒绝请求的任何其他更新。如果不能应用信道掩码控制和信道掩码更新:
不应用更新并响应
LinkADRAns
命令拒绝所有请求的更新。
处理TX输出功率更新¶
TX输出功率配置(TXPower)在请求数据速率和TX输出功率(DataRate_TXPower)字段表示链路ADR请求MAC命令(LinkADRReq
)。当转换成小数时,这将是一个介于0和15之间的数字。
您需要将消息中的TX输出功率映射到真实的配置。该映射取决于您的区域,并在最新的LoRaWAN区域参数文档中指定。找到标题为数据速率和终端设备输出功率编码你的地区。表10RP002-1.0.3 LoRaWAN区域参数文档中显示了EU863配置的TXPower代码。
如果TX输出功率指定在
LinkADRReq
是一种动力端设备可以使用的:如果满足其他条件(如本节所述)处理LinkADRReq MAC命令并使用LinkADRAns响应),则端设备应设置为在指定的TX输出功率下运行。
当发送
LinkADRAns
命令,如果满足其他条件(如处理LinkADRReq MAC命令并使用LinkADRAns响应),命令就会被接受PowerACK位应设置为1以确认您能够接受请求。
如果TX输出功率指定在
LinkADRReq
是比终端设备可以使用的更高的TX输出功率:如果满足其他条件(如本节所述)处理LinkADRReq MAC命令并使用LinkADRAns响应),那么末端装置应设置为运行在其可能的最高功率。
当发送
LinkADRAns
命令,如果满足其他条件(如本节所述)处理LinkADRReq MAC命令并使用LinkADRAns响应),命令就会被接受PowerACK位应设置为1以确认您能够接受请求,即使实际功率级别将低于请求的功率级别。
如果TX输出功率指定在
LinkADRReq
命令的TX输出功率低于终端设备所能使用的功率:终端设备应该在之前配置的TX输出功率下继续运行。
当发送
LinkADRAns
命令,PowerACK位不应该被设置。由于您无法接受此更新,在必须同时接受或拒绝所有请求的情况下,您可能无法接受其他请求。阅读更多关于处理请求组合的信息处理LinkADRReq MAC命令并使用LinkADRAns响应.
如果TX输出功率为15 (0xF):
忽略这一领域;认为这是相同的,如果没有请求改变TX输出功率。终端设备应该在之前配置的TX输出功率下继续工作。
处理数据速率更新¶
数据速率配置(DataRate)在请求数据速率和TX输出功率(DataRate_TXPowerLink ADR Request MAC命令(LinkADRReq
当转换成小数时,这将是一个介于0和15之间的数字。
您需要将消息中的数据速率映射到特定的配置。该配置取决于您的区域,可以在最新的LoRaWAN区域参数文档中找到。例如,请参见下面的RP002-1.0.3 LoRaWAN区域参数文档中的表8。找到标题为数据速率和终端设备输出功率编码),用于您的终端设备将部署的区域。
如果消息中指定的数据速率是0到14之间的数字:
检查
LinkADRReq
命令获取任何通道掩码控制和通道掩码更新,如处理通道掩码更新,并确保在此请求中启用的通道支持所请求的数据速率。
如果可以支持请求的数据速率:
如果满足其他条件,(如处理LinkADRReq MAC命令并使用LinkADRAns响应),则终端设备应设置为按指定的数据速率运行。
当发送
LinkADRAns
,如果满足其他条件(如本节所述)处理LinkADRReq MAC命令并使用LinkADRAns响应),命令就会被接受DataRateACK位应该设置为1,以确认成功设置了数据速率。
如果请求的数据速率不支持:
终端设备应该继续以先前配置的数据速率运行。
当发送
LinkADRAns
命令,DataRateACK位不应该被设置。由于您无法接受此更新,在必须同时接受或拒绝所有请求的情况下,您可能无法接受其他请求。阅读更多关于处理请求组合的信息处理LinkADRReq MAC命令并使用LinkADRAns响应.
如果数据速率是15 (0xF)
忽略这一领域。这与没有请求更改数据速率是一样的。终端设备应该继续以先前配置的数据速率运行。
处理通道掩码更新¶
通道掩码控制(ChMaskCntl)是在冗余Link ADR Request MAC命令(LinkADRReq
)。通道掩码(ChMask)是在ChMask场的LinkADRReq
命令。通道掩码控制定义了应该如何解释通道掩码。当转换为十进制时,通道掩码控制将是0到7之间的数字。
通道掩码控制字段的含义取决于终端设备运行的区域,可以在最新的LoRaWAN区域参数文档中找到。找到标题为LinkAdrReq命令用于终端设备部署的区域。
对于EU863-870,文件解释如下:
一个ChMaskCntl值0指示末端设备检查ChMask字段,以知道在通道0和15之间打开和关闭哪些通道。
一个ChMaskCntl值6指示终端设备打开所有通道,并忽略ChMask字段。
对于us902 - 928,ChMaskCntl更改通道组ChMask应适用于RP002-1.0.3 LoRaWAN区域参数文件表19所示:
从EU863-870和US902-928的区别可以看出检查的重要性ChMaskCntl以及使用LoRaWAN区域参数文档来解释输出。
通道掩码字段是一个位掩码,它定义了通道掩码控制所识别的哪些通道应该用于发送上行链路。可用通道用“1”表示。位设置为0意味着不应该使用通道。位0用来识别通道1,位15用来识别通道16。如果位掩码为1000000000000001
那么只能使用1频道和16频道。
如果“通道掩码控制”和“通道掩码”使能已定义且可启用的通道:
检查
LinkADRReq
命令用于任何数据速率和TX输出功率更新,如本节所述处理数据速率更新而且处理TX输出功率更新,并确保所请求的通道与产生的数据速率和TX输出功率相兼容。
如果通道请求被启用与产生的数据速率和TX输出功率兼容:
如果满足其他条件(如处理LinkADRReq MAC命令并使用LinkADRAns响应)时,终端设备通道应启用。
当发送
LinkADRAns
,如果满足其他条件(如处理LinkADRReq MAC命令并使用LinkADRAns响应),命令就会被接受ChannelMaskACK位应设置为1以确认您能够接受请求。
如果请求启用的通道是不兼容产生的数据速率和TX输出功率:
终端设备通道应该保持不变。
当发送
LinkADRAns
命令,ChannelMaskACK不应设置。如果请求数据速率更新,则DataRateACK不应设置。如果请求了TX输出,则PowerACK不应设置。
如果通道掩码控制和通道掩码导致所有通道被禁用,或启用未定义的通道:
终端设备通道应该保持不变。
当发送
LinkADRAns
命令,ChannelMaskACK不应设置。由于您无法接受此更新,在必须同时接受或拒绝所有请求的情况下,您可能无法接受其他请求。阅读更多关于处理请求组合的信息处理LinkADRReq MAC命令并使用LinkADRAns响应.
处理NBTrans更新¶
每上行帧传送的数目(NBTrans)字段在冗余Link ADR Request MAC命令(LinkADRReq
)。转换为小数时NBTrans字段将是0到15之间的数字。
的NBTrans字段告诉终端设备每个上行帧应该传输多少次。网络服务器使用此设置来增加和减少重传次数,以控制网络流量和冗余。
的映射。NBTrans字段如下:
0:采用默认值NBTrans,等于1。
1-15:使用设定值,因此为1,发送一次,为2,发送两次,最多15次。
如果使用大于1的值,发送上行链路时还需要遵循以下规则:
照常使用跳频。
在重传之前等待,直到RX2过期。
当在RX1或RX2期间收到下行链路时,停止重传相同的上行帧。
ADR补偿¶
一旦终端设备不再使用缺省的TX输出功率、数据速率、通道计划或NBTrans,则实现ADR回退。
请注意
即使设备是移动的,不实施ADR,渠道计划仍然可以修改,所以ADR backoff仍应使用。
你不需要自己实现ADR回退(除非你在你的终端设备上写你自己的LoRaWAN堆栈)。但是,您可以通过检查数据包并将它们与下面的规范进行比较来验证您所使用的库是否正确地实现了ADR回退。
在整个过程中,您需要在终端设备上存储和更新三个变量。
ADR_ACK_LIMIT:通过设置强制网络响应之前,终端设备发送的没有收到响应的唯一上行链路总数ADRACKReq一些。这个数字在区域参数文档中定义默认设置.在RP002-1.0.3版本中,ADR_ACK_LIMIT设置为64。
ADR_ACK_DELAY:不包含响应的下行帧的总数ADRACKReq在尝试恢复连接之前将被容忍的位。网络服务器需要在内部响应ADR_ACK_DELAY后的下行帧ADRACKReq一些设置。因此,网络服务器和终端设备应该使用相同的设置。这个数字在区域参数文档中定义默认设置.在RP002-1.0.3版本,ADR_ACK_DELAY设置为32。
ADRACKCnt:统计下行链路未接收到上行链路时发送上行链路数的计数器。它一开始被设为0。
请注意
LoRaWAN 1.1允许ADR_ACK_LIMIT而且ADR_ACK_DELAY由网络服务器定义,并在OTAA过程中传递给终端设备。已有MAC命令修改ADR_ACK_LIMIT而且ADR_ACK_DELAY,使用ADRParamSetupReq
而且ADRParamSetupAns
,因此这些应该分别默认为64和32,然后应该根据ADRParamSetupReq
如果实现LoRaWAN 1.1版本。
ADR补偿流¶
每当应用程序修改默认设置以响应LinkADRReq
MAC命令,设置ADRACKCnt设置为0并重新启动该流。
当发送一个新的上行帧时,LoRaWAN标准要求您增加上行帧计数器。当你增加上行链路帧计数器时,就增加ADRACKCnt1。
发送上行链路后,打开两个接收(RX)窗口以允许您处理服务器响应。当第二个RX窗口关闭时,下一步取决于终端设备是否在两个RX窗口中收到下行响应。
如果终端设备在两个RX窗口中都没有收到响应:
如ADR确认请求(ADRACKReq)位目前没有在上行链路上设置,也就是说,如果终端设备还没有专门请求服务器的响应:
如果ADRACKCnt > = ADR_ACK_LIMIT,也就是说,如果ADR_ACK_LIMIT(64)上行链路已经发送,但没有收到响应:
设置ADRACKReq所有上行传输的位。这通知服务器端设备希望服务器响应上行链路。
的位置ADRACKReq从端设备发送到网络服务器的上行链路中的位
如果ADRACKReq位当前正在上行链路上设置,例如,如果终端设备正在请求服务器的响应:
如果ADRACKCnt >= ADR_ACK_LIMIT + ADR_ACK_DELAY,即在the之后ADR_ACK_LIMIT(64)上行链路没有响应ADRACKReq位被设置为请求服务器的响应,此后一直存在ADR_ACK_DELAY(32)没有服务器响应的附加上行链路:
将操作区域的TX功率设置为默认设置,请参见本节默认的发射功率.
当一个进一步ADR_ACK_DELAY(32)额外的上行链路已经发送,但没有收到服务器的响应:
将您所在区域的数据速率更改为下一个较低的数据速率。要使用的下一个数据速率在最近的LoRaWAN区域参数文档中指定,在您的区域的标题部分中数据速率和终端设备输出功率编码.例如,如果您的设备的目标是EU863-870区域,并且您正在引用文档RP002-1.0.3,您将参阅第2.4.3节,EU863-870数据速率和终端设备输出功率编码,在第26页。
如果终端设备已经以尽可能低的数据速率运行,则跳过步骤4。
重复步骤2,每次都进一步降低数据速率ADR_ACK_DELAY额外的上行链路已经发送,但没有服务器的响应,直到你达到可能的最低数据速率。
当下一次ADR_ACK_DELAY(32)额外的上行链路已经发送,但没有收到服务器的响应:
如果终端设备在两个RX窗口中收到了响应,或者在ADR回退期间的任何一点,终端设备收到了下行链路:
重置ADRACKCnt为0。这将重新启动回退流。
清除ADRACKReq位,如果当前正在设置。
下表为EU863地区的设备ADR回退示例。
ADRACKCnt |
ADRACKReq |
数据速率 |
发射功率 |
NbTrans |
渠道 |
---|---|---|---|---|---|
0到63 |
0 |
DR2 |
马克斯9 dBm |
3. |
使用通道掩码 |
64 |
更改为1 |
DR2 |
马克斯9 dBm |
3. |
使用通道掩码 |
65年到95年 |
1 |
DR2 |
马克斯9 dBm |
3. |
使用通道掩码 |
96 |
1 |
DR2 |
更改为默认值,例如Max -14 dBm |
3. |
使用通道掩码 |
97年到127年 |
1 |
DR2 |
Max -14 dBm |
3. |
使用通道掩码 |
128 |
1 |
改为根据DR1 |
Max -14 dBm |
3. |
使用通道掩码 |
129年到159年 |
1 |
根据DR1 |
Max -14 dBm |
3. |
使用通道掩码 |
160 |
1 |
改为DR0 |
Max -14 dBm |
3. |
使用通道掩码 |
161年到191年 |
1 |
DR0 |
Max -14 dBm |
3. |
使用通道掩码 |
192 |
1 |
DR0 |
Max -14 dBm |
更改为1 |
更改为默认通道 |
193开始,直到重新连接 |
1 |
DR0 |
Max -14 dBm |
1 |
默认频道 |
结论¶
在本文中,您了解了什么是ADR,使用ADR的最佳实践,以及如何在终端设备上实现ADR。无论您是使用开源的LoRaWAN软件包还是您自己的软件来处理LoRa的MAC层和ADR,您都可以验证您的软件是否正确地将ADR位传递给网络服务器,进行处理LinkADRReq
MAC命令,实现ADR回退。
读了LoRaWAN链路层规格下载并阅读LoRaWAN区域参数文档LoRaWAN开发商联盟页面了解LoRa MAC层的其他方面,并查看本文的源材料。
下载LoRaMac-Node查看在C中LoRaWAN链路层规范1.0.4的LoRaWAN MAC层实现中如何实现ADR的示例。