ZigBeeの物理層・MAC層を担っているのは、IEEEで規格化されたIEEE802.15.4です。IEEE802.15.4は低伝送速度のPAN(Private Area Network)を対象としてします。IEEE802.15.4/ZigBeeの階層モデルは、OSI参照モデルに倣うと以下のようになっています。

SAP : Service Access Point
IEEE802.15.4は上の画像のように、各層とそれをつなぐインターフェースで構成されています。
IEEE802.15.4/ZigBee 物理層の役割をまとめたものはこちら。物理層の動きをすべて書き下ろしました。実際に、実装するときの手助けになるかと思います。
IEEE802.15.4を規格化するグループは、IEEE802.2 LMSC(LAN and MAN Standard Committee)という標準委員会の下にいるので、IEEE802.2 type1 LLC(Logical Link Control)のサポートが義務付けられています。しかし、これはワイヤレスセンサーネットワークよりも以前に規格化された有線向けのものです。そこで、これでは不十分なので、IEEE802.15.4はそれをさらにサポートする形で、SSCS(Service Specific Convergence Sublayer)を定義しました。
IEEE802.15.4 SSCSについてまとめたものはこちら。
URL : https://wireless-network.net/ieee802-15-4-mac-sscs/
IEEE802.2 LLCはtype1、type2、type3の3種類あります。
type1:コネクションを確立しないし、Ackも返さない。
type2:コネクションを確立する。Ackあり。
type3:コネクションを確立しないが、Ackは返す。
どのような通信をするかによって、実装するタイプが異なります。IEEE802.15.4はワイヤレスセンサーネットワークをターゲットとしているので、type1が使われています。しかし、ワイヤレスセンサーネットワークの運用の仕方によっては、信頼性を高めたい場合もあるかもしれません。そこでIEEE802.15.4は、MAC層でAckの有無をオプションとして選択できるようにしています。 各typeの例として、type1はEthernt、type2はIEEE802.11、type3は衛星通信などがあげられます。
MAC層スーパフレームやビーコンなど、MAC層の概念について紹介さているサイトは、たくさんあるので今回は省略します。ここではMAC層の挙動について詳しくみていきます。これが理解できると、実装もイメージしやすくなるかと思います。
それではもう少し踏み込んだ説明に入っていきます。
IEEE802.15.4 サービス&プリミティブ
少し横暴な表現をすると、物理層・MAC層ともに、"サービス"と"プリミティブ"の二つで出来ています。サービスとプリミティブに関しては、実際にどのようなものがあるか、見た方が理解しやすいと思います。初めに両者の簡単な説明をした後に、実際に中身を見てみましょう。
ある層が提供するサービスには、"データサービス"と管理サービス"があります。名前の通りデータサービスでは、通信のデータに関するサービスを提供し、管理サービスでは通信の設定に関するサービスを提供します。
フレームが上位層と下位層を行き来するように、各層をつなぐインターフェースが必要です。IEEE802.15.4タスクグループ含め、IEEE802.2標準化委員会では、各層をつなぐインターフェースのことを"プリミティブ"と表現しています。サービスを提供する際に、各層間でやり取りするときに使われるものだと思って下さい。なので、サービスにプリミティブが備わっているイメージです。
そしてプリミティブには 4種類あります。
- 要求(request) : 上位層から下位層に何かを要求するとき
- 確認(confirm) : 要求に対する返答
- 通知(indication) : 下位層が上位層へ通知するとき
- 応答(response) : 通知に対する返答
プリミティブ各種の説明はイメージで、正確性に少し欠けますが、大体このようなときに使われます。
また全てのサービスに、4種類とも全てのプリミティブが揃っているとは限りません。後述しますが例えば、物理層には データを送受信 するデータサービスがあります。 この"送受信する"という機能のプリミティブには、要求・確認・通知しかありません。応答はありません。データを受信した際、物理層はMAC層に通知します。しかし、その物理層からの通知に対して、MAC層は"受け取ったよ!ありがとう"ということは、わざわざ物理層に言わないんですね。
ここまでで、IEEE802.15.4の物理層・MAC層に共通することを簡単に説明しました。
次に、MAC層の機能や実際何をやっているのかについてまとめていきます。
IEEE802.15.4 MAC層データサービス
先ほど、各層が提供するサービスは2種類あると言いました。データサービスと管理サービスです。またMAC層は追加オプションとして、セキュリティサービスを実装することも可能です。
まずはMAC層の"データサービス"から説明します。
MAC層データサービスはMCPS(MAC Comman Part Sublayer)と呼ばれています。
- MCPS-DATA
- MCPS-PURGE
そして、上の2つがMAC層が提供するデータサービスの名前です。
MCPS-DATAはデータの送信をします。
(※実際に電波に乗せるのは物理層。MAC層は上位層と下位層のデータ転送の中継役)
MCPS-PURGEは送信データの取り消しを行います(オプション)。
それぞれ具体的に見ていきましょう!
IEEE802.15.4 MCPS-DATA
物理層のデータサービス:PD-DATA同様に、MAC層でもデータ送受信の役割をします。実際は物理層が電波を発して物理的に送信します。MAC層から相手のMAC層にデータを届ける機能を担っています。MCPS-DATAにはプリミティブが3つあります。下の図は、データを送受信するときおの流れを少し具体的に表現したものです。実際はもうちょっとだけ複雑ですが、本質は以下の図になります。

