SSブログ

Raspi,ESP32のAPモードを使った1対1WiFi通信

 Raspberry piとESP32にはアクセスポイント(AP)モードがあり他のコンピューターから直接WiFi接続ができます。
複数のclient接続も可能で且つclient間の通信も可能かと思いますが、ここでは1対1のUDP通信を行うことを目的とし、夫々のAPモードを使って次の組み合わせで通信を行ってみました。

*** AP server ** --- ** client **
(1) ESP32 ----------- ESP32
(2) ESP32 ----------- Raspberry pi
(3) Raspberry pi ---- ESP32
(4) Raspberry pi ---- Raspberry pi

 テストプログラムは、Clientから測定データに相当するものとして1024バイトのデータを約0.1秒間隔でserverに送信して その都度serverからclientに制御や設定データに相当する128バイトを送信するという仕様です。
Raspberry pi用はPython3 と c言語の両方のプログラムを作ってあります。
=> プログラムのダウンロード

 APサーバーのIPアドレスは 192.168.4.1 にしていますが192.168.4の部分が既存のネットワークと重複するようであれば変更してください。
またSSIDとKeyは次のようにしてあります。
ESP32 AP SSID/Key: ESP32-AP/esp32pass
Raspi AP SSID/Key: Pi-AP/raspipass
SSID, Key, IPアドレスなどを変更する場合はシステム設定変更(Raspbery piの場合)のほか使用するプログラム内の記述も変更してください。


(APモード設定)
 ESP32をAPモードにするにはスケッチ内にコードを記述するのみでできます。記述内容は上でダウンロードしたプログラムパッケージ内の AP_check/ESP_AP.inoをご覧ください。
Raspberry piをAPモードにするにははちょっとした設定が必要になります。下記を参照して設定してください。
=> Raspi APモード設定手順のダウンロード

(APへの接続方法)
・Raspberry piクライアントからESP32ならびにRaspberry piのAPサーバーへの接続は、Raspberry pi(クライアント)画面のWiFiマークをクリックしてSSID表示するとその中にAPのSSIDが表示されるのでそのセキュリティキーを入力すればできます。接続されたかどうかもその状態表示からわかります。(通常のWiFi接続と同じです)
接続確認用のESP32のAPサーバーはESP_AP.ino を書き込んで起動してください。(起動するとシリアルモニターに Router Starts が表示される。)

・ESP32クライアントからESP32ならびにRaspberry piのAPサーバーへの接続設定は、ESP32のスケッチ内のコード記述のみです。
ESP32クライアントがRaspberry pi APやESP32 AP(ESP_AP.ino書き込み済み)に接続できるかどうかは、ESP_Client.inoを書き込んでシリアルモニターで確認できます。(接続できると WiFi connected が表示される。)

(UDP送受信)
 APモードの設定と接続ができたら、ダウンロードしたプログラムを使ってUDP送受信の実験ができます。
フォルダ名とAPサーバー、クライアントの関係は以下のようになっています。

*フォルダ名*-----*AP server* ---- *client*
ESPsvr-ESPcli ... ESP32 ---------- ESP32
ESPsvr-RPIcli .... ESP32 ---------- Raspberry pi
RPIsvr-ESPcli .... Raspberry pi --- ESP32
RPIsvr-RPIcli .... Raspberry pi --- Raspberry pi
(注意)同じファイル名のものが異なるフォルダ内にありますが、内容が違いますので注意してください。

(留意事項)
・UDPプログラムは先にサーバー側を起動してからクライアント側を起動してください。

・通信データはバイト列なので提供したPythonプログラムでの表示は数字列にはならず文字化けしたような表示になります。(変換すると遅くなるのでやりませんでした。)

・c言語ソースは、ターミナルモードでそのファイルのあるディレクトリに入りコンパイルしてください。コンパイルのコマンドラインはファイルの始め方に書いてあります。
例: <コンパイル> $ gcc -Wall -o pisvr pisvr.c  <実行> $ ./pisvr

・プログラムはUDP通信に必要な基本的な部分だけしか含んでいません。(WiFiが一時的に切れた場合の再接続処理などは入っていません。)

・サーバー側、クライアント側の処理時間によっては送受信がスキップすることがあります。
受信データの表示の有無にも左右され、特に処理速度の遅いPythonの場合は顕著です。
プログラムを変更してデータ表示をやめたり表示数を減らしたりすると改善するのがわかります。
プログラムは送信時と受信時にそれぞれメッセージを表示するようにしてあります。 (プログラム内の設定によってはデータ表示が間に入る事がある。) それらのメッセージが交互に表示されればスキップは起きていませんが、複数連続して同じメッセージが表示される場合はスキップが発生していることになります。UDPではスキップの発生がある程度ある事を前提にしたプログラミングが必要です。

・PythonプログラムではUDP受信はブロッキングモードにしてあるので、一旦スキップが発生するとプログラムは動いていますが処理がそこでスタックしてしまいます。
ノンブロッキングモードにするとスキップ発生時に下記表示が出てプログラムが終了してしまいます。
  BlockingIOError: [Errno 11] Resource temporarily unavailable 
実用プログラムを作成するにはこの問題に対処する必要があります。


===== 関連記事 =====
Raspberry pi 同士のアドホック通信


>> ブログ記事一覧へ
nice!(0) 
共通テーマ:趣味・カルチャー

nice! 0