HN 日本語サマリー

← 一覧へ戻る
プログラミング

Mocktastic: ArduinoでMeshtasticノードを構築

Mocktastic: A Meshtastic Node on Arduino (github.com)

25 pointsby kimi1 コメント

要約

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.inoArduinoのエントリーポイント、ボード統合、無線設定、コンパイル時モード選択。
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
VCC3.3 V
GNDGND
SCK5
MISO19
MOSI27
NSS18
NRESET23
DIO026

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 / TurboShort Turbo21.88 kbps7 / 1284/5500 kHz140 dB
Short Range / FastShort Fast10.94 kbps7 / 1284/5250 kHz143 dB
Short Range / SlowShort Slow6.25 kbps8 / 2564/5250 kHz145.5 dB
Medium Range / FastMedium Fast3.52 kbps9 / 5124/5250 kHz148 dB
Medium Range / SlowMedium Slow1.95 kbps10 / 10244/5250 kHz150.5 dB
Long Range / TurboLong Turbo1.34 kbps11 / 20484/8500 kHz150 dB
Long Range / FastLong Fast1.07 kbps11 / 20484/5250 kHz153 dB
Long Range / ModerateLong Moderate0.34 kbps11 / 20484/8125 kHz156 dB
Long Range / Slow (deprecated)Long Slow0.18 kbps12 / 40964/8125 kHz158.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のバッテリー寿命、チャンネル処理、および地域無線設定は、特定のアプリケーションでさらなる作業が必要になる場合があります。