文档
首页»文档»技术文件»实现自适应数据速率(ADR)»实现自适应数据速率(ADR)

实现自适应数据速率(ADR)

这篇论文深入研究了LoRaWAN®的自适应数据速率(ADR)特性,用于终端设备软件开发人员和构建LoRa®设备的团队管理人员LoRaWAN链路层规格.您将了解什么是ADR,学习何时使用ADR的最佳实践,并学习如何在您的终端设备上实现它。

读完这篇文章后,你应该掌握了处理ADR所需的基础知识,从声明你的终端设备应该实现ADR,到处理网络服务器发送给终端设备的MAC命令,再到通过遵循ADR回退方案恢复与网络服务器的连接。

已经使用软件如LoRaMAC-Node™处理美国存托凭证吗?本文将为您提供一些背景知识,您需要了解软件是如何工作的,检查代码,并确信您的终端设备正在遵循LoRaWAN链路层规范中定义的标准和最佳实践。

ADR及其主要好处

自适应数据速率(Adaptive Data Rate, ADR)描述了网络服务器在发送上行链路时单独控制数据速率、射频传输功率、使用的信道以及网络中每一端设备的重发次数的方案。

网络服务器使用从终端设备接收到的消息的接收信号强度指示器(RSSI)来确定终端设备距离最近的网关有多近。这允许网络服务器为每个终端设备选择最合适的设置。

ADR的好处是它有助于保持终端设备的电池寿命,并减少干扰,使网络上所有终端设备成功通信的最佳机会。

决定何时实施ADR

如果你的设备总是静态的(即,在相同的固定位置),那么你应该总是使用ADR。

如果您的终端设备是移动的,例如,如果它是一个地理位置跟踪器,ADR将不适合您的用例。当ADR使用时,网络服务器使用上行链路接收到的信号强度来调整数据速率、TX功率和通道计划,以确定设备看起来离网关有多近或多远。如果设备在网络服务器计算和传输新设置之前移动,那么这些设置将不适用于新位置。

移动端设备不一定是连续运动的,当它们静止时,它们可能需要发送常规的上行消息。当设备处于静态状态时,使用ADR会有好处。如果可能的话,设计你的终端设备,让你的代码可以判断设备当前是否处于运动状态。如果您的终端设备可以确定其状态,那么您可以使用ADR时,设备是静态的,停止使用ADR时,设备是在运动。

如何实施ADR

网络服务器通过在下行链路上设置ADR位来表示在任何给定的时间是否支持ADR。ADR位在帧控制中传递(FCtrl)字段,如下图所示。

ADR位显示在帧头(FHDR)的帧控制(FCtrl)字段中

ADR位在网络服务器发送到终端设备的下行链路中的位置

当网络服务器支持ADR时设置,当网络服务器不支持ADR时不设置。通常情况下,网络服务器只是暂时挂起,以支持ADR。

无论ADR位是否通过网络服务器向下传递,如果终端设备是静态的,最好的做法是尝试实现ADR。

为了实现ADR,终端设备需要做以下工作:

  1. 通过向上传递ADR位,通知网络服务器它能够并且准备使用ADR。欲知详情,请浏览通知网络服务器端设备准备使用ADR本文档的一部分。

  2. 监听链路ADR请求(LinkADRReq)下行链路的MAC命令。如果可能,实现更改,并响应网络服务器。看到ADR MAC命令处理为更多的信息。

  3. 一旦修改了默认设置,就实现ADR回退(以防新设置使终端设备无法再次与网络服务器通信)。有关更多信息,请参见ADR补偿

即使终端设备不使用ADR(例如,如果它是移动设备),它仍然应该侦听forLinkADRReqMAC命令在下行链路,并接受和实现通道掩码控制的变化。

通知网络服务器端设备准备使用ADR

终端设备通过在上行链路上设置ADR位来表示能够并且准备使用ADR。ADR位在帧控制中传递(FCtrl)字段,如下图所示。

ADR位显示在帧报头(FHDR)的帧控制(FCtrl)字段中

ADR位在端设备发送到网络服务器的上行链路中的位置

设置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命令示意图

MAC命令通过常规的数据下行链路发送

