※このフォーマットはClassAのものです。
LoRaWANは使用環境(背景)によって、
クラスA/B/Cのように3分類されています。
ですが、クラスが異なっていても
フォーマットに大きな変化はないです。
LoRaWANの標準フォーマットは、
アプリケーション層より
下位層を定義しています。
今回はMAC層のフォーマットです。
LoRaWANのフレームフォーマットの
全体は次のようになっています。

4層に見えますが機能面を考慮すると、
L1・L2がLoRaWANによって定義された
フォーマットと考えて良いでしょう。
上の画像を見て分かる通り、
LoRaWANのMAC層(PHY Payload)は、
MACヘッダー、MACペイロード、MIC
以上の3つで構成されています。
※MIC : Message Integrity Code
1byte | 0~Mbytes | 4bytes |
MHDR | MAC Payload | MIC |
それでは順にMAC層を見ていきましょう。
MHDR(MAC Header)のフォーマット
MHDRつまりMACヘッダーは、
次の3つで構成されています。
- MType (Message Type, 3ビット)
- RFU (Reserved for Future Usage, 3ビット)
- Major(2ビット)

まずはMTypeについてです。
Message Type | Description |
---|---|
000 | Join Request |
001 | Join Accept |
010 | Unconfirmed Data Up |
011 | Unconfirmed Data Dowm |
100 | Confirmed Data Up |
101 | Confirmed Data Down |
110 | RFU |
111 | Proprietary |
Join Request / Join Accept :
OTAA (Over-The-Air Activation)をする際に
ネットワーク参加のために使います。
エンドデバイスのアクティベーションは、
OTAAとABP (Activation By Personalization)
この2つの方法があります。
Confirmed Data :
データを送信するためのメッセージで、
受信者からのAckによる返信が必要です。
Unconfirmed Data :
データを送信するためのメッセージで、
受信者からのAckによる返信が不要です。
UP / Down はそれぞれ、
アップ / ダウンリンクを示します。
RFU :
予約フィールドです。
Proprietary :
このメッセージタイプは、
標準のフォーマットではなく、
独自に機能拡張(改変)した場合に用いる。
MACヘッダーのMType以外は、
次のようになっています。
RFU :
将来のための予約フィールドです。
現段階ではこのフィールドは使用せず、
フレームには1をセットします。
Major :
LoRaWANのフレームフォーマットの
バージョンを意味します 。
00 | LoRaWAN R1 |
01 | RFU |
10 | RFU |
11 | RFU |
今後バージョンアップがあれば、
RFUのところが定義されていくでしょう。
MAC Payloadのフォーマット
MACペイロードには、
フレームヘッダーと呼ばれる
フィールドなどが格納されます。
7~23 bytes | 0~1 byte | 0~N bytes |
FHDR | FPort | FRMPayload |
それではFHDRから見ていきましょう。
FHDR(Frame Header)のフォーマット
FHDRはフレームコントロールや
アドレスなどが含まれます。
4 bytes | 1 byte | 2 bytes | 0~15 bytes |
DevAddr | FCtrl | FCnt | FOpts |
DevAddr :
デバイスのアドレスを入れます。
FCtrl :
フレームコントロールです。
他の無線規格だとフレームコントロールに
フレーム(メッセージ)タイプが入るのですが
LoRaWANが違います。
またアップリンクとダウンリンクとで
フォーマットが少し異なります。
数字は何ビット目かを表します。
FCtrl全体では1バイトです。
FCtrl (Up-Link) | ||||
---|---|---|---|---|
7 | 6 | 5 | 4 | 3~0 |
ADR | ADRACKReq | ACK | ClassB | FOptsLen |
FCtrl (Down-Link) | ||||
---|---|---|---|---|
7 | 6 | 5 | 4 | 3~0 |
ADR | RFU | ACK | FPending | FOptsLen |
ADR (Adaptive Data Rate):
エンドデバイスは個々に
データレートを最適化出来ます。
1ビットのフィールドなので、
0もしくは1が格納されます。
1:所属ネットワークの最速レート
0:デフォルトのまま
固定されているエンドデバイスなら
1をセットしても大丈夫ですが、
移動体の場合であれば、
0をセットしてデフォルトの
データレートを使用した方が実用的です。
ちなみに1がセットされている場合は、
MACコマンドによってデータレートが
可能な限り最速になるように調整します。
ADRACKReq :
ADR acknowledgment request
上記によりデータレートを高くしたら、
エンドデバイスは周期的に、
まだそのレートを有効化を維持するために
このビットフィールドを使います。
エンドデバイスが、デフォルトの
データレートを使う場合は、
このフィールドは使われることはありません。
ACK :
ネットワークでおなじみのAckです。
Class B :
エンドデバイスがClassBモードで
送信する場合は1がセットされます。
FPending (Frame Pending):
ゲートウェイがエンドデバイスに対して、
送信すべきデータを保持している場合に
このビットフィールドは使われます。
なのでダウンリンクのみで使われます。
FOptsLen :
FHDR内のFOptsは可変なので、
その長さを示します。
FCnt (Frame counter):
各エンドデバイスは、2つの
フレームカウンターを保有しています。
FCntUp と FCntDownです。
これらは、データフレームの
追跡(track)のために使用されます。
エンドデバイスが送信した場合は、
アップリンクのFCntを
エンドデバイスが受信した場合は、
ダウンリンクのFCntをインクリメントします。
データフレームを送受信したら、
値を1ずつ増加させていきます。
FOpts (Frame options) :
MACコマンドが格納されます。
MACコマンドはフレームペイロードと
共存が出来ません(後述)。
FPort と FRM Payload
ここで一度、読み方と
MAC Payloadの確認しておきましょう。
FHDR : フレームヘッダー
FPort : フレームポート
FRM Payload : フレームペイロード
7~23 bytes | 0~1 byte | 0~N bytes |
FHDR | FPort | FRMPayload |
FPortの次のフィールドである、
FRM Payloadが空でない限り、
FPortには何かかしらの値が入ります。
ちなみにFRM payloadには、
アプリケーションデータが入ります。
またFRM Palyloadが空でも、
FHDRのFOptsにMACコマンドが
格納されている場合でも、
FPortは値をとります。
Value | Description |
---|---|
0(0x00) | MAC command |
1~223(0x01~0xDF) | Application Specific |
224~255(0xE0~0xFF) | RFU |
FPort(値)は1バイトサイズなので、
0~255までの範囲です。
MACコマンドもFRM Payloadも
どちらも存在しない場合は、
FPortには何も格納されません。
FPortがフィールドから存在しなくなります。
注意したいのが、FPortが "0" に
セットされているということは、
0という値が存在していることになります。
参考程度にMACコマンドを載せておきます。
参考資料より一部抜粋したものです。
以下のコマンドはLoRaWAN初期のものです。
version1.1の現在はもう少し追加されました。
CID | Command | End-device | Gateway | Description |
---|---|---|---|---|
0x02 | LinkCheckReq | × | Used by an end-device to validate its connectivity to a network | |
0x02 | LinkCheckAns | × | Answer to LinkCheckReq Command | |
0x03 | LinkADRReq | × | Request the end-device to change data rate | |
0x03 | LinkADRAns | × | Acknowledges the LinkADRReq command | |
0x04 | DutyCycleReq | × | Sets the maximum aggregated transmit duty-cycle of a device | |
0x04 | DutyCycleAns | × | Acknowledges a DutyCycleReq command | |
0x05 | RXParamSetupReq | × | Sets the reception slot parameters | |
0x05 | RXParamSetupAns | × | Acknowledges a RXSetupReq command | |
0x06 | DevStatusReq | × | Requests the status of the end-device | |
0x06 | DevStatusAns | × | Returns the status of the end-device, namely its battery level and its demodulation margin | |
0x07 | NewChannelReq | × | Creates or modifies the definition of a radio channel | |
0x07 | NewChannelAns | × | Acknowledges a NewChannelReq command | |
0x08 | RxTimingSetupReq | × | Sets the timing of the receptions slots | |
0x08 | RXTimingSetipAns | × | Acknowledges RxTimingSetupReq command | |
0x80~0xFF | Proprietary | × | × | Reserves for proprietary network command extentions |
End-DeviceかGatewayの×印は、
使用できないという意味です。
つまり、アップリンク用コマンドか
ダウンリンク用コマンドかで分かれています。
MAC層の最後のMICについてです。
MIC (Message Integrity Code)
メッセージの完全性を
確認するためのコードです。
MICはAES-CMACアルゴリズムに
基づいて算出されます。
ちなみにこのMICという言葉は、
LoRaWANで出てきた目新しい言葉ではなく、
IEEE802.11などでも出来てきます。
LoRaWANのセットアップする際に出てくる、
NwksKeyはMICの計算で使用されます。
以上です。
最後まで読んでいただきありがとうございました。
参考資料:
・LoRaWAN Specification(2015)
https://www.rs-online.com/designspark/rel-assets/ds-assets/uploads/knowledge-items/application-notes-for-the-internet-of-things/LoRaWAN%20Specification%201R0.pdf
・LoRaWAN Specification v1.1
https://lora-alliance.org/resource-hub/lorawanr-specification-v11