XBeeモジュールの使い方(receive()とreceive_callback())


 数回にわたり画像データを送受信する方法について解説してきました。これまでの解説では、データを受信するコーディネータXBeeはreceive()関数を使用していました。今回は、コーディネータXBeeで画像データを受信する方法としてイベント駆動型のreceive_callback()を用いた方法も紹介し、receive()との差異や両者の特徴を解説します。

1.周期的にreceive()を呼び出すポーリング方式

 画像データを送信する際には送信側が画像データを分割して塊(チャンク)毎に画像をコーディネータXBee送信します。この際に、受信側はループ内でreceive()を周期的に繰り返して受信処理がreceive()を呼び出すポーリング方式です。

特徴

項目内容
構造while True:などのループで常にreceive()を監視する構造。
メリット処理が直感的で理解しやすく、受信処理の順序を制御しやすい。中断や条件付き処理等の追加が容易でスクリプトの柔軟な制御が可能。
デメリットCPUがreceive()を常にポーリングするため、非効率で一般に電力消費が高い。スリープとの併用やタイマー、センサ処理などの他の処理との併用が難しい。
適する用途デバイスが常時起動していて、他に複雑な非同期処理がない場合に適する。

2.receive_callback()によるイベント駆動型コールバック方式

 XBeeのreceive_callback()を使って、データ受信時に自動で呼び出される関数を登録することにより、データ受信というイベントを感知して割り込み処理的にデータを受信する方式です。

特徴

項目内容
構造receive_callback(handler)でハンドラ関数を登録します。
メリット非同期処理が可能でスリープ対応に適しており省電力である。センサ、タイマー等の他のタスクとの並行処理がしやすい。リアルタイム性に優れている。
デメリットステート管理などプログラム構造がやや複雑になる。コールバックの中では処理時間やメモリ使用に注意が必要。デバッグがやや難しくなる傾向がある。
適する用途省電力でスリープ制御を行いたい場合やセンサや他のタスクと並列処理が必要な場合に適する。エッジAIやIoTでイベント駆動的な処理が必要な場合に有効である。

3.receive()とreceive_callback()の比較

 上で解説した二つの方法に関して以下にまとめます。

比較表

比較項目receive()ポーリング方式receive_callback()コールバック方式
電力効率高消費スリープに対応しやすいく低消費
プログラム構造単純やや複雑
同時並行処理難しい得意
リアルタイム性ループの速度に依存即時処理
スリープ対応非対応受信で自動復帰
デバッグしやすさ手順が明快割り込み的で難しい
画像転送適性小規模データ安定性高

 この表から、開発初期やテストではreceive()によるポーリング方式がシンプルで適していることが分かります。しかし、本格的な運用や省電力・スリープ対応等を目指す場合はreceive_callback()を使ったイベント駆動型処理が推奨されます。