MCPS-DATA.request
MAC層は上位層である(SSCS)からデータ送信の要求を受けます(MCPS-DATA.request)。このMCPS-DATA.requestにはMAC層のペイロードやヘッダーなどを含む、以下のようなパラメータが入っています。MAC層の上位層はネットワーク層だと思いがちですが、厳密にはIEEE802.15.4では、(本記事冒頭の画像のように)SSCSが間に入ってます。
MCPS-DATA.request (
srcAddrMode
srcPanID
srcAddr
dstAddrMode
dstPanID
dstAddr
msduLength
msdu
muduHandle
txOption
)
MAC層のフレーム構造を見ると分かりやすいと思います。SSCSから要求を受け取った時点では、まだMPDUは完成していませんが、それに近い構造をもったデータが送られてきます。そして要求を受けたら、CSMA/CAなどをした後に、物理層にPD-DATA.requestを出しますが、そのときにMPDUを完成させ、そしてMPDUの長さも加えて渡します。
MCPS-DATA.reqestを受けたあと、MAC層は物理層にPLME-SET-TRX-STATE.requestを発行します。これはIEEE802.15.4の物理層をまとめた記事を見ていただければ、わかりやすいと思います。物理層に、RF回路を送信できる状態にするように要求し、SUCCESSもしくはTX_ONの返答を待ちます。

