ESP32同士によるwifiUDP通信

こんにちは。
久しぶりの投稿となりました。
今回はESP32を2つ使って、wifiUDP通信でデータを送ってみました。
自分の備忘録的な意味合いのほうが大きいため、あまり参考にはならないかもしれませんが、よければご覧ください。


今回使ったESP32です。
f:id:ceramie2000:20190327183611j:plain
どちらも秋月電子で売ってるdevkitですが、写真右側のは新しいほうのESP32-WROOM-32Dですね。まぁ何が違うのかさっぱりわからないんですが...
左側のほうをアクセスポイント(サーバ)とし、右側のほう(クライアント)でアクセスするようにしました。


今回参考にさせて頂いたサイト様は以下の2つです。
サーバ側
【ESP32】ESP32とスマホを接続してWiFiUDP通信する方法 - ソースに絡まるエスカルゴ
クライアント側
ESP32でUDP通信やってみた(ESP32インストール手順解説あり) - Qiita


まず、サーバ側(文字データ受け取り側)です。

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "ESP32_wifi"; // SSID
const char pass[] = "esp32pass";  // password
const int localPort = 10000;      // ポート番号

const IPAddress ip(192, 168, 4, 1);       // IPアドレス(ゲートウェイも兼ねる)
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

WiFiUDP udp;

void setup() {
  Serial.begin(115200);

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定

  Serial.print("AP IP address: ");
  IPAddress myIP = WiFi.softAPIP();
  Serial.println(myIP);

  Serial.println("Starting UDP");
  udp.begin(localPort);  // UDP通信の開始(引数はポート番号)

  Serial.print("Local port: ");
  Serial.println(localPort);
}

void loop() {
  if (udp.parsePacket()) {
    char i = udp.read();  //ceramie追記 askiiから文字列へ
    Serial.println(i); // UDP通信で来た値を表示
  }
}

ほとんどそのままですが、そのままでは10進数のASKIIコードで表示されてしまうため、char型変数に一回代入してます。


次に、クライアント側(文字データ送信側)です。

#include <WiFi.h>
#include <WiFiUdp.h>

const char ssid[] = "ESP32_wifi"; // SSID
const char pass[] = "esp32pass";  // password

static WiFiUDP wifiUdp; 
static const char *kRemoteIpadr = "192.168.4.1";  //送信先のIPアドレス
static const int kRmoteUdpPort = 10000; //送信先のポート

static void WiFi_setup()
{
  static const int kLocalPort = 5000;  //自身のポート

  WiFi.begin(ssid, pass);
  while( WiFi.status() != WL_CONNECTED) {
    delay(500);  
  }  
  wifiUdp.begin(kLocalPort);
}

static void Serial_setup()
{
  Serial.begin(115200);
  Serial.println(""); // to separate line  
}

void setup() {
  Serial_setup();
  WiFi_setup();
}

void loop() 
{
  wifiUdp.beginPacket(kRemoteIpadr, kRmoteUdpPort);
  wifiUdp.write('a');  //10進数のaskiiで送信される
  wifiUdp.endPacket();  

  delay(3000);
}

こちらはほとんど変えていません。
SSIDとパスワードとIPアドレスとポートを入力しただけです。


一応、この2つのコードをそのまま書き込めば動くはずです。
クライアント側のloopの中にあるwifiUdp.write('a');でaを送信してます。
現状では1文字しか送れてません。
サーバ側をシリアルモニタで確認して、aが3秒経過ごとに送られてきたら成功です。
f:id:ceramie2000:20190327183504p:plain
ESP32はサーバ側→クライアント側の順でリセットして使ってください。
それでは!