
1. ZDOとその目的と位置付け
ZDO(Zigbee Device Object)はZigbeeデバイスの検出やネットワーク管理など、Zigbeeネットワークの管理及び検出機能を提供します。XBeeのZigbeeファームウェアを使用している場合は、ATコマンドを使用したり、XCTUのNetwok working modeでネットワーク状況を直接確認することができます。しかし、Zigbeeネットワーク内部にDigi社以外のZigbeeデバイスが含まれている場合は、XCTUは使用できません。ZDOはZigbeeプロトコルで運用されているデバイスの管理を行う機能を有しています。Zigbeeネットワークにおける各種管理機能(ノード探索、バインディング、ルーティング情報取得など)は、標準仕様に基づいてZDOによって提供されており、Zigbee環境での管理操作は原則としてZDOを通じて実行するのが正攻法です。

図1 XBeeのZDOコマンド(0x0031)によるネットワーク管理の概要図
一般的なZDO管理機能には、ネットワーク更新、ルート及びネイバー検出、デバイス接続管理等があります。以下に、ZDOコマンド(クラスタID)の種類をまとめます。
表1 ZDOコマンド(クラスタID)の種類
| ZDOコマンド(クラスタID) | 内容 |
| 0x0001 | IEEEアドレス要求 |
| 0x0002 | ノード記述子要求 |
| 0x0004 | シンプル記述子要求 |
| 0x0005 | アクティブエンドポイント要求 |
| 0x0031 | 管理LQI(Link Quality Indicator)要求 |
| 0x0032 | 管理ルーティング要求 |
| 0x0034 | 管理離脱要求 |
| 0x0036 | 管理参加許可要求 |
| 0x0038 | 管理ネットワーク更新要求 |
XBeeのLQI(Link Quality Indicator)は、受信したデータパケットの品質を示す0~255の数値指標です。電波強度(RSSI)だけでなく信号対雑音比(SNR)やエラー率も考慮してリンクの信頼性を評価します。以下に、ZDOコマンドの実行方法について説明します。
2. ZDOコマンドの送信方法
・APIモードを使用し、明示的送信APIフレーム(フレームタイプ0x11)のペイロードとしてZDOコマンドを送信します。
・送信元エンドポイントと宛先エンドポイント、およびプロファイルIDを00に設定します(これらはZDO通信用に予約された値です)。
・ZDOコマンドをクラスタIDに設定します。(例:アクティブエンドポイント要求の場合は0x0005、管理LQI要求の場合は0x0031)。
ペイロードの最初のバイトはトランザクションシーケンス番号(任意の1バイト値)です。レスポンスでも同じ値が使用されます。
・残りのペイロードバイトはZDOコマンド構造と一致している必要があります。つまり、Zigbee仕様書通りにバイト列を作る必要があります。
例:Management LQI Request(0x0031)の場合
ZDO仕様では以下の表のように定義されています。
表2 Management LQI Request(0x0031)の場合のペイロードバイトの構造
| フィールド | サイズ |
| Transaction Sequence Number | 1 byte |
| Start Index | 1 byte |
また、ペイロードバイトで記述される全てのマルチバイト値は、リトルエンディアンバイトオーダーである必要があります。
これは、Zigbeeが内部的に、APS層、ZDO層、NWK層で処理されます。ZDO層はZigbeeスタック内部の管理層であり、仕様上すべてリトルエンディアンと決められています。
(具定例)以下のEEEアドレスをZDOのペイロードで送信する場合
00 13 A2 00 42 3E CD 2C
ZDOペイロード内では:
2C CD 3E 42 00 A2 13 00
になります。
3. ZDOレスポンスの受信
ZDOレスポンスを受信するには、AO(APIオプション)パラメータを1(明示的)又は3(明示的、ZDOパススルー)に設定します。これにより、ZDOレスポンスがシリアルポートに渡され、アプリケーションで処理できるようになります。
4. 具体例
今回は、ZDOコマンド(クラスタID:0x0031)であるManagement LQI(Link Quality Indicator)要求を具体例として取り上げます。XBee3のZigbeeファームウェアを使用し、コーディネータ1台とルータ2台から成るネットワーク構成において、その動作を確認します。
表3 XBee3のパラメータ設定
| パラメータ | コーディネータ | ルータ1&ルータ2 |
| CE (Device Role) | Form Network [1] | Join Network [0] |
| AP (API Enable) | API Mode Without Escape [1] | API Mode Without Escape [1] |
| AO (API Output Mode) | 0x1 | 0x1 |
コーディネータXBee3のXCTUのConsoles working modeからFrames Generator Toolを起動し、ルータ1に以下のフレームを送信します。
Frame typeは0x11を選択します。ルータ1の64ビットアドレスを入力します。
Source endpointとDestination endpointはどちらも0x00に設定します。
Cluster IDを0x0031に設定します。
Profile IDを0x0000に設定します
RF data (HEX)はHEXのタブから0x0100を入力します。

図2 API Frames Generatorの入力画面
(完成したフレーム)
Explicit Addressing Command Frame (API 1)
7E 00 16 11 01 00 13 A2 00 42 3E CD 2C FF FE 00 00 00 31 00 00 00 00 01 00 90
Start delimiter: 7E
Length: 00 16 (22)
Frame type: 11 (Explicit Addressing Command Frame)
Frame ID: 01 (1)
64-bit dest. address: 00 13 A2 00 42 3E CD 2C
16-bit dest. address: FF FE
Source endpoint: 00
Dest. endpoint: 00
Cluster ID: 00 31
Profile ID: 00 00
Broadcast radius: 00 (0)
Transmit options: 00
RF data (HEX): 01 00
RF data (ASCII):
(送信フレームのポイント)
・Cluster ID: 00 31 → ZDOコマンド
・Profile ID: 00 00 → ZDOを指定
・RF data: 01 00 → 以下の設定
Transaction Sequence Number = 0x01
Start Index = 0x00
APIフレームが完成したら、送信を行うと以下の図のようにルータ1からフレームが返信されます。

図3 コーディネータからAPIフレーム送受信画面
(ルータ1から返信されたフレーム)
Explicit RX Indicator (API 1)
7E 00 43 91 00 13 A2 00 42 3E CD 2C B3 D6 00 00 80 31 00 00 01 01 00 02 00 02 9F 48 E8 AC CA 12 BB 4A 06 75 1D 42 00 A2 13 00 00 00 24 02 00 45 9F 48 E8 AC CA 12 BB 4A 69 75 1D 42 00 A2 13 00 EE AF 25 02 0F 4B 3E
Start delimiter: 7E
Length: 00 43 (67)
Frame type: 91 (Explicit RX Indicator)
64-bit source address: 00 13 A2 00 42 3E CD 2C
16-bit source address: B3 D6
Source endpoint: 00
Destination endpoint: 00
Cluster ID: 80 31
Profile ID: 00 00
Receive options: 01
RF data (HEX): 01 00 02 00 02 9F 48 E8 AC CA 12 BB 4A 06 75 1D 42 00 A2 13 00 00 00 24 02 00 45 9F 48 E8 AC CA 12 BB 4A 69 75 1D 42 00 A2 13 00 EE AF 25 02 0F 4B
RF data (ASCII):
5. ルータ1から送信されたフレームの解釈
XBee3のZigbeeファームウェアでZDOコマンドの一つであるZDO Management LQI Response(Cluster 0x0031)を送信し、その応答としてCluster 0x8031が返ってきています。そのフレームには、そのルータが認識している隣接ノード情報(LQIテーブル)が含まれています。
(ルータ1から送信されたフレームの重要部分)
Cluster ID: 80 31 → Management LQI Response(0x0031 のレスポンスは 0x8031 になる)
Profile ID: 00 00
(RFデータの構造)
01 00 02 00 02
9F 48 E8 AC CA 12 BB 4A 06 75 1D 42 00 A2 13 00 00 00 24 02 00 45
9F 48 E8 AC CA 12 BB 4A 69 75 1D 42 00 A2 13 00 EE AF 25 02 0F 4B
(ヘッダ部の解析)
01 00 02 00 02
表4 ヘッダ部の値と意味
| 値 | 意味 |
| 01 | Transaction Sequence Number |
| 00 | Status (0=成功) |
| 02 | Neighbor Table Entries(全体数) |
| 00 | Start Index |
| 02 | 今回返すエントリ数 |
このヘッダから、ルータ1は隣接ノードを2台持っていることが分かります。
次いで、各ノードの情報が続きます。1ノードの情報を記述するエントリの構造は定義されており、1エントリあたり以下の22バイトで構成されます。
Extended PAN ID (8)
Extended Address (8)
Network Address (2)
Device Type/Flags (1)
Permit Joining (1)
Depth (1)
LQI (1)
これを踏まえたうえで、1つ目の隣接ノードの情報を解釈します。
表5 1つ目の隣接ノードの情報を解釈
| RFデータ | 意味 |
| 9F 48 E8 AC CA 12 BB 4A | Extended PAN ID |
| 06 75 1D 42 00 A2 13 00 | 64bit address |
| 00 00 | Network address |
| 04 | Device type flags |
| 02 | Permit joining |
| 00 | Depth(ツリー構造) |
| 45 | LQI |
このフレームを解釈すると、Network addressが0x0000であることから、このノードがコーディネータであり、LQIは0x45(69)であることが分かります。
2つ目の隣接ノードの情報を解釈します。
表6 2つ目の隣接ノードの情報を解釈
| RFデータ | 意味 |
| 9F 48 E8 AC CA 12 BB 4A | Extended PAN ID |
| 69 75 1D 42 00 A2 13 00 | 64bit address |
| EE AF | Network address |
| 25 | Device type flags |
| 02 | Permit joining |
| 0F | Depth(ツリー構造) |
| 4B | LQI |
このフレームを解釈すると、Network addressが0xEEAFであり、LQIは0x4B (75)であることが分かります。
6. まとめ
ZDO(Zigbee Device Object)はZigbeeデバイスの検出やネットワーク管理など、Zigbeeネットワークの管理及び検出機能です。今回は、ZDOコマンド(クラスタID:0x0031)であるManagement LQI(Link Quality Indicator)要求を具体例として取り上げました。XBee3のZigbeeファームウェアを使用し、コーディネータからルータへAPIフレームによりZDOコマンド(クラスタID:0x0031)を送信し、ルータから送信されたフレームを解析しました。その結果、APIフレームのRFデータには、隣接したノードの64ビットアドレスやLQIの値等の情報が含まれていることを確認しました。