最近在做LoRa, LoRaWAN協議略微複雜,邊讀邊翻譯,現在把
部分關鍵的翻譯分享給各位做物聯網的同行。
當然裏面摻雜了一些我的個人筆記,希望對大家有所幫助。
如果哪裏有問題,歡迎應各位留言或者郵件指正。翻譯很辛苦,轉載請註明出處和源鏈接
- 英文原文鏈接: 《LoRaWAN Specification 1R0》
- 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 鏈路檢查 (LinkCheckReq和LinkCheckAns)
終端使用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 速率自適應 LinkADRReq
和LinkADRAns
網絡服務器通過發送 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 。對於 DataRate、TXPower 和 NbTrans ,因爲它們是全局性設置(後面的值會覆蓋前面的值),所以終端設備只按照命令中的最後一條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 終端的發射佔空比(DutyCycleReq
和 DutyCycleAns
)
DutyCycleReq
,網絡協調員使用該命令來限制終端設備的總髮射佔空比的最大值。總髮射佔空比指所有子頻帶的發射佔空比。
大小(字節) | 1 |
---|---|
DutyCycleReq Payload | DutyCyclePL |
Bits | 7:4 | 3:0 |
---|---|---|
DutyCyclePL | RFU | MaxDCycle |
終端允許的發射佔空比的最大值:
MaxDutyCycle有效範圍[0:15]。在沒有區域調節設置佔空比限制的情況下,使用 0
表示“佔空比沒有限制”,有區域限制的除外。
注意,下面這條在LoRaWAN1.0.2中被刪除:
值爲
255
時要求終端設備立刻轉爲靜默狀態,等價於遠程關閉終端。
終端收到DutyCycleReq後回覆DutyCycleAns, DutyCycleAns不包含任何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 |
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 |
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 |
該命令執行後,終端設備回覆TxParamSetupAns。 TxParamSetupAns不攜帶任何負載數據。如果在一個對此沒有要求的地域使用該命令,設備不執行,並且不回覆。
PS
看到有些夥伴提問問題,由於本人的CSDN一般不在線。
本文由 qingchuwudi 譯製,除非另有聲明,在不與原著版權衝突的前提下,本作品採用知識共享署名 3.0 中國大陸許可協議進行許可。