AESP-IDFを使ってみる

ESPNOW


ESPNOWはEspressIFが提供するPeerToPeerの通信規格です。
WiFiチャネルの選択やユーザ名、パスワードの認証を行わないので、WiFiに比べ短時間、省電力で動くのが特徴です。
ESPNOWはESP8266でも利用可能で、ESP8266とESP32の間でもESPNOWを使った通信が可能です。

あまり知られていない更新ですが、ESP-IDF V5.4からESPNOWのバージョンが2.0に更新されました。
ESPNOW Ver1では最大ペイロードサイズは250バイトでしたが、Ver2では1470バイトに拡張されています。
ESP8266のESPNOWはVer1なので、ESP8266と通信するときは250バイトまでの制限が有ります。




こ ちらにESPNOW通信のサンプルが公開されています。
このサンプルを実行するためには2台のESP32が必要です。
menuconfigを起動するとWiFi modeの選択が有ります。


ESP32はどのモデルもStation InterfaceとSoftAP Interfaceの2つのWiFi Interfaceを持っています。
それぞれのInterfaceには、異なるMACアドレスがアサインされています。
ESPNOWはStation Interface/SoftAP InterfaceのどちらかのInterfaceを使って通信を行います。
WiFi modeはどちらのInterfaceを使うかの選択で、WiFi modeと言うメニュー名が分かりにくいです。
WiFi modeの選択ではなく、WiFi Interfaceの選択です。

こちらがStation Interfaceを使った時のロギングです。


こちらがSoftAP Interfaceを使った時のロギングです。
送信側のMACアドレスが24:0a:c4:c5:46:fcから24:0a:c4:c5:46:fdに変わります。




なかなか難解なコードですが、このサンプルではBroadcast通信とUnicast通信の使い方が紹介されています。
このサンプルは最初はBroadcastで通信相手を探しますが、相手が見つかるとUnicast送信に切り替えます。


Unicast通信に切り替えて100回送信すると、送信を終了します。
こちらが送信側のロギングです。


こちらが受信側のロギングです。


コードを少し変更して、通信速度を測定してみました。
パケット長1470バイトを100回送信した場合、7060Bytes/Sec(55.2M Bits/Sec)程度の通信速度です。
そこで、WiFiのチャネルを変えて、同じ条件で試してみました。
チャネルの使用状況により通信速度は大きく変わります。
WiFi Cannnel Bytes/Sec M Bits/Sec
1 7000 54.7
3 7810 61.0
5 9480 74.1
7 9670 75.5
9 9860 77.0
11 7810 61.0
13 9070 70.9
14 10270 80.2



ESP8266にはWiFi Interfaceが1つしかないので、ESPNOWとWiFiを同時に使うことができませんでしたが、
ESP32ではWiFi Interfaceが2つあるので、ESPNOWとWiFiを同時に使うことができます。
ESPNOWとWiFiを同時に使う場合、WiFiはAPSTAモードで初期化する必要が有ります。
APSTAモードで初期化すると、SoftAP InterfaceとStatsion Interfaceが初期化されます。
WiFiルータを介して外の世界と通信する場合、WiFiルーターとの通信はStation Interfaceを使用し、ESPNOWはSoftAP Interfaceを使用します。



こちらにESPNOWのサ ンプルコードが公開されています。
ESP8266もESP32もArduino環境のコードですが、Linux用のESPNOWのコードが公開されています。
LinuxでESPNOWを使う場合、WiFiインターフェースをモニター モードに変更する必要が有ります。
WiFiのモニター モードは、WiFi アダプターの特別なモードで、送信先に関係なく、特定のチャネルのすべてのワイヤレス トラフィックをキャプチャできます。
こちらが、wlx1cbfceaae44dのInterfaceをmonitorモードに変更する手順です。
$ iwconfig
lo        no wireless extensions.

enp2s0    no wireless extensions.

wlx1cbfceaae44d  IEEE 802.11  ESSID:off/any
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Power Management:off


$ sudo ifconfig wlx1cbfceaae44d
wlx1cbfceaae44d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 1c:bf:ce:aa:e4:4d  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ sudo ifconfig wlx1cbfceaae44d down

$ sudo iwconfig wlx1cbfceaae44d mode monitor

$ sudo ifconfig wlx1cbfceaae44d up

$ sudo ifconfig wlx1cbfceaae44d
wlx1cbfceaae44d: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        unspec 1C-BF-CE-AA-E4-4D-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (不明なネット)
        RX packets 2412317  bytes 380570756 (380.5 MB)
        RX errors 0  dropped 109773  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

続く...