LoRaWANで画像転送!? Dragino AIS01-LBの魅力
はじめに
IoT の世界では、センサーデータの収集が一般的ですが、動作環境上厳しい制約がある場合、画像データの転送となると途端にハードルが上がります。特に、低消費電力・長距離通信が特徴の LoRaWAN では、帯域幅の制限から画像転送の実装はハードルが高かったと思います。
しかし、Dragino 社のAIS01-LBは、この常識を覆す画期的なデバイスです。本記事では、AIS01-LB の機能概要と、The Things Stack および Node-RED を使用した実際の実装例を紹介します。
1. AIS01-LB の機能概要
1.1 AIS01-LB とは
AIS01-LB は、Dragino 社が開発した LoRaWAN 対応の AI カメラデバイスです。このデバイスは、低電力で長距離通信が可能な LoRaWAN ネットワークを使用して、画像データを送信する革新的な製品です。
と、書きましたが、スマートメータという文脈では、画像データ自体を上位側へ送るケースは少ないかもしれません。というのも、デバイス側に画像からメータ数値を認識する(但し、キャリブレーションが必須)機能が備わっており、通常は認識した数字データだけを送信するだけだからです。
今回は、画像データ自体を送信する部分に着目していきます。
1.2 AIS01-LB の主な特徴と仕様
AIS01-LB の主な特徴と仕様、特に画像機能と消費電力に関する部分は以下の通りです。
画像機能:
- カメラタイプ:モノクロ(白黒)
- 画角:110°
- 画像解像度:80x60 ピクセル
- 画像サイズ:4.8KB(80x60 ピクセル、8 ビット/ピクセル)
- AI 機能:水道メーター、ガスメーター、電力メーターの数字認識
消費電力:
- カメラ動作時:
- 消費電力:206.1mW
- 撮影時消費電流:41.22mA
- 撮影時間:3171ms(約 3.2 秒)
- デバイス全体:
- スリープモード:5μA @ 3.3V
- LoRa 送信モード:125mA @ 20dBm、82mA @ 14dBm
- バッテリー:
- タイプ:Li/SOCl2 非充電式
- 容量:8500mAh
- 自己放電率:<1% / 年 @ 25°C
その他の特徴:
- LoRaWAN v1.0.3 Class A プロトコル対応
- Bluetooth v5.1 および LoRaWAN によるリモート設定
- 無線 OTA ファームウェアアップデート対応
1.3 画像転送の仕組み
AIS01-LB は、以下の手順で LoRaWAN ネットワークを通じて画像を転送します。
- 内蔵カメラで 80x60 ピクセルの白黒画像を撮影
- 撮影した画像データ(4.8KB)を 80 バイトずつに分割
- 各パケットに 4 バイトのヘッダーを付加
- 分割されたパケットを順次送信
- アプリケーション側で受信したパケットを再構成し、完全な画像データを復元
この方式により、低帯域幅の LoRaWAN ネットワークでも画像データの転送が可能となっています。画像は圧縮されていませんが、低解像度(80x60 ピクセル)であることで、データサイズを抑えています。
1.4 低消費電力設計
AIS01-LB は、以下の特徴により低消費電力を実現しています:
- 効率的な撮影プロセス:約 3.2 秒の短時間で撮影を完了
- 低解像度画像:80x60 ピクセルの小さな画像サイズにより、転送データ量を削減
- 深いスリープモード:非アクティブ時は 5μA という極めて低い電流消費
- 送信電力の最適化:必要に応じて 14dBm や 20dBm の送信電力を選択可能
- 大容量バッテリー:8500mAh の高容量バッテリーにより長期運用が可能
これらの特徴により、AIS01-LB は画像転送機能を持ちながらも、長期間のバッテリー駆動が可能となっています。公式マニュアルには電池寿命の計算例も記載されており、使用頻度や設定によって数年単位の運用が可能です。
2. 実装例の説明
それでは、実際に AIS01-LB から The Things Stack 経由で画像を取得し、保存する実装例を見ていきましょう。今回は、Node-RED を使用して具体的な実装を行います。
ただし、毎度のことなので、LoRaWAN 周りの設定等は触れません。いつも通りです。
2.1 システム構成
実装例のシステム構成は以下の通りです:
- AIS01-LB(LoRaWAN エンドノード)
- LoRaWAN ゲートウェイ
- The Things Stack SandBox(ネットワークサーバー)
- Node-RED(アプリケーション)
- Nextcloud(画像保存先)
2.2 Node-RED フロー
Node-RED で以下のようなフローを作成します:
- MQTT In ノード(The Things Stack からのデータ受信)
- function ノード(画像データの再構成)
- function ノード(画像データの変換とアップロード準備)
- HTTP Request ノード(Nextcloud への画像アップロード)
- function ノード(ダウンリンクコマンドの準備)
- MQTT Out ノード(ダウンリンクコマンドの送信)
先出しますが、フロー全体の JSON ファイルは、こちらから DL ください。但し、MQTT Broker の設定、実際の TTS Sandbox 上での Application ID, End device ID、nextcloud のアカウントや URL はご自身の環境に合わせて、適宜設定変更してください。
2.3 具体的な実装
まず、取得できる画像データも先出しちゃいます。
どこか、哀愁漂う画像テイストですね!
2.3.1 MQTT 入力ノード
The Things Stack からのデータを受信する MQTT In ノードを設定します。
{
"id": "mqtt_in",
"type": "mqtt in",
"topic": "v3/(Application ID)/devices/(End device ID)/up",
"qos": "2",
"datatype": "json"
}
2.3.2 画像データの再構成
受信したデータを再構成する function ノードを実装します。この関数は、分割されて送信された画像データを一つの完全な画像に再構成します。
function Collect Image Data (msg) {
var data = msg.payload.uplink_message.decoded_payload;
var fport = msg.payload.uplink_message.f_port;
if (fport !== 3) {
return [null, msg];
}
var imgDataPart = data.imgdata;
var totalPackets = data.total_packages;
var currentPacket = data.subcontracting_count;
var deviceID = msg.payload.end_device_ids.device_id;
var imgData = flow.get(deviceID) || '';
imgData += imgDataPart;
if (currentPacket === totalPackets) {
flow.set(deviceID, '');
msg.payload = imgData;
return [msg, msg];
} else {
flow.set(deviceID, imgData);
return null;
}
}
2.3.3 画像データの変換とアップロード準備
再構成された画像データを変換し、Nextcloud へのアップロード準備を行います。
function Convert and Upload Image (msg) {
function hexToBase64(hexString) {
var hexBuffer = Buffer.from(hexString, 'hex');
return hexBuffer.toString('base64');
}
var now = new Date();
var filename = now.getFullYear() + ("0" + (now.getMonth() + 1)).slice(-2) + ("0" + now.getDate()).slice(-2) +
("0" + now.getHours()).slice(-2) + ("0" + now.getMinutes()).slice(-2) + ("0" + now.getSeconds()).slice(-2) + ".jpg";
var imgHex = msg.payload;
var imgBase64 = hexToBase64(imgHex);
var imgBuffer = Buffer.from(imgBase64, 'base64');
msg.headers = {
"Authorization": "Basic " + Buffer.from("user:password").toString("base64"),
"Content-Type": "image/jpeg"
};
msg.url = "https://hogehoge.example.com/remote.php/dav/files/user/" + filename;
msg.payload = imgBuffer;
return msg;
}
2.3.4 Nextcloud への画像アップロード
HTTP Request ノードを使用して、Nextcloud に画像をアップロードします。
{
"id": "http_request_nextcloud",
"type": "http request",
"method": "PUT",
"ret": "txt",
"url": ""
}
2.3.5 ダウンリンクコマンドの準備
AIS01-LB にコマンドを送信するためのダウンリンクペイロードを準備します。デバイスに対して画像データをそのまま送信してくださいというコマンド(0x0B, 0x01)を送信しています。
function Send Downlink Command (msg) {
var downlinkPayload = Buffer.from([0x0B, 0x01]).toString('base64');
var downlink = {
"downlinks": [
{
"f_port": 1,
"frm_payload": downlinkPayload,
"priority": "NORMAL"
}
]
};
msg.payload = downlink;
return msg;
}
2.3.6 ダウンリンクコマンドの送信
MQTT Out ノードを使用して、ダウンリンクコマンドを The Things Stack に送信します。
{
"id": "mqtt_out_downlink",
"type": "mqtt out",
"topic": "v3/(Application ID)/devices/(End device ID)/down/push",
"qos": "1"
}
2.4 実装のポイント
- 複数パケットに分割された画像データの再構成:AIS01-LB から送信される画像データは複数のパケットに分割されているため、これらを正しく再構成する必要があります。
- HEX 形式からバイナリへの変換:受信したデータを適切に処理し、画像ファイルとして保存可能な形式に変換します。
- Nextcloud へのセキュアなアップロード:認証情報を適切に設定し、HTTPS を使用してセキュアに画像をアップロードします。
- デバイスへのダウンリンクコマンド送信による制御:双方向通信を実現し、デバイスの動作を制御できるようにします。
まとめ
Dragino AIS01-LB は、LoRaWAN を通じて画像転送を可能にする画期的なデバイスです。低解像度ながらも画像データを送信できる能力と、低消費電力設計により、これまでにない応用が可能となります。
本記事で紹介した実装例では、AIS01-LB から LoRaWAN 経由で送信された画像データを、Node-RED を使って効率的に処理し、Nextcloud に保存する方法を示しました。さらに、デバイスへのダウンリンクコマンド送信機能も実装することで、双方向通信を実現しています。
このような実装により、AIS01-LB を用いた様々なアプリケーションが可能になります:
- 遠隔地の監視システム
- 野生動物の観察
- 農作物の生育状況モニタリング
- 産業設備の定期点検
- 各種メーターの自動読み取り
LoRaWAN の長距離通信と低消費電力という特性を活かしつつ、画像データも扱える AIS01-LB は、IoT の新たな可能性を広げる存在と言えるでしょう。マニュアルに記載されている電池寿命の計算例を参考にすると、使用頻度や設定によっては数年単位の長期運用も可能です。今後、さらなる活用事例や改良が期待される exciting な製品です。
AIS01-LBを近く販売予定です。ご興味ある方は、お気軽にご連絡ください。
おまけ
このブログ記事は、絶賛流行中・進化中の生成 AI サービスを組み合わせて作成しました。
- ブログ全体の構成と執筆担当: Claude 3.5 Sonnet
- コーディング担当: ChatGPT 4o
- エビデンスチェック: Perplexity
- コードの動作検証と文書の最終チェック: 私
そして、この記事の全体をささっと素早く把握されたい場合は、たとえばMapifyとかを活用すると良いかもですね。