当MAC命令在一个单独的下行链路发送时,帧端口(FPort)字段被设置为0,并且FRMPayload字段中包含MAC命令。此外,录像字段将不存在,并且FOptsLen字段将被设置为0。

图表说明MAC命令发送在一个单独的数据帧

MAC命令以单独的数据帧发送

MAC命令可以单独发送,也可以同时发送一组MAC命令。所有MAC命令都以一个字节开头,该字节包含一个命令标识符(CID),该标识符表示在随后的字节中跟随哪个MAC命令类型。以下字节的长度取决于上述CID中标识的MAC命令类型。Link ADR Request MAC命令(LinkADRReq)由CID识别0 x03的结构,并且有另外四个八位元,如下图所示LinkADRReq命令。

LinkADRReq MAC命令结构示意图

的结构LinkADRReqMAC命令

如上图所示,这些是感兴趣的字段LinkADRReqMAC命令:

  • 数据率(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八位元组,表示接受了哪些请求的更改。

LinkADRAns MAC命令的结构示意图

的结构LinkADRAnsMAC命令

处理LinkADRReq MAC命令并使用LinkADRAns响应

处理a的步骤LinkADRReqMAC命令是一个还是多个LinkADRReq下行链路发送命令。

如果有多个LinkADRReq下行链路中的命令,除了最后一条命令外,block中的每一条命令都会执行如下操作:

  1. 处理通道掩码控制和通道掩码更新,如果提供。即使终端设备未使用ADR,且上行链路中未通过ADR位,也要这样做。

  2. 中进行了通道掩码更新LinkADRReq,回答LinkADRAns命令,接受或拒绝通道掩码更新。

如果有一个LinkADRReq在下行链路中,或者如果这是多个块中的最后一个命令LinkADRReq命令,执行如下操作:

  1. 检查数据速率、TX输出功率和NBTrans更新命令,并根据本节中的指导确定是否可以应用每个命令处理TX输出功率更新处理数据速率更新,处理NBTrans更新在下面。

  2. 检查通道掩码控制和通道掩码更新,并确定是否可能应用所请求的更改,请遵循指导处理通道掩码更新

  3. 下一步取决于你是否在上行中通过了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代码。

TXPower代码与EU863配置的对应关系。来源RP002-1.0.3 LoRaWAN区域参数

TXPower代码与EU863配置的对应关系。【来源:RP002-1.0.3 LoRaWAN
区域参数)

  • 如果TX输出功率指定在LinkADRReq是一种动力端设备可以使用的:

  • 如果TX输出功率指定在LinkADRReq是比终端设备可以使用的更高的TX输出功率:

  • 如果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。找到标题为数据速率和终端设备输出功率编码),用于您的终端设备将部署的区域。

EU863-870配置的“数据速率码”对应关系如表所示。来源:RP002-1.0.3 LoRaWAN区域参数

EU863-870配置的“数据速率码”对应关系如表所示。[来源:RP002-1.0.3 LoRaWAN区域参数]

  • 如果消息中指定的数据速率是0到14之间的数字:

    • 检查LinkADRReq命令获取任何通道掩码控制和通道掩码更新,如处理通道掩码更新,并确保在此请求中启用的通道支持所请求的数据速率。

    如果可以支持请求的数据速率:

    如果请求的数据速率不支持:

    • 终端设备应该继续以先前配置的数据速率运行。

    • 当发送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所示:

表中显示了ChMaskCntl与US902-928的映射配置。来源:RP002-1.0.3 LoRaWAN区域参数

的映射表ChMaskCntl到US902-928配置。[来源:RP002-1.0.3 LoRaWAN区域参数]

从EU863-870和US902-928的区别可以看出检查的重要性ChMaskCntl以及使用LoRaWAN区域参数文档来解释输出。

通道掩码字段是一个位掩码,它定义了通道掩码控制所识别的哪些通道应该用于发送上行链路。可用通道用“1”表示。位设置为0意味着不应该使用通道。位0用来识别通道1,位15用来识别通道16。如果位掩码为1000000000000001那么只能使用1频道和16频道。

  • 如果“通道掩码控制”和“通道掩码”使能已定义且可启用的通道:

    如果通道请求被启用与产生的数据速率和TX输出功率兼容:

    如果请求启用的通道是兼容产生的数据速率和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的值,发送上行链路时还需要遵循以下规则:

  1. 照常使用跳频。

  2. 在重传之前等待,直到RX2过期。

  3. 当在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补偿流

