LoRaWAN中將消息分成上行和下行兩種類型。上行消息指的是終端節(jié)點通過一個或多個網(wǎng)關(guān)轉(zhuǎn)發(fā)給服務(wù)器的消息。消息格式如下:
上行消息物理層上采用的是lora radio的顯示格式,其中Preamble、PHDR、PHDR_CRC和CRC部分都是由lora radio硬件填充,PHYPayload是用戶數(shù)據(jù)段。消息的完整性有CRC保證。
3.2下行消息下行消息是指服務(wù)器通過唯一一個網(wǎng)關(guān)轉(zhuǎn)發(fā)給終端的消息,消息格式如下:
下行消息物理層上采用的是lora radio的顯示格式,其中Preamble、PHDR、PHDR_CRC由lora radio硬件填充,PHYPayload是用戶數(shù)據(jù)段。為了使消息盡量短小提高帶寬利用率,下行消息物理層中沒有使用CRC。
3.3 接收窗口終端在每次上行報文最后一個字節(jié)傳輸完成之后都會打開兩個短暫的接收窗口。如下圖所示,在上行消息傳輸完成之后,等待了RECEIVE_DELAY1時間后打開第一個接收窗口RX1,在等待RECEIVE_DELAY2之后打開第二個接收窗口RX2。第一個接收窗口RX1中使用的是和剛才傳輸?shù)纳闲袌笪南嗤念l點和速率,第二個窗口RX2采用的是之前設(shè)置好的頻點和速率,窗口的頻點和速率可以通關(guān)mac命令來設(shè)置。
接收窗口時間長度至少滿足讓終端lora radio能夠檢測到下行消息的有效前導(dǎo)碼。如果服務(wù)器端有下行報文要發(fā)送給終端,服務(wù)器會在終端兩個窗口開始時發(fā)送。如果終端在兩個接收窗口期間檢測到前導(dǎo)碼,接收狀態(tài)會一直保持到收完整個下行消息為止。同時,如果終端在第一個窗口內(nèi)收到給自己的報文,同時MIC(消息完成碼)驗證正確,那么終端將不會打開第二個接收窗口。
注意:所有的終端設(shè)備在上一次發(fā)送上行消息后在兩個窗口內(nèi)沒有收到服務(wù)器下行消息之前或者第二個接收窗口失效之前,不能發(fā)起下一次上行消息。
3、LoRaWAN幀格式本章節(jié)主要介紹LoRaWAN中的幀格式。如下圖所示LoRaWAN中的消息分成3層,從外到內(nèi)一次是物理層、MAC層、和數(shù)據(jù)層。
LoRaWAN中所有上下行消息都有PHYPayload,包括了一個字節(jié)的MHDR(mac幀頭)、MACPayload(mac消息)以及4字節(jié)的MIC(校驗)信息。
13.1.1 MHDR
Mac幀頭長度為1字節(jié),低兩位表示LoRaWAN的版本號,中間3位保留做后續(xù)使用,最高3位是消息類型。
LoRaWAN中一共有一下8種MAC消息類型。
其中Join Request和Join Accept消息在端點空中激活時使用。
Unconfirmed Data Up、Unconfirmed Data Down、Confirmed Data Up、Confirmed Data Down這四種類型用作數(shù)據(jù)消息傳輸使用,其中Confirmed 類型消息需要對端回復(fù)ACK。數(shù)據(jù)消息中可以同時包括mac命令和應(yīng)用數(shù)據(jù)。Proprietary消息為用戶自定義類型消息,此類消息不能被標(biāo)準(zhǔn)協(xié)議棧解析。
3.1.2 MAC Payload
數(shù)據(jù)消息的MAC Payload段又叫做“data frame”,包括了FHDR幀頭、端口號FPort和幀的數(shù)據(jù)段。
3.1.2.1 FHDR
幀頭由4字節(jié)的終端設(shè)備短地址Devaddr,1字節(jié)的幀控制域字段FCtrl,2字節(jié)長度的幀計數(shù)器以及最多15個字節(jié)長度的幀選項字段(用作傳輸MAC命令)組成。
下行數(shù)據(jù)幀頭中FCtrl域內(nèi)容如下:
上行數(shù)據(jù)幀頭中FCtrl域內(nèi)容如下:
ADR:LoRaWAN中網(wǎng)關(guān)上lora radio可以監(jiān)聽多種速率,這使得終端設(shè)備的組網(wǎng)靈活性大大加強(qiáng),終端設(shè)備可以自適應(yīng)調(diào)整自身速率ADR來連接網(wǎng)關(guān),當(dāng)終端設(shè)備啟用ADR后會自動選擇最高的傳輸速率來和網(wǎng)關(guān)通信。
移動的終端設(shè)備最好使用一種固定的速率和網(wǎng)關(guān)通信,因為在移動的環(huán)境下終端設(shè)備的無線電磁環(huán)境不穩(wěn)定,這會使得ADR很難管理。
當(dāng)幀頭中ADR位置1的時候,服務(wù)器會根據(jù)當(dāng)前收到的節(jié)點信號質(zhì)量通過下行消息中的MAC命令來控制終端的速率。ADR功能可以通過終端或者服務(wù)器來配置,為了增加終端的電池供電時間和擴(kuò)大網(wǎng)絡(luò)的容量,ADR最好使能。
如果服務(wù)器給終端設(shè)備優(yōu)化的傳輸速率高于了終端默認(rèn)的傳輸速率,那么終端就必須定期確認(rèn)服務(wù)器還能收到上行報文。每次上行報文傳輸后,終端都會增加ADR_ACK_CNT計數(shù)器,當(dāng)該計數(shù)器達(dá)到ADR_ACK_LIMIT而沒有收到服務(wù)器的下行消息時,終端就會在幀頭將ADRACKReq置1來先服務(wù)器請求。服務(wù)器收到該請求后就會在ADR_ACK_DELAY時間內(nèi)發(fā)送一個下行消息給終端設(shè)備,同時終端設(shè)備收到該下行消息后就會將ADR_ACK_CNT計數(shù)器清零。在該下行消息中ACK位不必置1,因為終端設(shè)備在上行消息后的接收窗口內(nèi)能收到下行消息同時也表網(wǎng)關(guān)依然能收到終端設(shè)備的消息。另外一種情況就是如果終端發(fā)送了帶ADRACKReq的上行消息后再ADR_ACK_DELAY時間內(nèi)仍然沒有收到網(wǎng)關(guān)的下行消息就說明網(wǎng)關(guān)和終端設(shè)備間的連接已經(jīng)斷開了,這種情況下終端設(shè)備就要嘗試用一種更低的速率(傳輸速率和傳輸距離成反比)來嘗試與網(wǎng)關(guān)建立連接。如果上行報文次數(shù)達(dá)到了ADR_ACK_LIMIT后還是沒能連接成功,那么繼續(xù)使用更低的速率。
ACK:當(dāng)收到一個confirmed消息時,接收端應(yīng)該在幀頭中間ACK置1。如果消息是有終端發(fā)出來的,那么服務(wù)器就要在終端設(shè)備的兩個接收窗口期間發(fā)生ACK消息給終端設(shè)備。如果消息是由服務(wù)器發(fā)送的,終端設(shè)備可以自行選擇什么時候回復(fù)ACK消息給服務(wù)器。ACK消息只是給上一條接收消息,而且不會重發(fā)。
消息重傳過程:當(dāng)一個confirmed消息發(fā)出后在一定時間內(nèi)沒有收到ACK確認(rèn),那么就要對消息重傳,重傳次數(shù)可以本地設(shè)置或者通過服務(wù)器來配置。如果終端設(shè)備重傳次數(shù)達(dá)到了最大次數(shù)都還沒收到ACK確認(rèn),那么終端設(shè)備就需要降低速度來重新和服務(wù)器連接。
FPending:該位只會出現(xiàn)在下行消息中,表示網(wǎng)關(guān)中有很多條消息要發(fā)送給終端,終端設(shè)備在要馬上進(jìn)行下一次上行消息的傳輸來接收網(wǎng)關(guān)消息。
FCnt:每個終端設(shè)備中都有兩個16位或者32位計數(shù)器,F(xiàn)CntUP用來計數(shù)發(fā)送給服務(wù)器的上行消息個數(shù),F(xiàn)CntDown用來計數(shù)收到的下行消息。同時在服務(wù)器上對應(yīng)給每個終端設(shè)備也有上下行計數(shù)器。當(dāng)終端設(shè)備完成加入網(wǎng)絡(luò)之后終端和服務(wù)器上的計數(shù)器就會先清零。發(fā)送報文中Fcnt是發(fā)送報文計數(shù)。
FOptsLen:表示數(shù)據(jù)幀中FOpts段的長度。FOpts用來傳輸MAC命令。如果該長度為0,一味著消息中不帶FOpts,如果FOpts中帶有mac命令,那么FPort不能端口0。
mac命令不能同時出現(xiàn)在FOpts和paylaoda中。
3.1.2.2 FPort
如果數(shù)據(jù)幀中payload部分不為空,那么Fport必須存在。如果FPort的值為0表明了FRMPaload中只能包含有mac命令。FPort為1-223為應(yīng)用使用,224-255保留后續(xù)使用。
上圖中N表示payload最大字節(jié)數(shù),N <= M - 1 - (FHDR長度),其中M標(biāo)志最大MAC payload長度。
3.1.2.3 FRMPayload與加密
如果消息中包括了FRMPayload,那么FRMPayload必須在計算MIC之前進(jìn)行加密。加密使用128bit密匙的標(biāo)準(zhǔn)AES算法。
默認(rèn)情況下對應(yīng)所有的FPort的FRMPayload的加密解密過程都是由軟件中LoRaWAN層來完成的,F(xiàn)Port為0時傳輸?shù)氖荕AC命令,加密時用NwkSkey,F(xiàn)Port為其他值時用AppSkey加密。
加密時,首先將pld = FRMPayload按照每16字節(jié)分成一段進(jìn)行加密,假如分成了k段。
然后會生成k個Ai段,Ai表示如下,Dir表示方向上行為0,下行為1.FCntUp和FCntDown表示上下行消息計數(shù),i表示對應(yīng)的k段序列號。
接著將Ai進(jìn)行加密,加密后得到16字節(jié)長度的Si,組成S。加密公式如下,其中的K表示加密密匙。
最后在將FRMPayload的每個字節(jié)與S的每個字節(jié)進(jìn)行異或操作來加密。對應(yīng)的解密過程也是一樣的對已經(jīng)加密的FRMPayload再進(jìn)行一次加密就相當(dāng)于對起進(jìn)行解密。
除了0之外的所有FPort也可以選擇通過應(yīng)用層用戶自己給數(shù)據(jù)加密解密。具體加密算法見協(xié)議4.4章節(jié)。
3.1.3 MIC
Mic是消息完整碼,用來對傳輸數(shù)據(jù)做校驗,通過AES加密,MIC的計算公式如下:
其中,
。
B0定義如下,Dir表示方向上行為0,下行為1.FCntUp和FCntDown表示上下行消息計數(shù)。Len為msg的字節(jié)數(shù)。
MAC命令用于服務(wù)器和節(jié)點MAC層之間的通信管理。單個數(shù)據(jù)幀中可以包括多個MAC命令,命令既可以放在數(shù)據(jù)幀的FOpts部分也可以單獨(dú)作為一幀數(shù)據(jù)進(jìn)行傳輸。放在FOpts中時MAC命令不會被加密而且不能超過15個字節(jié),數(shù)據(jù)幀單獨(dú)傳輸MAC命令時將命令放在FRMPayload中,數(shù)據(jù)幀的Fport端口號為0,最大長度不能超過規(guī)定的數(shù)據(jù)長度,由于FRMPayload部分會被加密,因此傳輸?shù)腗AC命令也是加密的。為了防止MAC命令被竊取最好采用單獨(dú)的數(shù)據(jù)幀傳輸。
MAC命令包含了1個字節(jié)命令標(biāo)識CID,同時不同的命令后面還有不同長度的后續(xù)字段。MAC命令列表如下:
上表中只給出了MAC命令的類型和介紹并沒有給出命令后數(shù)據(jù)的具體長度,下面將詳細(xì)介紹每條命令的用途。
4.1 連接狀態(tài)檢測命令當(dāng)終端想要驗證與網(wǎng)絡(luò)的連接情況時,終端會發(fā)送LinkCheckReq命令給服務(wù)器,該命令無后續(xù)數(shù)據(jù)。
服務(wù)器收到由一個或者多個網(wǎng)關(guān)轉(zhuǎn)發(fā)過來的LinkCheckReq后,返回一個LinkCheckAns命令給終端并帶有兩個字節(jié)長度的數(shù)據(jù)。
margin是8位無符號整數(shù),取值0-254代表服務(wù)器收到最近的LinkCheckReq的無線信號強(qiáng)度。GwCnt表示有多少個網(wǎng)關(guān)成功收到了終端發(fā)出的LinkCheckReq命令。
服務(wù)器通過LinkADRReq 命令來實現(xiàn)終端的速率自適應(yīng)ADR功能。
針對不同頻段的無線信號,DataTate和TXPower都有相應(yīng)的規(guī)范,例如下表對應(yīng)的是433M帶寬對應(yīng)的幾種速率和發(fā)射功率。詳情見協(xié)議文檔第7章節(jié)。
ChMask長度為16位,每一位代表一個頻段對應(yīng)的可用通道(比如,433M頻段可以用的有433.175、433.375、433.575三個無線頻段的通道),對應(yīng)為0的一位代表通道不可用,為1代表可用。
Redundancy中4位長度的NbRep表示上行消息的重復(fù)發(fā)送次數(shù),該設(shè)置只對unconfirmed上行消息有效,有效范圍是1-15,默認(rèn)值為1,如果該值為0,那么使用默認(rèn)值。NbRep用于當(dāng)服務(wù)器想獲取節(jié)點的信號Qos使用,終端每重復(fù)一次上行發(fā)送就會進(jìn)行調(diào)頻到下一個可用頻段。ChMaskCntl用于對Chmask的控制,當(dāng)可用頻段超過16個時該值不為0.
當(dāng)終端收到LinkADRReq后回復(fù)LinkADRReq命令給服務(wù)器。對應(yīng)位設(shè)置成功是為1,失敗為0,失敗后終端按照原來的配置運(yùn)行。
服務(wù)器用DutyCycleReq 命令來設(shè)置終端節(jié)點的上報周期,設(shè)定的周期對于所有的通道都一致。
終端最大的上報周期為:
MaxDutyCycle取值范圍為0-15,如果該值為255表示終端保持無線電靜默模式,相當(dāng)于關(guān)閉該終端。如果該值為0代表使用默認(rèn)的上報周期。
終端收到DutyCycleReq 命令后回復(fù)DutyCycleAns命令給服務(wù)器,該命令不帶數(shù)據(jù)。
4.4 接收窗口設(shè)置命令RXParamSetupReq命令用來設(shè)置上行消息后的第二個窗口,命令的格式如下:
RX1DRoffset定義的是第一個接收窗口上下行速率之差,默認(rèn)值為0;RX2DataRate定義的是第二個接收窗口的下行數(shù)據(jù)速率。Frenquency定義第二個接收窗口的無線通道頻段。
終端設(shè)備收到RXParamSetupReq后回復(fù)RXParamSetupAns給服務(wù)器。如果回復(fù)的3個ack有一個為0,那么設(shè)置不成功,終端設(shè)備參數(shù)保持不變。
服務(wù)器使用DevStatusReq命令來查詢終端節(jié)點的狀態(tài)。該命令沒有帶數(shù)據(jù),如果終端收到該命令,那么終端回復(fù)DevStatusAns給服務(wù)器,命令格式如下:
其中Battery代表終端的電池電量,0表示采用非電池供電,1-244表示電池的電量1為最小255最大,255表示電池電量測量失敗。Margin的低6位表示接受到DevStatusReq的無線信號強(qiáng)度,范圍-32-31.
4.6 增加或者修改無線通道命令NewChannelReq可以用于添加新的無線通道或者修改目前存在的無線通道。
其中ChIndex 表示新增或修改通道的序列號,對于協(xié)議中已經(jīng)制定好的通道修改是無效的,可以對規(guī)定好的通道外的通道進(jìn)行設(shè)置,最多不超過16個通道。Freq對應(yīng)的是設(shè)置的通道中心頻率,F(xiàn)req X 100為真實頻率,當(dāng)Freq為0時相當(dāng)于禁用該通道。DrRange的低4位和高4位分別表示該通道上最小和最大速率。
終端收到NewChannelReq命令后回復(fù)NewChannelAns給服務(wù)器,如果status中低2兩位任意1位為0代表添加通道不成功。
RXTimingSetupReq命令用來設(shè)置終端上行數(shù)據(jù)發(fā)送完成后打開第一個接收窗口的時延,第二個窗口在第一個接收窗口打開后1s開始。
其中Del為4位整數(shù),取值范圍為0-15,單位為s,其中0和1都表示時延1s,最大為15s。終端收到RXTimingSetupReq后回復(fù)RXTimingSetupAns給服務(wù)器,不帶數(shù)據(jù)。
終端設(shè)備需要經(jīng)過激活才能加入到LoRaWAN網(wǎng)絡(luò)中,終端設(shè)備在部署或者重啟后有兩種激活方式,一種是無線激活OTAA以及本地激活A(yù)BP。
5.1 終端參數(shù)在終端設(shè)備出場時設(shè)備內(nèi)保存了終端設(shè)備標(biāo)識DevEUI、應(yīng)用標(biāo)識AppEUI以及AES-128密匙AppKey。在終端設(shè)備激活后,會保存設(shè)備地址DevAddr、網(wǎng)絡(luò)會話密匙NwkSKey、應(yīng)用會話密匙AppSKey。
5.1.1 DevEUIDevEUI是終端設(shè)備的全球唯一標(biāo)識,相當(dāng)于mac地址。
5.1.2 AppKeyAppKey是終端設(shè)備的應(yīng)用提供商提供的密匙,用來生成AppSKey和NwkSKey。
5.1.3 DevAddrDevAddr是32位的終端設(shè)備網(wǎng)絡(luò)地址,在網(wǎng)絡(luò)中每個設(shè)備的網(wǎng)絡(luò)地址是唯一的。高7位是網(wǎng)絡(luò)號NwkId標(biāo)識不同的網(wǎng)絡(luò),低25位是分配給終端的網(wǎng)絡(luò)地址。
AppEUI全球唯一地標(biāo)識了終端設(shè)備的應(yīng)用提供商,長度為64位,在終端設(shè)備激活之前就已經(jīng)保存在終端中。
網(wǎng)絡(luò)會話密匙NwkSKey在服務(wù)器與終端設(shè)備的消息中用來計算消息完整碼MIC,來驗證消息的正確性,同時在只傳輸MAC命令的消息中用來加密和解密數(shù)據(jù)段。
5.1.6 AppSKey應(yīng)用會話密匙AppSKey在服務(wù)器與終端設(shè)備的消息中用來計算消息完整碼MIC,來驗證消息的正確性,同時在傳輸應(yīng)用數(shù)據(jù)的消息中用來加密和解密數(shù)據(jù)段。
5.2 無線激活終端設(shè)備在部署或者與服務(wù)器之間連接斷開后都要通過無線激活步驟來與服務(wù)器建立連接。從終端的角度來看加入網(wǎng)絡(luò)的過程包括兩個MAC消息與服務(wù)器的交換,分別是join request和join accept。
5.2.1 Join-request終端發(fā)送Join-request消息給服務(wù)器(hex):
00 01 02 03 04 05 06 07 08 39 7d 39 84 30 34 51 04 7f a2 c0 fd 1d e5
MHDR | MAC Payload | MIC | ||
00 | 01 02 03 04 05 06 07 08 | 39 7d 39 84 30 34 51 04 | 7f a2 | c0 fd 1d e5 |
Join-request | AppEUI | DevEUI | DevNoce | MIC |
MHDR類型:
MIC的計算公式如下:
其中AppKey定義為128位:
#define LoRaWAN_APPLICATION_KEY { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00 }
組網(wǎng)請求后第一個接收窗口時延5s
#define JOIN_ACCEPT_DELAY1 5000000
第二個接收窗口6s
#define JOIN_ACCEPT_DELAY2 6000000
終端設(shè)備發(fā)送join request消息來向服務(wù)器發(fā)起入網(wǎng)請求,請求消息中包含了AppEUI、DevEUI以及2字節(jié)長度的DevNone。
DevNone是一個隨機(jī)值,服務(wù)器保存了每個終端設(shè)備過去使用過的DevNone值,如果查詢到該值已經(jīng)出現(xiàn)過,那么服務(wù)器就忽虐該入網(wǎng)請求。
該入網(wǎng)請求是沒有加密的,消息的完整碼MIC的計算公式如下:
服務(wù)器發(fā)送Join-accept消息給終端(hex):
01 13 4f bc 00 00 01 01 00 00 01 06 01 ff ff ff ff
MHDR | MAC Payload | MIC | ||||
20 | 13 4f bc | 00 00 01 | 01 00 00 01 | 06 | 01 | ff ff ff ff |
Join-accept | AppNonce | NetId | DevAddr | DlSetting | RxDelay | MIC |
消息中DlSetting為6,表示接收窗口速率為6,RxDelay為1,表示上行消息發(fā)送完成后1s后打開第一個接收窗口。
在服務(wù)器收到入網(wǎng)請求后,如果當(dāng)前終端被允許加入到網(wǎng)絡(luò)中服務(wù)器會返回Join-accept給終端設(shè)備。如果終端不允許加入到網(wǎng)絡(luò)中,服務(wù)器是不會發(fā)送任何消息的。Join-accept消息發(fā)送時就和普通的下行消息一樣,但是時延用的是JOIN_ACCEPT_DELAY1或者JOIN_ACCEPT_DELAY2而不是RECIEVE_DELAY1或者RECIEVE_DELAY2,同時發(fā)送通道的速率和頻點和終端上行消息的兩個窗口RX1和RX2一樣。
Join-accept消息由3字節(jié)的AppNonce、3字節(jié)的網(wǎng)絡(luò)號NetID、和4字節(jié)的終端網(wǎng)絡(luò)地址DevAddr、1字節(jié)的接收窗口設(shè)置、1字節(jié)的窗口時延以及可選的最長為16字節(jié)的通道頻率設(shè)置組成。
AppNonce是由服務(wù)器生成的實際值,終端設(shè)備用其來生成NwkSkey和AppSKey,算法如下:
Join-accept消息的MIC計算如下:
Join-accept消息通過AppKey來加密,加密方法如下:
NetID總共長度為24位,其中低7位和DevAddr中的高7位一樣表示網(wǎng)絡(luò)ID,剩余的高17位由網(wǎng)絡(luò)操作者使用。在這里網(wǎng)絡(luò)ID唯一的標(biāo)識一個網(wǎng)絡(luò),相鄰或者重疊的網(wǎng)絡(luò)各自的網(wǎng)絡(luò)ID不一樣。
DLsetting是對下行消息進(jìn)行控制,格式如下,內(nèi)容見4.4節(jié)中給出的詳細(xì)描述。
在有些情況下,終端設(shè)備可以直接本地激活,本地激活直接將終端設(shè)備綁定在特定的網(wǎng)絡(luò)上而不經(jīng)過無線激活的兩個步驟。
本地激活意味著終端的網(wǎng)絡(luò)地址DevAddr以及兩個會話密匙NwkAskey、AppSKey都保存在終端設(shè)備中。且終端設(shè)備在啟動前就要保存有網(wǎng)絡(luò)相關(guān)的參數(shù)。同時還要保證NwkAskey、AppSKey兩個值是唯一的,這樣才能保證網(wǎng)絡(luò)的安全。
6、CLASS B在LoRaWAN的CLASS A類設(shè)備中,必須首先由終端設(shè)備發(fā)起上行消息后,服務(wù)器才能發(fā)送下行消息給終端設(shè)備。這種就不使用與服務(wù)器上應(yīng)用程序需要主動發(fā)送數(shù)據(jù)給終端的應(yīng)用場景。CLASS B類設(shè)備中,終端節(jié)點可以在設(shè)定的時間打開接收窗口,而同時也具有A類設(shè)備的特性。
B類設(shè)備這種特性是通過網(wǎng)關(guān)有規(guī)律地發(fā)送BEACON,讓終端設(shè)備和網(wǎng)關(guān)之間保持時間同步,這樣網(wǎng)關(guān)就可以控制終端在預(yù)定的時間打開額外的接收窗口(稱之為ping slot)。
終端由A類設(shè)備轉(zhuǎn)換為B類設(shè)備是由終端設(shè)備上的應(yīng)用層來決定的。如果服務(wù)器的應(yīng)用層要讓終端設(shè)備從A類轉(zhuǎn)換為B類設(shè)備,就要在終端設(shè)備發(fā)送了上行消息后將命令發(fā)送給終端,同時終端設(shè)備需要在應(yīng)用層去解析這個命令,在LoRaWAN層是不能處理的。
6.1 網(wǎng)關(guān)與終端同步機(jī)制為了讓網(wǎng)絡(luò)能支持B類設(shè)備,所有的網(wǎng)關(guān)必須同步地發(fā)送帶有時間基準(zhǔn)的beacon消息給終端。只有基于相同的時間基準(zhǔn),終端設(shè)備才能周期的打開接收窗口(ping slot)。服務(wù)器通過最近一次從網(wǎng)關(guān)獲得的終端設(shè)備上行消息信號質(zhì)量來決定由哪個網(wǎng)關(guān)來發(fā)起beacon。因此,如果終端設(shè)備是移動的同時檢測到beacon發(fā)送者身份發(fā)生了變化,終端設(shè)備就必須發(fā)送上行消息給服務(wù)器來更新下行的路由數(shù)據(jù)庫(通過那個網(wǎng)關(guān)發(fā)送給終端設(shè)備)。
終端設(shè)備在啟動后首先以A類設(shè)備來加入到網(wǎng)絡(luò)中,如果終端的應(yīng)用層要將設(shè)備轉(zhuǎn)換為B類,整個過程如下:
在上面這個B類設(shè)備例子中,Beacon的周期是128s,同時終端設(shè)備每30ms打開一個ping slot接收上行數(shù)據(jù)。大部分的ping slot里服務(wù)器都沒有數(shù)據(jù)發(fā)送下來,因此終端設(shè)置在ping slot開始后只要沒檢測到有radio的前導(dǎo)碼就馬上關(guān)閉接收信道。如果檢測到前導(dǎo)碼就會將無線數(shù)據(jù)接收下來,然后mac層開始檢測目的地址是否正確,然后校驗完整碼是否正確,最后將正確的數(shù)據(jù)交給應(yīng)用層處理。
6.2 上行消息格式B類設(shè)備的上行消息格式和A類設(shè)備基本一致,在A類設(shè)備中Fctrl的RFU在B類設(shè)備中變成了Class B,表示該終端是B類設(shè)備。而下行消息A\B類設(shè)備是一樣的。
6.3 下行ping消息格式6.3.1 物理層格式在B類設(shè)備中下行的ping格式和A類設(shè)備下行格式一樣,但是使用的通道頻率可能不同。
6.3.2 單播和組播在B類設(shè)備中下行消息分為單播和組播,單播消息只發(fā)送給當(dāng)個終端,組播消息可以同時發(fā)送給多個終端。組播內(nèi)的終端設(shè)備必須要具備相同的組播地址和相關(guān)的加密密匙。在LoRaWAN的協(xié)議規(guī)定中沒有制定遠(yuǎn)程組建組播組的方法,組播只能通過出場或者終端應(yīng)用層來配置。
6.3.2.1 單播消息格式B類設(shè)備ping中下行消息格式和處理方法和A類設(shè)備一樣。每收到一個下行消息都要計數(shù)。
6.3.2.2 組播消息格式組播消息格式和單播消息基本一致除了有以下一些不同之處:
終端設(shè)備在由A類轉(zhuǎn)換到B類之前,必須要先獲取網(wǎng)絡(luò)Beacon的時間來同步終端內(nèi)部時間。
終端設(shè)備一旦轉(zhuǎn)換為B類就要周期的搜尋網(wǎng)絡(luò)Beacon來同步自己的內(nèi)部時間。如果有時候沒有收到beacon,那么設(shè)備就要逐漸的延長beacon和ping slot的接收窗口時間來消除時鐘漂移。
6.4.1 最小Beacon-less運(yùn)行時間在終端設(shè)備沒收到Beacon后,要求設(shè)備至少能保持B類狀態(tài)運(yùn)行120分鐘(從上一次接收到Beacon開始計算)。這種沒有Beacon的臨時B類運(yùn)行狀態(tài)叫做Beacon-less狀態(tài),改狀態(tài)下就要靠設(shè)備內(nèi)部時鐘來工作。
在Beacon-less狀態(tài)下所有的單播、組播和Beacon接收時隙都要逐漸的延長來消除終端設(shè)備內(nèi)部的時間漂移與網(wǎng)絡(luò)產(chǎn)生的時間差。
在這120分鐘內(nèi)如果終端設(shè)備收到了beacon消息,那么Beacon-less狀態(tài)就要繼續(xù)持續(xù)120分鐘來讓終端設(shè)備消除時間漂移和重置接收時隙長度。
6.4.3 減少時間漂移終端設(shè)備可以通過接收Beacon來同步校準(zhǔn)設(shè)備內(nèi)部的時間。同時終端內(nèi)部的晶振偏移是與溫度直接相關(guān)的,因此終端內(nèi)部還可以通過采集溫度來校準(zhǔn)時間漂移。
6.5 下行時隙 6.5.1 定義B類終端設(shè)備在運(yùn)行時必須精確的打開接收時隙來接收beacon,這一節(jié)就主要講接收的時間要求。
兩次Beacon開始之間的時間間隔叫做Beacon period,Beacon的傳輸是從BEACON_RESERVED開始的時候。在每個Beacon開始傳輸之前都有一段保護(hù)時間,防止其他時隙沖突。保護(hù)時間的長度至少為信道內(nèi)最長的幀傳輸?shù)臅r間。因此ping slot可用的時間是BEACON_RESERVED結(jié)束到下一個beacon前的保護(hù)時間開始。
Beacon實際的傳輸時間比BEACON_RESERVED要短的多,這段時間還可以以后留給網(wǎng)絡(luò)管理傳輸報文使用。上圖中的BEACON_WINDOW這段時間又被分成0-4095共4096個ping slots,每個ping slot時間為30ms。
在終端設(shè)備中通過時隙號N來計算在Beacon開始后Ton秒來打開接收窗口。最后一個ping slot開始的時間為beacon開始后的beacon_reserved + 4095*30ms = 129470ms.
為了減少系統(tǒng)性的碰撞和防止竊聽,終端設(shè)備獲取的時隙編號是隨機(jī)的,而且每個beacon_period都會改變。用于計算隨機(jī)時隙值得參數(shù)如下:
在每個 beacon_period開始時終端設(shè)備和服務(wù)器都要計算新的隨機(jī)值來確定接收時隙,計算時采用key值為0的AES加密算法:
終端打開接收時隙的時間為:
如果終端既有單播也有組播,那么上面的計算公式就要算兩次,一次使用單播地址,一次使用組播地址。如果單播和組播的接收時隙碰撞了,優(yōu)先接收組播。在服務(wù)器上如果單播和組播時隙重疊了,那么在上個多播報文上標(biāo)記上FPending可以避免。
時隙的隨機(jī)分配可以防止單播和組播報文在系統(tǒng)時隙碰撞,如果在當(dāng)前beacon_period出現(xiàn)了碰撞,那么下個beacon_period就應(yīng)該可以避免。
6.6 CLASS B MAC命令在A類設(shè)備中所有的MAC命令對于B類設(shè)備同樣適用,除此之外還有一下B類設(shè)備特有的MAC命令。
終端設(shè)備使用PingSlotInfoReq命令來告知服務(wù)器自己的pingslot周期和速率,該命令只適用于單播,組播的pingslot周期和速率上報由應(yīng)用層自己定義。命令格式如下:
命令數(shù)據(jù)長度為1字節(jié),其中周期Periodicity長度為3位,周期計算公式如下,當(dāng)Periodicity為0時,表示設(shè)備每1S打開一個接收pingslot,當(dāng)Periodicity為7時,表示每128打開一個pingslot,這也是LoRaWAN B類支持的最大周期。
Data rate代表了終端每個pingslot的接收速率,Data rate的值和A類設(shè)備中LinkAdrReq命令中定義的值一樣。
服務(wù)器在發(fā)送B類設(shè)備的下行消息前必須先知道終端的pingslot速率和周期,所以設(shè)備在從A類轉(zhuǎn)換為B類之前必須先發(fā)送PingSlotInfoReq命令來告知服務(wù)器,然后服務(wù)器發(fā)送PingSlotInfoAns命令給設(shè)備。如果終端設(shè)備要改變ping'slot的設(shè)備,那么設(shè)備先必須先變A類設(shè)備,然后再發(fā)送PingSlotInfoReq給服務(wù)器,在收到服務(wù)器響應(yīng)后在使用新參數(shù)工作為B類設(shè)備。
6.6.2 BeaconFreqReq 命令服務(wù)器發(fā)送BeaconFreqReq 命令給終端設(shè)備來修改beacon接收的信道中心頻點。
頻率Frequency是24位長度的無符號整形,表示方式和A類設(shè)備中NewChannelReq表示方式一樣。范圍是100HZ-1.67GHZ,終端設(shè)備收到命令后檢查無線硬件是否支持該頻段,如果不支持返回錯誤給服務(wù)器。
如果Frequency值為0,終端設(shè)備使用默認(rèn)的beacon頻段進(jìn)行接收,同時還保留跳頻搜尋beacon的機(jī)制。一個非0Frequency使終端設(shè)備使用該固定的頻段進(jìn)行beacon接收。
6.6.3 PingSlotChannelReq命令服務(wù)器發(fā)送PingSlotChannelReq命令給終端設(shè)備來設(shè)置pingslot的信道。
頻率Frequency是24位長度的無符號整形,表示方式和A類設(shè)備中NewChannelReq表示方式一樣。范圍是100HZ-1.67GHZ,終端設(shè)備收到命令后檢查無線硬件是否支持該頻段,如果不支持返回錯誤給服務(wù)器。如果Frequency值為0,終端設(shè)備使用默認(rèn)的beacon頻段進(jìn)行接收。
DrRange的低4位和高4位分別表示該通道上最小和最大速率。
終端設(shè)備收到PingSlotChannelReq命令后回復(fù)PingSlotChannelAns給服務(wù)器,消息合適如下,對應(yīng)位為1表示這種成功,否則失敗。
終端發(fā)送該命令給服務(wù)器來獲取下一次beacon時間和通道,該命令后面沒有數(shù)據(jù)。
BeaconTimingReq & BeaconTimingAns 機(jī)制用來加速終端設(shè)備的beacon搜尋過程。如果服務(wù)器在一段時間內(nèi)收到多個BeaconTimingReq 請求,他可能只會回復(fù)其中一部分請求。因此終端設(shè)備不一定在發(fā)送請求后馬上就能收到響應(yīng)。終端設(shè)備最好一個小時內(nèi)不要發(fā)送超過一次的BeaconTimingReq請求。
6.6.5 BeaconTimingAns命令服務(wù)器發(fā)送該命令來相應(yīng)BeaconTimingReq,格式如下:
Delay是16位無符號整數(shù),從該下行命令結(jié)束到下一次beacon開始的時間RTime:
在多個beacon發(fā)送通道的網(wǎng)絡(luò)中,channel代表下一次beacon發(fā)送的通道。對于beacon通道固定的網(wǎng)絡(luò),該值為0.
7、BEACON7.1 BEACON 物理層結(jié)構(gòu)網(wǎng)關(guān)設(shè)備除了轉(zhuǎn)發(fā)終端設(shè)備與服務(wù)器間的數(shù)據(jù)外,還要周期性的(BEACON_INTERVAL)發(fā)送Beacon來給終端設(shè)備和網(wǎng)關(guān)提供終端同步機(jī)制。所有的Beacon在無線芯片的物理層都是采用的隱式模式,發(fā)送出去的報文不包括頭和CRC只有前導(dǎo)碼和數(shù)據(jù)段。格式如下:
前導(dǎo)碼長度為10,beacon的長度與無線芯片的物理層有關(guān),采用不同頻段對應(yīng)的beacon長度可能會有所不同。
7.2 Beacon格式Beacon的BCNPayload部分由網(wǎng)絡(luò)部分和網(wǎng)關(guān)相關(guān)部分組成,如下表所示:
網(wǎng)絡(luò)相關(guān)部分由NetID、Time和CRC組成,其中NetID唯一的標(biāo)識了發(fā)送Beacon的網(wǎng)絡(luò),時間戳Time是以秒為單位的標(biāo)準(zhǔn)格林威治時間(1970-1-1 00:00:00開始),8位或者16位的CRC校驗取決于物理層的設(shè)置。CRC-16計算NETID和Time的校驗,CRC-8取CRC-16的低8位。
終端可能會收到多個網(wǎng)關(guān)發(fā)出的Beacon,網(wǎng)關(guān)相關(guān)部分就是為了讓終端來區(qū)分不同的網(wǎng)關(guān)。當(dāng)包括RFU時應(yīng)該填0,同樣網(wǎng)關(guān)相關(guān)部分GwSpecific和RFU還有CRC-16來保護(hù)。
如下是一個US900的beacon:
空中傳播的順序如下:
移動的B類終端還要解析Beacon中網(wǎng)關(guān)相關(guān)部分,當(dāng)檢測到不同網(wǎng)關(guān)的Beacon時還要通知服務(wù)器自己位置移動了。
當(dāng)網(wǎng)絡(luò)中有多個網(wǎng)關(guān)時,多個網(wǎng)關(guān)都會同時發(fā)送beacon,如果終端設(shè)備在多個網(wǎng)關(guān)的覆蓋重疊區(qū)內(nèi),終端節(jié)點會收到多個beacon,而信號最強(qiáng)的網(wǎng)關(guān)發(fā)出的Beacon更容易被接受到。
7.3 GwSpecific格式GwSpecific的格式如下:
其中InfoDesc表示了Info數(shù)據(jù)段應(yīng)該怎么解讀。
對于只有一個全向GPS天線的網(wǎng)關(guān),InfoDesc的值為0廣播的是該GPS坐標(biāo)。對于有3向天線的網(wǎng)關(guān),InfoDesc等于0、1、2分別代表三個天線的GPS坐標(biāo)值。Info定義如下:
Info長度為6字節(jié),分別表示網(wǎng)關(guān)地理位置的GPS經(jīng)度和緯度。南北緯度Lat由24位的有符號數(shù)表示,-223 代表南緯90度,223 代表北緯90度,赤道對應(yīng)的值為0。東西經(jīng)度Lng由24位的有符號數(shù)表示,-223 代表西經(jīng)180度,223 代表東經(jīng)180度,格林威治對應(yīng)的值為0。
7.4 Beacon時間Beacon每128s發(fā)送一次,每一次發(fā)送的時間為BT = k * 128 +NWKID + TBeaconDelay,BT為世界標(biāo)準(zhǔn)時間UTC 1970-1-1起經(jīng)過的秒數(shù)。這里加上NWKID也為了讓不同網(wǎng)絡(luò)的Beacon不會再時間上沖突。
這里的TBeaconDelay是網(wǎng)絡(luò)中協(xié)定好的時延,范圍在0-50ms,在網(wǎng)絡(luò)中所有的網(wǎng)關(guān)都要按照TBeaconDelay時延后再發(fā)送beacon。所有的終端設(shè)備ping slot用的參考時間都是beacon的發(fā)送時間,因此服務(wù)器的下行報文時間也要把TBeaconDelay算進(jìn)去。
7.5 服務(wù)器下行路由更新當(dāng)服務(wù)器要通過CLASS B的下行slot給終端設(shè)備發(fā)送消息時,首先發(fā)給離終端設(shè)備最近的路由器(通過終端設(shè)備最近一次的上行消息確認(rèn)),再由路由器轉(zhuǎn)發(fā)給終端設(shè)備。因此服務(wù)器上必須保存有終端設(shè)備的大致位置。
當(dāng)B類設(shè)備位置發(fā)生了變化,就需要定期發(fā)送上行消息給服務(wù)器來讓服務(wù)器更新新的路由。這個消息可以是confirmed或者unconfirmed消息,消息中app數(shù)據(jù)段可以為空。終端設(shè)備有一下兩種更新路由方案。
如果服務(wù)器沒有及時收到終端設(shè)備的路由更新,會造成服務(wù)器的下行slot終端設(shè)備收不到下行消息。這種情況就只有等終端設(shè)備下一次發(fā)送上行消息才能重新更新路由。
8、CLASS C當(dāng)終端設(shè)備有充足的電源提供,不用擔(dān)心耗電問題時,設(shè)備可以不用減少接收時間來省電。這時設(shè)備就可以工作在C類。
C類設(shè)備不具備B類設(shè)備的特性,更類似于A類設(shè)備。C類設(shè)備中會盡可能地打開RX2接收窗口,當(dāng)終端設(shè)備沒有在發(fā)送或者打開RX1窗口接收時就一直打開RX2接收。并沒有特殊的消息告訴服務(wù)器終端設(shè)備為C類,在節(jié)點加入網(wǎng)絡(luò)時服務(wù)器的appserver中就要知道該終端設(shè)備為C類。(通過appeui確定或者deveui確定)
8.1 C類設(shè)備的第二個接收窗口在C類設(shè)備中與A類設(shè)備一樣在發(fā)送上行消息后都會有兩個接收窗口,但是在c類設(shè)備中在有需要發(fā)送上行消息之前都不會關(guān)閉第二個接收窗口,同時在發(fā)送完成后,第一個接收窗口打開前也會打開RX2,這樣在任何時間都有可能在RX2上接收到下行消息。
8.2 C類設(shè)備的組播下行消息與B類設(shè)備類似,C類設(shè)備也有可能會接收到組播下行消息。組播地址和APPSKEY和NWKSKEY都由應(yīng)用層來實現(xiàn)。同樣還有一下對組播消息的限制。
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |