
XBee3のMicroPythonでreceive()関数を使ってデータを受信する方法について、以下に具体的に解説します。MicroPythonで動作するXBee3では、Digiが提供するxbeeモジュールにreceive()関数が含まれており、他のXBeeノードから送信された無線データを受信するために使用されます。receive()関数は、802.15.4、Zigbee 3.0、DigiMeshなど、いずれのファームウェアでも利用可能です。ただし、ATモードでは使用できず、MicroPythonモードを有効にしておく必要があります。
以下にreceive()関数を用いた画像転送のコードの一部を示します。
def receive_file_loop():
while True:
pkt = receive()
if pkt:
payload = pkt['payload']
if len(payload) < 1:
print("Invalid payload")
continue
receive()関数により返されるデータは「ディクショナリ(dictionary)」と呼ばれるデータ形式です。ディクショナリとはPythonやMicroPythonの中で使われるデータの形の一種であり、「名前」と「値」のペアを集めたものです。文字通り辞書のように、太字で書かれている「見出し語」と中身がセットになっているイメージです。pkt = receive()と定義し、payload =pkt[‘payload’]で’payload’に紐づけられたデータをpayloadに保存しています。
receive()関数が返すディクショナリには、payload以外にも通信管理やプログラムで便利に使える重要な情報が含まれています。以下に、それぞれのフィールドがどのような役に立つのか説明します:
ディクショナリの名前 | 内容 | 具体的用途 |
payload(Bytesオブジェクト) | 実際のセンサーデータや制御コマンド、テキストなど通信の本体をデータとして返します。 | センサーからのバイナリ値や文字列等を受信します。 |
sender_nwk(送信ノードの16ビットネットワークアドレス) | Zigbee や DigiMesh のようなネットワークでは、機器同士が一意に識別される 64 ビットアドレス(EUI-64)のほかに、そのネットワーク内で動的に割り当てられる16ビット短縮アドレスを持ちます。このアドレスを返します。EUI-64は、MACアドレス(48ビット)を基に、64ビットのインターフェースIDから生成されます。 | 同じ64ビットアドレスを持つ機器が再起動などでネットワークに再参加したとき、16ビットアドレスが変わることがある際に、ます。通信ログを取っていて、「今このアドレスのノードから来た」とすぐに識別したいときに役立ちます。 DigiMesh の場合、この16ビットアドレスは存在せず、None になるか省略されます。 |
sender_eui64(送信ノードの64ビットアドレス) | 機器をネットワーク外でも一意に識別できる固定のアドレス(EUI-64)を返します。 | データベースに「この64ビットアドレスのノードは温度センサー」「このノードは照明制御ノード」と紐付けする際に使用されます。機器管理・設定・ペアリング・データベース保存などで必須の内容です。Zigbeeの16ビットアドレスのみで通信している場合は None が返ることがあります。 |
source_ep(送信元エンドポイント) dest_ep宛先エンドポイント) | Zigbee では1台のノードの中に複数の「論理アプリケーション」(エンドポイント)を動かせます。エンドポイントは、通信の宛先アプリケーションを識別する役割を持ちます。 | 例えば、エンドポイント 0x01 を照明制御、0x02 を温度管理などに分け、メッセージを受信したとき「どの機能に送られてきたか」を判断して処理する際に使用されます。 |
cluster(クラスター ID) | エンドポイント内でさらに処理を細分化するためのIDを返す。「何の目的のデータか」を識別するために使用されます。 | 例えば、クラスターID 0x0006: On/Off 制御、クラスターID 0x0402: 温度測定等のように使用する。自分でアプリケーション独自のクラスターIDを決めることも可能です。 |
profile(プロファイルID) | Zigbee などのネットワークでは、用途に応じてプロファイルIDが定義されており、これが返される。通信のルールや意味を共通化します。 | 例えば、ホームオートメーション向け Zigbee Home Automation (ZHA): 0x0104やDigi社の独自プロファイル: 0xC105等、受信したデータがどのプロファイルに基づく通信かを判断して正しく解釈します。 |
broadcast(True / False) | 受信したフレームがブロードキャストかユニキャストかを判別して結果を返します。 | ブロードキャストの場合は応答不要でユニキャストの場合は必ずACK(確認応答)を返し、ログで記録できます。 |
Zigbeeネットワークを構成するノード(機器)は、その中で複数のアプリケーションや機能を同時に動かすことができます。エンドポイントとは、「どのアプリケーションや機能に対して通信を送るのか」を区別するための番号です。例えば、ひとつのノードが温度データの取得と照明の制御という2つの機能を同時に持っている場合、次のようにエンドポイントで区別します。
・温度データ取得 → エンドポイント 0x01
・照明制御 → エンドポイント 0x02