每当应用程序修改默认设置以响应LinkADRReqMAC命令,设置ADRACKCnt设置为0并重新启动该流。

当发送一个新的上行帧时,LoRaWAN标准要求您增加上行帧计数器。当你增加上行链路帧计数器时,就增加ADRACKCnt1。

发送上行链路后,打开两个接收(RX)窗口以允许您处理服务器响应。当第二个RX窗口关闭时,下一步取决于终端设备是否在两个RX窗口中收到下行响应。

如果终端设备在两个RX窗口中都没有收到响应:

  • 如ADR确认请求(ADRACKReq)位目前没有在上行链路上设置,也就是说,如果终端设备还没有专门请求服务器的响应:

    • 如果ADRACKCnt > = ADR_ACK_LIMIT,也就是说,如果ADR_ACK_LIMIT(64)上行链路已经发送,但没有收到响应:

      • 设置ADRACKReq所有上行传输的位。这通知服务器端设备希望服务器响应上行链路。

      在帧头(FHDR)的帧控制(FCtrl)字段中显示的ADRACKReq位

      的位置ADRACKReq从端设备发送到网络服务器的上行链路中的位

  • 如果ADRACKReq位当前正在上行链路上设置,例如,如果终端设备正在请求服务器的响应:

    1. 如果ADRACKCnt >= ADR_ACK_LIMIT + ADR_ACK_DELAY,即在the之后ADR_ACK_LIMIT(64)上行链路没有响应ADRACKReq位被设置为请求服务器的响应,此后一直存在ADR_ACK_DELAY(32)没有服务器响应的附加上行链路:

    2. 当一个进一步ADR_ACK_DELAY(32)额外的上行链路已经发送,但没有收到服务器的响应:

      • 将您所在区域的数据速率更改为下一个较低的数据速率。要使用的下一个数据速率在最近的LoRaWAN区域参数文档中指定,在您的区域的标题部分中数据速率和终端设备输出功率编码.例如,如果您的设备的目标是EU863-870区域,并且您正在引用文档RP002-1.0.3,您将参阅第2.4.3节,EU863-870数据速率和终端设备输出功率编码,在第26页。

      如果终端设备已经以尽可能低的数据速率运行,则跳过步骤4。

    3. 重复步骤2,每次都进一步降低数据速率ADR_ACK_DELAY额外的上行链路已经发送,但没有服务器的响应,直到你达到可能的最低数据速率。

    4. 当下一次ADR_ACK_DELAY(32)额外的上行链路已经发送,但没有收到服务器的响应:

      • 重置NbTrans中描述的默认设置默认重传次数

      • 如果设备的区域使用动态通道计划;设置通道规划为操作区域的默认设置默认频道.如果设备所在区域使用固定的通道规划,则需要启用所有通道。检查区域参数汇总表在最新的区域参数文档中找出你的设备运行在哪个区域类型。

    • 如果在任何一点上,上述设置导致TX功率、数据速率或通道掩码的无效组合:

      • 将发送功率设置为操作区域的默认设置,请参见默认的发射功率

      • 重置NbTrans设置为默认设置,如默认重传次数

      • 如果设备的区域使用动态通道计划;设置通道规划为操作区域的默认设置默认频道.如果设备所在区域使用固定的通道规划,则需要启用所有通道。

如果终端设备在两个RX窗口中收到了响应,或者在ADR回退期间的任何一点,终端设备收到了下行链路:

  • 重置ADRACKCnt为0。这将重新启动回退流。

  • 清除ADRACKReq位,如果当前正在设置。

下表为EU863地区的设备ADR回退示例。

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位传递给网络服务器,进行处理LinkADRReqMAC命令,实现ADR回退。

读了LoRaWAN链路层规格下载并阅读LoRaWAN区域参数文档LoRaWAN开发商联盟页面了解LoRa MAC层的其他方面,并查看本文的源材料。

下载LoRaMac-Node查看在C中LoRaWAN链路层规范1.0.4的LoRaWAN MAC层实现中如何实现ADR的示例。

Baidu
map