• LoRaWAN 规范 1.0 (章节5)


    最近在做LoRa, LoRaWAN协议略微复杂,边读边翻译,现在把部分关键的翻译分享给各位做物联网的同行。
    当然里面掺杂了一些我的个人笔记,希望对大家有所帮助。
    如果哪里有问题,欢迎应各位留言或者邮件指正。

    翻译很辛苦,转载请注明出处和源链接

    声明

    本文翻译版本已更新至LoRaWAN 1.0.2

    5 MAC Commands

    网络管理时会在网络服务器和终端MAC层之间传输一系列MAC命令。MAC层命令对应用、应用服务器以及终端设备上的应用永不可见。

    一帧数据中可以包含任何MAC命令序列,MAC命令既可以放在FOpts中和正常数据一起发送;也可以放在FRMPayload中单独发送,此时FPort = 0,但不能同时在两个字段携带MAC命令。放在FOpts中的MAC命令不加密,并且不能超过15个字节。放在FRMPayload中的MAC命令必须加密,同时不能超过FRMPayload的最大长度。

    注意:

    不想被别人截获破解的命令要放到FRMPayload中单独发送

    一条MAC命令由一个字节的命令ID(CID)和特定的命令序列组成,命令序列可以是空。

    CID 命 令 终端发送 网关发送 简介
    0x02 LinkCheckReq × 用于终端验证网络连接
    0x02 LinkCheckAns × 回应验证请求, 同时包含终端接收质量相关的估算的信号功率
    0x03 LinkADRReq × 请求终端改变数据率、传输功率、接收率或者信道
    0x03 LinkADRAns × LinkRateReq的应答
    0x04 DutyCycleReq × 设置设备的最大总发射占空比
    0x04 DutyCycleAns × DutyCycleReq的应答
    0x05 RXParamSetupReq × 设置接收时隙相关参数
    0x05 RXParamSetupAns × RXSetupReq的应答
    0x06 DevStatusReq × 请求终端状态
    0x06 DevStatusAns × 返回终端装填,即电量和解调情况
    0x07 NewChannelReq × 创建或修改无线电信道
    0x07 NewChannelAns × NewChannelReq的应答
    0x08 RXTimingSetupReq × 设置接收时隙的时间
    0x08 RXTimingSetupAns × RXTimingSetupReq的应答
    0x09 TxParamSetupReq x 网络服务器用它来设置终端设备停留时间的最大值和最大EIRP(等效全向辐射功率),与地域相关
    0x09 TxParamSetupAns x TxParamSetupReq命令的回复
    0x0A DlChannelReq x 通过将下行频率与上行频率进行偏移,来修改下行R1的无线信道(即:创建不对称信道)
    0x0A DlChannelAns x DlChannelReq命令的回复
    0x80 ~ 0xFF Proprietary × × 保留命令

    注:

    MAC命令长度不固定,这就要求MAC命令执行端必须隐式获知。因为无法忽略不明的MAC命令,而且一旦遇到不明的MAC命令,就会导致处理MAC命令队列的进程终止。因此,建议遵循首先对MAC命令进行说明的LoRaWAN规范。这样的话,所有当前版本LoRaWAN规范中实现的MAC命令都可以被更高版本的规范兼容处理。

    注:

    终端设备所有被网络服务器调整过的内容(例如:RX2,新创建或调整过的信道)仅在下次入网前有效。因此,终端设备每次重新入网之后都会使用默认参数配置,而网络服务器则根据需要对这些值重新调整。

    5.1 链路检查 (LinkCheckReqLinkCheckAns

    终端使用LinkCheckReq命令检查与网络的连通性,该命令不含荷载(payload)。

    网络服务器收到(一个或多个)网关转发过来的LinkCheckReq后回复一条LinkCheckAns命令。

    大小(字节) 1 1
    LinkCheckAns Payload Margin GwCnt

    Margin(解调余量)是最近一条被成功收到的 LinkCheckReq 命令的链路预算(单位dB),是一个8位(bits)无符号整型,范围 [0,254]。值为 0 表示在解调的下限(0dB或者没有余量)上收到了数据,值20表示网关在比解调下限高出 20 dB 的信号强度上收到了数据。255是保留值

    GwCnt是最近一次成功收到 LinkCheckReq 的网关的数量。

    link margin参考:Link margin

    5.2 速率自适应 LinkADRReqLinkADRAns

    网络服务器通过发送 LinkADRReq 命令对终端设备速率进行调整。

    大小(字节) 1 2 1
    LinkADRReq Payload DataRate_TXPower ChMask Redundancy

    大小(位 bits) [7:4] [3:0]
    DataRate_TXPower DataRate TXPower

    数据速率(DataRate)以及TX输出功率(TXPower)和地理区域相关,参考《LoRaWAN地域相关参数手册》(《LoRaWAN Regional Parameters document》)。命令中的TX输出功率指的是设备可以使用的最大发射功率。指定一个能够使用的比当前在使用的更高的功率的命令执行成功后,此时,终端设备将使用尽可能大(不超过命令设置以及物理允许的范围)的功率回复确认消息。信道掩码(ChMask)通过对最低有效位相应的位置填0来对上行信道的可用性进行编码,信道列表如下:

    对应原文:
    An end-device will acknowledge as successful a command which specifies a higher transmit power than it is capable of using and should, in that case, operate at its maximum possible power.

    表5:信道状态表

    第几位 可用信道
    0 Channel 1
    1 Channel 2
    .. ..
    15 Channel 16

    ChMask中某位是1,表示启用该位对应的上行信道(用来进行上行传输的信道),只有终端设备当前使用的数据速率可以在该信道上使用时,该信道才可以使用;如果是0,则表示对应的上行信道不可用。终端设备当前使用的信道要设为1

    第几位 7 [6:4] [3:0]
    Redundancy bits RFU ChMaskCntl NbTrans

    冗余(Redundancy)位中,NbTrans表示每条上行消息重复发送的次数,仅用于 unconfirmed 类型的上行消息。默认值为1,表示每帧只上传一次。有效范围 [1:15]。终端设备收到NbTrans == 0时仍然使用默认值。网络管理员通过控制节点的上行冗余来保证给定的服务质量。终端设备在重传期间照常跳频,每次重传后也会等待接收数据,直到接收窗口过期。在RX1短暂窗口期间的任一时刻接收到下行消息都会停止该消息的重传。对于A类来说,RX2情况与RX1相同。

    信道掩码控制(ChMaskCntl)字段负责控制ChMask的掩码位。当网络上信道的实现超过16个,该字段必须是一个非0值。用它来控制ChMask使用哪16个信道,还可以用它来全局性的打开或关闭指定调制方式的所有信道。该字段的具体使用和地域相关,具体见《LoRaWAN地域相关参数手册》。

    网络服务器可能会在一条下行消息中包含多个LinkAdrReq命令。终端设备为了配置信道掩码,会按照命令在下行消息中的出现的顺序处理所有LinkAdrReq消息。对于命令中的这些ChMaskCntl,终端设备要么全部接受要么全部拒绝,同时为它们的 LinkAdrAns 设置相同的 Channel Mask ACK 。对于 DataRateTXPowerNbTrans ,因为它们是全局性设置(后面的值会覆盖前面的值),所以终端设备只按照命令中的最后一条LinkADRReq执行。同样,对于这些,终端设备也会为它们在 LinkAdrAns 中各自设置相同的 ACK,来指明它们最终被接受了还是被拒绝了。

    信道频率与地域有关,具体见第六章。

    终端收到 LinkADRReq 后回复 LinkADRAns 命令。

    大小(字节) 1
    LinkADRAns Payload Status

    大小(位) [7:3] 2 1 0
    Status bits RFU Power ACK Data rate ACK Channel mask ACK

    LinkADRAns Status释义如下:

    表6:LinkADRAns状态位定义

    字段 0 1
    Channel mask ACK 要使用的信道未定义;或信道掩码想关闭所有信道。忽略该命令,终端状态不改变 设置成功
    Data rate ACK 要使用的速率未定义;或者在指定的通道掩码下,不支持该数据速率(所有在用的信道都不支持该速率)。命令被忽略,终端状态不改变 设置成功
    Power ACK 终端未定义该功率等级。命令被忽略,终端状态不改变 设置成功

    以上三个字段任意一个是0,命令就会执行失败,节点保持之前的状态不变。

    5.3 终端的发射占空比(DutyCycleReqDutyCycleAns

    DutyCycleReq,网络协调员使用该命令来限制终端设备的总发射占空比的最大值。总发射占空比指所有子频带的发射占空比。

    大小(字节) 1
    DutyCycleReq Payload DutyCyclePL

    Bits 7:4 3:0
    DutyCyclePL RFU MaxDCycle

    终端允许的发射占空比的最大值:

    =12MaxDCycle

    MaxDutyCycle有效范围[0:15]。在没有区域调节设置占空比限制的情况下,使用 0 表示“占空比没有限制”,有区域限制的除外。

    注意,下面这条在LoRaWAN1.0.2中被删除:

    值为 255 时要求终端设备立刻转为静默状态,等价于远程关闭终端。

    终端收到DutyCycleReq后回复DutyCycleAnsDutyCycleAns不包含任何payload。

    5.4 接收窗口相关参数 (RXParamSetupReq,RXParamSetupAns)

    通过下发RXParamSetupReq命令,可以修改第二个接收窗口(RX2)使用的频率和数据速率。该命令还可以修改下行RX1数据速率,使下行RX1的速率相对上行进行偏移。

    大小(字节) 1 3
    RX2SetupReq Payload DLsettings Frequency

    第几位 7 6:4 3:0
    DLsettings RFU RX1DRoffset RX2DataRate

    RX1DRoffset 用来设置终端设备上行和下行第一个接收窗口(RX1)数据速率之间的偏移,默认值是0。基站在某些地域有最大功率密度限制,所以使用偏移,并且还可以用来均衡上行和下行的无线链路预算。

    RX2DataRate 定义第二个接收窗口使用的数据速率,用法和 LinkADRReq 一样(例如,0 表示 DR0/125kHz)。Frequency 是第二个接收窗口使用的信道频率,其频率编码规则的定义见 NewChannelReq 命令。

    终端设备回复 RXParamSetupAns。终端设备在没有收到基于A类的下行数据前,会在所有上行数据的 FOpt 中携带 RXParamSetupAns,直到收到一次基于A类的下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行链路参数。

    payload只有一个字节:

    大小(字节) 1
    RX2SetupAns Payload Status

    Status位结构如下:

    第几位 7:3 2 1 0
    Status bits RFU RX1DRoffset ACK RX2 Data rate ACK Channel ACK

    表 7: RX2SetupAns 的 status 含义

    字段 0 1
    Channel ACK (对于终端)频率不可用 RX2信道设置成功
    RX2 Data rate ACK (对于终端)未知的数据速率 RX2数据速率设置成功
    RX1DRoffset ACK RX1上行/下行数据速率的偏移不在可用范围 设置成功

    3个中的任何一个是0,命令都会执行失败并保持之前的状态。

    5.5 终端状态(DevStatusReq, DevStatusAns

    服务器通过发送 DevStatusReq 获取一个终端设备的状态,该命令没有payload。终端收到 DevStatusReq 之后回复DevStatusAns

    大小(字节) 1 1
    DevStatusAns payload Battery Margin

    电池电量(Battery)上报的数据编码如下:

    表8:电池电量编码

    电量 说明
    0 终端在使用外接电源
    1..254 电池电量,1是最小值,254是最大值
    255 终端设备无法获取电池电量

    余量(Margin)是最近一次接收成功 DevStatusReq 命令的解调信噪比,其值(四舍五入)取整,单位dB。余量值是一个有符号整型,长度6个比特位,最小值 -32,最大值31。

    占位(bits) 7:6 5:0
    Status RFU Margin

    5.6 创建或修改信道(NewChannelReq, NewChannelAns

    NewChannelReq命令要么用来修改已有信道的参数,要么创建一个新的信道。该命令设置新信道的中心频率,以及在该信道上行传输的数据速率范围。

    大小(字节) 1 3 1
    NewChannelReq payload ChIndex Freq DrRange

    信道索引(ChIndex)是新信道或者待修改信道的索引值。LoRaWAN规范中已经为不同的地域和频段内置了默认信道,这些信道存在所有的设备上,而且不能通过NewChannelReq(见第6章)进行修改。如果默认的信道数量是N,那默认的信道就是 0 ~ N-1,而 ChIndex 可用范围就是 N ~ 15。终端设备至少要能处理 16 个不同的信道。在某些地域终端允许存储超过16个信道。

    频率(Freq)是一个 24bits 无符号整型,实际信道频率是 100 × Freq Hz(笔记:按这个说法,433.1MHz 服务器发送的数据是 4331000),其中100MHz以下的值留待未来使用。通过这种方法可以以 100 Hz为步长,使用 100MHz~1.67GHz 之间任意的信道频率。 Freq == 0表示不使用该信道。终端设备必须对频率进行检查,保证它的射频硬件支持将要使用的频率,否则返回错误。

    数据速率范围(DrRange)指明此信道的数据速率范围。该字由两个4位长的索引组成:

    大小(bits) 7:4 3:0
    DrRange MaxDR MinDR

    根据章节5.2的定义,最小数据速率(MinDR)字段指定此信道最低数据速率,例如:0 表示指定 DR0/125 kHz。与之类似,最大数据速率指定最高数据速率。例如:DrRange = 0x77表示信道只能使用 50kbps GFSK,DrRange = 0x50表示数据速率范围是DR0 / 125 kHz 到 DR5 / 125 kHz。

    创建或修改的信道一旦设置成功,可以马上用来通信。RX1的下行频率与其上行频率相同。

    终端回复NewChannelAns命令,其payload如下:

    大小(字节) 1
    NewChannelAns Payload Status

    状态(Status)含义如下:

    大小(bits) 7:2 1 0
    Status RFU Data rate range ok Channel frequency ok
    字段 0 1
    Data rate range ok 数据速率范围超出终端当前所允许的范围 终端兼容该数据速率范围
    Channel frequency ok 终端无法使用该频率 可以使用

    两者之中有一个是0,就表示命令执行失败,不会创建信道。


    DlChannelReq允许服务器将一个不同的下行频率和RX1关联起来。所有支持 NewChannelReq 的地域也适用于 DlChannelReq (比如欧洲、中国,但美国和澳大利亚不可以,具体见《LoRaWAN地域相关参数》)

    该命令会设置下行RX1的中心频率:

    大小(字节) 1 3
    DlChannelReq Payload ChIndex Freq

    频率(Freq)是一个 24bits 无符号整型,实际信道频率是 100 × Freq Hz,其中100MHz以下的值留待未来使用。通过这种方法可以以 100 Hz为步长,使用 100MHz~1.67GHz 之间任意的信道频率。 Freq == 0表示不使用该信道。终端设备必须对频率进行检查,保证它的射频硬件支持将要使用的频率,否则返回错误。

    终端设备回复DlChannelAns。终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 DlChannelAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行频率。

    Payload包含以下信息:

    大小(字节) 1
    DlChannelAns Payload Status

    Status含义如下:

    Bits 7:2 1 0
    Status RFU Uplink frequency exists Channel frequency ok

    0 1
    Channel frequency ok 设备无法使用该频率
    Uplink frequency exists 该信道的上行频率未定义,下行频率只能给有效上行频率的信道设置

    5.7 Rx和Tx之间的延迟(RXTimingSetupReq,RXTimingSetupAns

    RXTimingSetupReq用来配置上行传输结束(一帧数据发送完成的时刻)到打开第一个接收窗口之间的时间间隔。第二个接收窗口比第一个晚1秒打开。

    大小(字节) 1
    RXTimingSetupReq Payload Settings

    延迟(Delay)字段指定时间间隔,由两个4位的索引组成:

    大小(bits) 7:4 3:0
    Settings RFU Del

    延迟单位是秒(s),Del=0 表示1秒:

    Del 延迟(秒)
    0 1
    1 1
    2 2
    3 3
    15 15

    终端设备回复RXTimingSetupAns,并且不携带payload。

    终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 RXTimingSetupAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行参数。

    5.7 Rx和Tx之间的延迟(RXTimingSetupReq,RXTimingSetupAns

    RXTimingSetupReq用来配置上行传输结束(一帧数据发送完成的时刻)到打开第一个接收窗口之间的时间间隔。第二个接收窗口比第一个晚1秒打开。

    大小(字节) 1
    RXTimingSetupReq Payload Settings

    延迟(Delay)字段指定时间间隔,由两个4位的索引组成:

    大小(bits) 7:4 3:0
    Settings RFU Del

    延迟单位是秒(s),Del=0 表示1秒:

    Del 延迟(秒)
    0 1
    1 1
    2 2
    3 3
    15 15

    终端设备回复RXTimingSetupAns,并且不携带payload。

    终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 RXTimingSetupAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行参数。

    5.8 终端发射参数(TxParamSetupReq,TxParamSetupAns)

    该MAC命令只在需要监管的区域执行,参考《LoRaWAN地域相关参数手册》。

    TxParamSetupReq命令可以用来通知终端设备其允许的最大驻留时间,比如:一个数据包在空中持续传输的最大时间,以及所允许的设备最大的EIRP(有效全向辐射功率)。

    大小(字节) 1
    TxParamSetup payload EIRP_DwellTime

    EIRP_DwellTime字段的结构如下:

    Bits 7:6 5 4 3:0
    MaxDwellTime RFU DownlinkDwellTime UplinkDwellTime MaxEIRP

    TxParamSetupReq的 [0:3] bits用来编码 Max EIRP值,见下表:

    编码值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
    Max EIRP(dBm) 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36

    设备无线传输的最大功率即为EIRP的最大值。设备不必使用该功率进行传输,可也不能超过该EIRP。第4、第5位定义上、下行链路最大的驻留时间 ,编码如下:

    编码值 驻留时间
    0 无限制
    1 400 ms

    该命令执行后,终端设备回复TxParamSetupAnsTxParamSetupAns不携带任何负载数据。如果在一个对此没有要求的地域使用该命令,设备不执行,并且不回复。

    PS

    看到有些伙伴提问问题,由于本人的CSDN一般不在线。

    为了方便交流,附个邮箱,有问题或者想法的朋友可以 给我写信


    知识共享许可协议 本文由 qingchuwudi 译制,除非另有声明,在不与原著版权冲突的前提下,本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。

  • 相关阅读:
    连接查询
    分组查询
    【转载】C语言 构建参数个数不固定函数
    【转载】vc编译exe的体积最小优化
    VC6微软正则表达式greta使用案例
    MultiByteToWideChar和WideCharToMultiByte
    【转载】VC操作剪切板
    VC/MFC分割字符串(SplitString)返回CStringArray
    【转载】实现UTF8与GB2312编码格式相互转换(VC)已经验证!
    VC6配置sqlite数据库
  • 原文地址:https://www.cnblogs.com/qingchuwudi/p/12077731.html
Copyright © 2020-2023  润新知