Zephyr v4.2.0には、Wi-Fi接続を可能にする、FRDM-RW612ボード用のサンプルが含まれています(zephyr/samples/net/wifi/shell)。このサンプルは、Zephyrのシェルインターフェースを使用してWi-Fi接続を管理する方法を示しています。ここでは、近くにあるネットワークのスキャン、パスワードを用いた特定のSSIDへの接続、接続状態の監視がシェルコマンドにより行えます。また、ネットワークスタックの初期化やWi-Fiドライバの構成が行え、Wi-FiスキャンやWi-Fi接続などのコマンドも確認できるため、ZephyrベースのアプリケーションでWi-Fi機能のテストやデバッグを行う際に役立つツールです。
このガイドでは、もともとイーサネット用に設計されたmqtt_publisherサンプルを、Wi-Fiで動作するように変更します。このサンプルは、ブローカーに接続してネットワーク経由でメッセージを公開するMQTTクライアントをZephyr OSに実装する方法を示しています。Zephyrのネットワークスタックを使用し、TCP/IPとオプションのTLSをサポートし、指定されたトピックにデータを送信します。これにより、クラウドサービスやその他のMQTT対応システムと通信するIoTアプリケーションのビルディングのために実用的な出発点になります。
このガイドでは、以下のソフトウェアとツールを使用しています。
Zephyr環境のセットアップについては、こちらのガイドを参照してください。
1. MCUXpressoプラグインの「Import Example from Repository(リポジトリからサンプルをインポート)」ツールを使用して、mqtt_publisherサンプルをインポートします。README.rstファイルが開きます。このサンプルに関する説明やイーサネットでの実行方法が確認できます。
2. prj.confを開き、ファイルの最後に以下のオプションを追加します。
CONFIG_MAIN_STACK_SIZE=5200
CONFIG_SHELL_STACK_SIZE=6144
CONFIG_NET_TX_STACK_SIZE=2048
CONFIG_NET_RX_STACK_SIZE=2048
CONFIG_NET_PKT_RX_COUNT=10
CONFIG_NET_PKT_TX_COUNT=10
CONFIG_NET_BUF_RX_COUNT=20
CONFIG_NET_BUF_TX_COUNT=20
CONFIG_NET_MAX_CONTEXTS=10
CONFIG_NET_DHCPV4=y
CONFIG_NET_IPV6=n
CONFIG_INIT_STACKS=y
CONFIG_NET_STATISTICS=y
CONFIG_NET_STATISTICS_PERIODIC_OUTPUT=n
CONFIG_WIFI=y
CONFIG_WIFI_LOG_LEVEL_ERR=y
CONFIG_NET_L2_WIFI_SHELL=y
CONFIG_NET_MGMT_EVENT_QUEUE_TIMEOUT=5000
CONFIG_NET_MGMT_EVENT_QUEUE_SIZE=16
CONFIG_WIFI_NXP=y
CONFIG_NXP_RW610=y
CONFIG_ETH_DRIVER=n
CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048
CONFIG_NET_MGMT_EVENT_STACK_SIZE=4608
CONFIG_NET_TCP_WORKQ_STACK_SIZE=2048
CONFIG_IDLE_STACK_SIZE=1024
これらのZephyr構成は、必要なドライバやプロトコル(DHCPv4を含む自動IP割り当て)を有効化することで、NXP RW610ベースのボード(例:FRDM-RW612)上でWi-Fiネットワークを可能にします。主要なシステムコンポーネント(シェル、メインThread、ネットワークマネジメント、TCPワークキューなど)に十分なスタックサイズを割り当て、安定性と応答性を確保します。この設定では、中程度のネットワークトラフィックを処理するためのバッファとパケット数を設定し、イーサネットやIPv6などの未使用の機能を無効にし、ヒープ初期化やネットワーク統計などの診断ツールを有効にします。さらに、シェルとWi-Fiレイヤーを設定して、ランタイムコマンドとスキャンをサポートし、イベントキューパラメータを調整して混雑した環境での信頼性を向上させます。
3. 次に、Wi-Fiとの適切な動作を確保するためにサンプルに変更を加えます。元は、実行するとすぐにブローカーに接続を試みるものです。ここでは、ボードがWi-Fiネットワークに接続したら、シェルで呼び出してMQTTアプリケーションを起動できるコマンドが実行されるまで待機するように変更を加えます。
a. src/main.cで、以下を追加します。
#include
#include
shell.h - このヘッダーにより、Zephyrのシェルサブシステムへのアクセスが可能となります。そこでは、カスタムシェルコマンドを定義して登録することができます。
kernel.h - Zephyrのコアカーネルヘッダーです。 セマフォなどの基本的なOS機能にアクセスできます。
b.また、src/main.cで、start_app()の前にこちらのコードを追加します。
K_SEM_DEFINE(mqtt_pub_sem, 0, 1);
static int my_cmd_handler(const struct shell *shell, size_t argc, char **argv)
{
shell_print(shell, "Starting the MQTT publisher!");
k_sem_give(&mqtt_pub_sem);
return 0;
}
SHELL_CMD_REGISTER(start_mqtt, NULL, "Starts the MQTT publisher.", my_cmd_handler);
このコードは、セマフォを用いてMQTTパブリッシングプロセスをトリガーする、Zephyr OSのカスタムシェルコマンドを定義するものです。また、mqtt_pub_semという名前のバイナリセマフォも作成されます。ここでは元のカウント値が「0」のため、待機しているスレッドは与えられるまでブロックされます。
関数のmy_cmd_handler()は、セマフォを解放し、MQTTパブリッシャが開始できることを示す、シェルコマンドハンドラです。
このコードはまた、「start_mqtt」というコマンドをシェルに登録します。Zephyrシェルで「start_mqtt」と入力すれば、MQTTのパブリッシングプロセスを開始できます。
c. また、src/main.cで、セマフォを待機するようにstart_app()を変更します。こちらのコード行をwhileループの開始直前に挿入します。
k_sem_take(&mqtt_pub_sem, K_FOREVER);
d. config.hのMQTTブローカーアドレスを更新し、Wi-Fiネットワーク上のブローカーに対応させます。
#define SERVER_ADDR "192.168.1.10"
4. デバイスツリーでスタンバイノードを有効にします。こちらの項目と共に、boards/フォルダにfrdm_rw612.overlayという名前のオーバーレイファイルを作成します。
&standby {
status = "okay";
};
これでプロジェクトを構築し、FRDM-RW612にロードすることができます。これを実行するには、同じWi-Fiネットワーク上で動作するブローカーに加え、Zephyrのシェルへのアクセスを可能にする、ターミナルプログラムが必要です。
以下のコマンドを使用してボードをWi-Fiネットワークに接続し、MQTTパブリッシャーアプリケーションを起動します。
$ Wi-Fiスキャン
このコマンドは、ボードのWi-Fiインターフェースを使用して、近くのWi-Fiネットワークのスキャンを開始します。使用可能なSSID、信号強度、セキュリティタイプが一覧表示され、どのネットワークが範囲内にあり、接続可能かをユーザーが識別するのに役立ちます。
$ wifi connect -s my_ssid -p my_key -k 1
このコマンドでは、デバイスをWi-Fiネットワークに接続できます。
-s my_ssidは、Wi-Fiネットワークの名前(SSID)を指定します。.
-p my_keyは、ネットワークのパスワードまたは事前共有鍵を提供します。
-k 1 は鍵管理の種類を示します(例:WPA/WPA2)。
実行されると、デバイスは指定されたネットワークへの関連付けと認証を試みます。
$ start_mqtt
MQTTパブリッシングプロセスの開始を示すカスタムシェルコマンド(アプリケーションで定義)です。
FRDM-RW612ボードをベースにした、ZephyrのプロジェクトにWi-Fi接続を実装する方法について説明します。このガイドでは、Zephyr v4.2.0を使用してWi-Fi上で動作するよう、イーサネットベースのmqtt_publisherサンプルを適応させる方法をご紹介します。組み込まれたwifi/shellサンプルを確認しながら、ネットワークスタックの構成やMQTTパブリッシングを制御するカスタムシェルコマンドの作成が行えます。ワイヤレスネットワーク経由でのシームレスなクラウド通信を必要とする、IoTアプリケーションをビルドする開発者に最適です。