Mocktastic: ArduinoでMeshtasticノードを構築
Mocktastic: A Meshtastic Node on Arduino (github.com)
要約
Mocktasticは、ESP32ボード向けのArduino IDE環境で動作する、Meshtastic互換のカスタマイズ可能な小型LoRaクライアントです。このプロジェクトは、C++でMeshtasticパケットの構築とデコードを行う方法を示しており、動作する環境センサーの例も含まれています。DECODERモードではシリアルシェルでメッセージ送受信が可能で、SENSORモードではDHT22温湿度センサーとして機能します。
全文翻訳
Mocktastic
Mocktasticは、ESP32ボード向けのArduino IDE環境で動作する、Meshtastic互換のカスタマイズ可能な小型LoRaクライアントです。これは公式Meshtasticファームウェアのフォークではなく、教育的・実験的な実装です。このプロジェクトは、C++でMeshtasticパケットを構築およびデコードする方法を示しており、動作する環境センサーの例も含まれています。
ファームウェアには、コンパイル時に2つのモードがあります。
- DECODER: 設定されたMeshtasticチャンネルやダイレクトメッセージの受信、デコード、送信を行うための対話型シリアルシェルを提供します。
- SENSOR: ボードをDHT22温度・湿度センサーに変換します。測定値を送信したり、設定されたプライベートチャンネル上の
/dhtメッセージに応答したりできます。
この実装はLilyGO T3 LoRa32 V1.6.1 (ESP32-PICOおよびSX1276) を対象としており、他の互換性のあるESP32/LoRaハードウェアへの適応を意図しています。
依存関係のインストール
プロジェクトでは、テストフェーズ中の暗号化部分にMBDTLSを、軽量なprotobufエンコーダーとしてNano-Protobufを使用しています。テストはDoctestの軽量C++テストフレームワークを使用して記述されています。
リポジトリのレイアウト
リポジトリのルートには meshtastic_decoder/ が含まれており、ファームウェアとホストサイドのテストが格納されています。
| ファイルまたはディレクトリ | 目的 |
|---|---|
meshtastic_decoder/meshtastic_decoder.ino | Arduinoのエントリーポイント、ボード統合、無線設定、コンパイル時モード選択。 |
meshtastic_decoder/functions.h, functions.cpp | 一般的なパケット、バイト、文字列ヘルパー。 |
meshtastic_decoder/crypto.h, crypto.cpp | クライアントが使用する暗号化操作(AESおよびX25519を含む)。 |
meshtastic_decoder/meshtastic.h, meshtastic.cpp | 高レベルのMeshtasticパケット処理、暗号化、Protobufペイロード。 |
meshtastic_decoder/lora_shell.h, lora_shell.cpp | シェルコマンド解析と高レベルメッセージ操作。クライアントの拡張を開始するのに適した場所です。 |
meshtastic_decoder/keys.h | チャンネルおよびノードID設定。 |
meshtastic_decoder/nanopb_meshtastic/ | Nanopbランタイムと生成されたMeshtastic Protobuf定義。 |
meshtastic_decoder/mbedtls/ | ホストサイドテストで使用されるバンドルされたmbedTLSソース。 |
meshtastic_decoder/test/ | プラットフォーム非依存ロジックのDoctestベース単体テスト。 |
ホストテストのビルドと実行
個々の予測可能なロジックユニットのテストには、Pythonの unittest アプローチをモデルとして使用しました。プロジェクトでは、プロトコルとユーティリティロジックをハードウェア効果から分離し、開発マシン上で実行できるようにしています。テスト自体は軽量なdoctestフレームワークで記述されており、バンドルされたテスト依存関係でコンパイルされます。
meshtastic_decoder から、以下を実行します。
cd meshtastic_decoder
make test
Makefileはテストを1つのステップでビルドおよび実行します。テストは、プラットフォーム非依存関数、暗号化、Meshtasticパケット処理、シェル解析をカバーしています。無線またはセンサーの動作への変更も、ターゲットハードウェアで確認する必要があります。APIドキュメントをビルドするには、DoxygenとGraphvizをインストールし、meshtastic_decoder/ から make doxygen を実行してください。生成されたドキュメントは meshtastic_decoder/docs/html/ に書き込まれます。
Mocktasticノードの作成
要件
ESP32ボードとSemtech SX1276ファミリーのLoRa無線が必要です。SENSORバリアントにはDHT22も必要です。テストされたボードはLilyGO T3 LoRa32 V1.6.1で、ESP32とLoRa無線が統合されています。
Arduino IDEをインストールし、このリポジトリをダウンロードまたはクローンして、meshtastic_decoder/meshtastic_decoder.ino を開きます。Arduinoライブラリマネージャーを通じて、以下のライブラリをインストールしてください。
- LoRa by Sandeep Mistry
- Adafruit Unified Sensor
- DHT sensor library by Adafruit
build_opt.h を開き、ハードコードされたファイルパスを入力します。これは "Hard/coded/path/…/Mocktastic/meshtastic_decoder/nanopb_meshtastic/src" のようになるはずです。 === LoRaピン
対応するピンを特定するために、ボードの仕様を確認してください。LilyGO T3 LoRa32 V1.6.1のマッピングは以下の通りです。
| SX1276信号 | LilyGO T3 LoRa32 V1.6.1 GPIO |
|---|---|
| VCC | 3.3 V |
| GND | GND |
| SCK | 5 |
| MISO | 19 |
| MOSI | 27 |
| NSS | 18 |
| NRESET | 23 |
| DIO0 | 26 |
meshtastic_decoder/meshtastic_decoder.ino のLoRaピン定義に、お使いのボードのピンを入力してください。
#define LORA_SCK 5
#define LORA_MISO 19
#define LORA_MOSI 27
#define LORA_SS 18
#define LORA_RST 23
#define LORA_DIO0 26
地域無線プリセット
Meshtastic無線プリセットの参照として、以下の表を使用してください。選択したプリセットと周波数が、お住まいの地域でサポートされていることを確認してください。
| 無線プリセット | 代替名 | データレート | SF / シンボル | コーディングレート | バンド幅 | リンクバジェット |
|---|---|---|---|---|---|---|
| Short Range / Turbo | Short Turbo | 21.88 kbps | 7 / 128 | 4/5 | 500 kHz | 140 dB |
| Short Range / Fast | Short Fast | 10.94 kbps | 7 / 128 | 4/5 | 250 kHz | 143 dB |
| Short Range / Slow | Short Slow | 6.25 kbps | 8 / 256 | 4/5 | 250 kHz | 145.5 dB |
| Medium Range / Fast | Medium Fast | 3.52 kbps | 9 / 512 | 4/5 | 250 kHz | 148 dB |
| Medium Range / Slow | Medium Slow | 1.95 kbps | 10 / 1024 | 4/5 | 250 kHz | 150.5 dB |
| Long Range / Turbo | Long Turbo | 1.34 kbps | 11 / 2048 | 4/8 | 500 kHz | 150 dB |
| Long Range / Fast | Long Fast | 1.07 kbps | 11 / 2048 | 4/5 | 250 kHz | 153 dB |
| Long Range / Moderate | Long Moderate | 0.34 kbps | 11 / 2048 | 4/8 | 125 kHz | 156 dB |
| Long Range / Slow (deprecated) | Long Slow | 0.18 kbps | 12 / 4096 | 4/8 | 125 kHz | 158.5 dB |
スケッチのデフォルトはEU Medium Fastで、以下のように設定されています。
LoRa.begin(869525024);
LoRa.setSpreadingFactor(9);
LoRa.setSignalBandwidth(250E3);
LoRa.setCodingRate4(5);
LoRa.setSyncWord(0x2B);
LoRa.setPreambleLength(16);
LoRa.enableCrc();
送信する前に、必ず現地の無線規制を確認してください。Meshtasticドキュメントの概要ページで、無線設定とその周波数スロット計算機を使用して、チャンネルとスロットを選択し、対応する周波数を決定してください。その周波数をスケッチで使用し、他のノードと一致していることを確認してください。
keys.h の設定
コンパイル前に、meshtastic_decoder/keys.h で PublicChannel, PrivateChannel, Admn, Device を設定してください。
PublicChannelには、選択した周波数で使用される公開チャンネルの名前とキーを入力します。チャンネル名は無線プリセット(例:MediumFast)に対応します。PrivateChannelには、プライベートメッセージに使用されるプライベートチャンネルの名前とキーを入力します。Admnには、メッセージを読み取るメインノードの名前またはノードIDと公開鍵を入力します。このエントリに秘密鍵を入れないでください。Deviceには、このノードの名前、公開鍵、秘密鍵を入力します。
関連ノードに接続されたMeshtasticソフトウェアを使用して、チャンネル設定とノード詳細を読み取ってください。Channel 構造体には name と key が含まれます。Friend には name と publicKey が含まれます。User には name, publicKey, privateKey がこの順序で含まれます。キーは16進数文字列である必要があります。MeshtasticはBase64で提供する場合があります。設定に追加する前に b64StrToHexStr() を使用して16進数に変換してください。
ご自身の認証情報を使用し、秘密鍵とチャンネルキーは秘密にしてください。公開リポジトリに公開しないでください。
ファームウェアバリアントの選択
スケッチはコンパイル時にモードを選択します。meshtastic_decoder/meshtastic_decoder.ino の一番近くにある DECODER を定義したままにするか、DHT22センサーバリアントの場合は SENSOR に置き換えてください。
#define DECODER
センサービルドの場合は、その行を以下に置き換えてください。
#define SENSOR
選択したESP32ボード用にArduino IDEでスケッチをビルドしてアップロードしてください。
LoRaシェル (DECODER)
DECODERバリアントはシリアル接続経由で操作されます。115200ボーでシリアルモニターを開きます。コマンドは以下の通りです。
| コマンド | 説明 |
|---|---|
/echo <text> | テキストをシリアルコンソールに表示します。 |
/pub <text> | 公開チャンネルにMeshtasticパケットを送信します。 |
/cantine <text> | プライベートチャンネルにMeshtasticパケットを送信します。 |
/admn <text> | ADMINにプライベートダイレクトメッセージを送信します。 |
/r | 前のコマンドを繰り返します。 |
/rssi | 現在のLoRa RSSIを表示します。 |
/pwr17 <value> | LoRa送信電力を設定します。 |
/gain <value> | LoRaゲインを設定します。 |
/help | コマンドヘルプを表示します。 |
/send_key | 公開鍵を送信してダイレクトメッセージを開始します。 |
/raw <text> | テスト用に準備されたパケットを送信します。 |
例えば、/pub 42 is the answer を送信して公開チャンネルに書き込みます。プライベートチャンネルに hello, world! を送信するには、/cantine hello, world! を使用します。
Admn とのダイレクトメッセージを有効にするには、まず /send_key を送信します。これにより、このノードの公開鍵が送信され、公式Meshtasticノードがプライベート会話を確立できるようになります。次に /admn hello, world! でダイレクトメッセージを送信します。
SENSORバリアント
SENSORバリアントには対話型シェルはありません。keys.h で設定されたプライベートチャンネルにMeshtasticメッセージを送信することによってのみ制御できます。そのチャンネルで /dht を送信すると、センサーが温度と湿度を測定し、結果を同じチャンネルにテキストメッセージとして返信します。
DHT22のデータピンをGPIO 21に接続します。スタンドアロン運用にはバッテリーも必要です。
クライアントの拡張
可能な限り、プロトコルと解析ロジックをハードウェア効果から分離してください。ポータブルロジックはホストサイドテストで実行され、.ino スケッチは無線、シリアル、GPIO、センサーのインタラクションを処理します。
新しいシェルコマンドについては、meshtastic_decoder/lora_shell.h および meshtastic_decoder/lora_shell.cpp の既存のパターンに従ってください。コマンドをパーサーとコマンド列挙型に追加し、meshtastic_decoder/meshtastic_decoder.ino のディスパッチャーで処理します。高レベルのパケット操作については、lora_shell の関数と meshtastic.h のインターフェースから開始してください。低レベルヘルパーには functions.h を使用します。
プラットフォーム非依存ロジックを変更した後は、meshtastic_decoder/ から make test を実行してください。ハードウェアの動作は、ターゲットボード上および互換性のあるMeshtasticノードに対して検証する必要があります。
スコープと制限事項
このコードは学習およびプロトタイピングプロジェクトです。フィールドテストは限定的で、公式Meshtasticファームウェアの信頼性や電力効率を提供せず、安全クリティカルまたは本番環境での使用には推奨されません。そのSENSORのバッテリー寿命、チャンネル処理、および地域無線設定は、特定のアプリケーションでさらなる作業が必要になる場合があります。