MCPS-DATA.requestは、様々なパラメータが入っています。各パラメ―タの詳細は以下の内容です。
srcAddrMode
送信元アドレスをどうするか。アドレスなし(0x00)・予約済み(0x01)・16ビットショートアドレス(0x02)・64ビットIEEEアドレス(0x03)など、どのアドレスを"srcAddr"に格納するか、0x00~0x03で指定する。srcAddrMode(dstAddrMode)はMAC層ヘッダー中のフレームコントロールの一部になる。
srcPanID
送信者が所属するPAN IDを入れる。
srcAddr
送信モードで指定されたアドレスを入れる。
dstAddrMode / dstPanID / dstAddr
受信側のアドレスとPAN IDの情報
msduLength
MSDUの長さ
msdu
MSDU(MAC層ペイロード/言い換えるならSSCS層のフレーム)、つまり上位層のデータが入っている。
msduHandle
MSDUのハンドル(プログラミングの話になるので省略)。
txOption
Ack、GTS(Guaranteed Time Slot )、セキュリティ有無などの設定をする。もし、Ackを有効にしたなら、送信側はAckが返ってくるまでAck時間だけ待つ。待ってもAckが受信できなければ、再送処理をする。実際に物理層に渡すときは、Ackの有無などはMAC層ヘッダー中のフレームコントロールの中に入れて渡す。
以上がMCPS-DATA.requestのパラメータです。MAC層はrequestに対して返答します。
MCPS-DATA.confirm
MAC層はSSCSからの送信要求に対して、その結果を報告します(MCPS-DATA.confirm)。パラメータは以下のものが入っています。
MCPS-DATA.confirm (
msduHanlle
status
)
statusについて少し触れますが、読み飛ばしてもらっても大丈夫です。
いずれにせよ成功したかしてないか、成功してない場合は原因は何かはっきり分かるように、MCPS-DATA.confirmします。
パラメータ : statusの一部詳細
SUCCESS
データが受信機まで届いた
CHANNEL_ACCESS_FAILURE
IEEE802.15.4はデータを送信する前に、CSMA/CAを行う。MAC層は物理層にクリアチャネル判定(CCA)を要求する(PLME-CCA.request)。チャネルが空いていれば、物理層にデータ送信の要求を出す(PD-DATA.request)。ビジーなら、MAC層はSSCSにCHANNEL_ACCESS_FAILUREを入れてMCPS-DATA.confirmを返す。
NO_ACK
MCPS-DATA.requestのtxOptionにAckの有無が指定されています。もしAck返信希望で送信したなら、相手からAckが届くのを待ちます。一定時間経ってもAckが返ってこなければ、データの再送を行います。それでもまだAckが返ってこなければ、再び再送します。送信が成功しない場合は、上記のことを指定された回数繰り返します。指定回数行っても、Ackが届かない場合は、MAC層はSSCSにNO_ACKをstatusの中に入れて返信します。
INVALID_PARAMETER
MCPS_DATA.requestのパラメータのどれかが、定義外の設定だった場合は、statusにINVALID_PARAMETERを格納する。
などがあります。上記以外にも 数種類のエラーコードが定義されています。
送信データが受信側に届くと、受信側のMAC層はSSCSにMCPS-DATA.indicationをします。
MCPS-DATA.indication
データを送信機かた受信したら、MAC層はSSCSに向けて到着を通知します(MCPS-DATA.indication)。パラメータは以下にようになっています。
MCPS-DATA.indication (
srcAddrMode
srcPanID
srcAddr
dstAddrMode
dstPanID
dstAddr
msduLength
msdu
mpduLinkQuality
securityUse
aclEntry
)
MCPS-DATA.requestと内容がよく似ていますが、パラメータ最後の方の部分が少し異なります。
mpduLinkQuality
PD-DATA.indicationが送られてきた際に、PSDU(Phy Service Data Unit:物理層ペイロード)とともにLQI(Link Quality Indication:リンク品質指数)が送られてきます。
securityUse
MCPS-DATA.requestのtxOptionでセキュリティ有無が指定されています。送信側のMAC層で物理層に渡す際に、MPDU(MAC Protocol Data Unit:MAC層フレーム)を完成させるという話をしました。そしてセキュリティ有無は、MAC層ヘッダーの一部であるフレームコントロールの一部として、セットされます。受信側で、このフレームコントロール中のセキュリティ有無を読み取って、SSCSに渡します。有無の二択なので、"TRUE "or "FALSE"が入ります。
ACLEntry
ACLとはAccess Control Listの略です。名前から想像できる通り、アクセスの許可が記されたテーブルです。あるデバイスがどのデバイスからのフレームを受け取ってよいのかが分かります。セキュリティ目的で使用されます。
以上でMAC層データサービスの一つである"MCPS-DATA"の説明は終わりです。
次はもう一つのMAC層データサービス(MCPS-PERGE)について説明します。
IEEE802.15.4 MCPS-PURGE
このデータサービスはオプション機能で、"まだ送信していないデータ(MSDU)の送信を取り消すサービス"です。RFD(Reduced Function Device)つまりエンドポイントになるデバイスは、実装の否かを開発の段階で選択することが出来ます。
MCPS-PURGE.request
MAC層は、SSCSから送信取り消し要求を受け取る場合があります(MCPS-PURGE.request)。パラメータは以下になっています。
MCPS-PURGE.request (
msduHandle
)
この要求を受け取ったら、MAC層は自分が保持しているトランザクションキューから、指定されたハンドルを探します。もし見つかれば、そのハンドルが示すMSDUをトランザクションキューから削除します。マッチするMSDUが見つからなければ、その旨を返答します。
MCPS-PURGE.confirm
要求に対し、MAC層は送信を取り消したかどうか結果を報告します。パラメータは以下のようになっています。
MCPS-PURGE.confirm (
msduHandle
status
)
どのデータ(MSDU)を取り消そうとして、結果は成功か失敗かを報告します。なので、statusは"SUCCESS" or "INVALID_HANDLE"のどちらかが入ります。
以上でMAC層データサービスの説明は終了です。
続いて、MAC層管理サービスの説明をします。
IEEE802.15.4 MAC層管理サービス
MAC層管理サービスはMLME : MAC Layer Management Entityと呼ばれています。MLMEにはいくつか種類はあります。
- MLME-ASSOCIATE
- MLME-DISASSOCIATE
- MLME-ORPHAN
- MLME-GTS
- MLME-SYNC
- MLME-SYNC-LOSS
- MLME-START
- MLME-BEACON-NOTIFY
- MLME-POLL
- MLME-COMM-STATUS
- MLME-RX-ENABLE
- MLME-SCAN
- MLME-GET
- MLME-SET
- MLME-RESET
見て分かるように、MLMEはたくさんあります。
続きは、IEEE802.15.4/ZigBee MAC層の役割について(その2)で説明します。
最後まで読んでいただきありがとうございました。