
数回にわたり画像データを送受信する方法について解説してきました。これまでの解説では、データを受信するコーディネータ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()を使ったイベント駆動型処理が推奨されます。