メイン画像

ESP32でUDP通信

ESP32でUDP通信


一応プログラム関係の記事もやっていこうと思います。
まずは、昔作ったやつを載せていきます。

ESP32というDIYの救世主である高性能マイコンで動くやつです。
正確にはESP32をArduino互換で動かしているのでarduinoでも動くはずです。

単純にデータを送信するのと受信するのみを実装してみました。
TCPはいろんな人がサンプル出してたりするので、ちょっと少ないUDP通信の方で作ってみたやつです。
本来ならUDPなのでパケットロスや受信時は別スレッドでキューに渡してやるとかで実装するべきだが、わかりやすくするためにその辺は省いて最低限で実装しています。
※arduinoIDEを使う場合は必ずc++ファイルにすること。cとcppファイルで扱いが異なるため。platformioは知りません。

simpleUDP.hpp
#ifndef _H_simpleUDP_
#define _H_simpleUDP_

//WIFI関係
#include "WiFi.h"
#include 

void initUDP();
void openUDP();
void SendUDP(char *str);
void RecvUDP(unsigned long timeout);

#endif

simpleUDP.cpp
#include "simpleUDP.hpp"
#include 
#include "myUtilJson.h"
#include "FS.h"
#include "SD.h"

#define WIFISETTINGFILE "/wifi_setting.json"  //WIFI関係の設定ファイル

// IPAddress ip(192, 168, 1, 30);              //送信元IPアドレス(固定IPアドレス)
// IPAddress gateway(192,168, 1, 1);           //ゲートウェイアドレス
// IPAddress subnet(255, 255, 255, 0);         //サブネットマスク
// IPAddress cl01_ip(192, 168, 1, 70);         //送信先IPアドレス

WiFiUDP UDP;  //UDP

//wifiの初期化
void initWiFi(const char * path)
{
  IPAddress ip;              //送信元IPアドレス(固定IPアドレス)
  IPAddress gateway;         //ゲートウェイアドレス
  IPAddress subnet;         //サブネットマスク
  
  MyUtilJson utiljson;  //json操作クラス
  DynamicJsonDocument doc(1000);

  utiljson.readJson(SD,path,doc);  //送信コマンドjsonファイル読み込み

  const char* clip=doc["cliant"]["ip"]; //送信元IPアドレス
  const char* clsubnet=doc["cliant"]["subnet"]; //サブネットマスク
  const char* clgateway=doc["cliant"]["gateway"]; //ゲートウェイアドレス
  const char* wifi_ssid=doc["wifi"]["ssid"]; //wifi接続先
  const char* wifi_password=doc["wifi"]["password"]; //wifi接続先パスワード

  if(strcmp("no",doc["cliant"]["dhcp"]) == 0)
  {
    //固定IPアドレスの場合
    ip.fromString(clip);
    gateway.fromString(clsubnet);
    subnet.fromString(clgateway);
  }else
  {
    //DHCP使用時
    Serial.println("dhcp+++++++++++++++++");
    //未実装
  }

  WiFi.mode(WIFI_STA);  //無線モード(ルーターを介するやつ)
  WiFi.config(ip, gateway, subnet); //IP等の設定
  WiFi.begin(wifi_ssid, wifi_password); //無線の初期化
}

//UDP初期化
void initUDP()
{
  initWiFi(WIFISETTINGFILE);
  //initWiFi("/display_setting.json");
//  Serial.println(WiFi.localIP());
}

//UDP接続
void openUDP()
{
  //ルーターへの接続
  while (WiFi.status() != WL_CONNECTED)
  {
    Serial.println("...Connecting to WiFi");
    delay(1000);
  }

  MyUtilJson utiljson;  //json操作クラス
  DynamicJsonDocument doc(1000);
  
  utiljson.readJson(SD,WIFISETTINGFILE,doc);  //送信コマンドjsonファイル読み込み
//  const int clport=(int)doc["cliant"]["port"]; //送信元IPアドレス

  //UDP.begin(Org_Port);  //UDP通信の開始
  UDP.begin((int)doc["cliant"]["port"]);  //UDP通信の開始
}

//UDP送信
void SendUDP(char *str)
{
  IPAddress server_ip(192, 168, 1, 70);         //送信先IPアドレス

  MyUtilJson utiljson;  //json操作クラス
  DynamicJsonDocument doc(1000);
  
  utiljson.readJson(SD,WIFISETTINGFILE,doc);  //送信コマンドjsonファイル読み込み
  const char* svip=doc["server"]["ip"]; //サーバIP
 // const int svport=doc["server"]["port"]; //サーバポート番号

  server_ip.fromString(svip);

  UDP.beginPacket(server_ip, (int)doc["server"]["port"]);  //パケットの開始
  UDP.print(str); //送信データ書き込み
  UDP.endPacket();  //パケットの終了
}

//UDP受信

void RecvUDP(unsigned long timeout)
{
  char rv_data[50]; //受信バッファ
  int datasize = 0; //受信データサイズ

  unsigned long timestart,timenow = timestart = millis(); //経過時間用
  while( (timenow - timestart) < timeout){
    datasize = UDP.parsePacket();
    if (datasize > 0)  //受信バイト数
    {
      UDP.read(rv_data , datasize);  //UDPデータの取得
      rv_data[datasize] = '\0';
      Serial.print("Recieve : ");
      Serial.println(rv_data);
      UDP.flush();
      break;
    }
    
    timenow = millis();
  }
}

設定はjsonファイルから読み込みます。
後々のことを考えてJSON操作系の処理もクラス化してラッピングしときます。
json操作はarduinojsonライブラリを使用しているので、ライブラリはインストールしておくこと!!

MyUtil.h
#define _H_my_util_json_

#include 
#include "FS.h"
#include

//クラスの定義
class MyUtilJson
{
public:
    void readJson(fs::FS &fs, const char* path,JsonDocument &doc);
};

#endif
MyUtilJson.cpp
//Jsonファイルの読み込み
void MyUtilJson::readJson(fs::FS &fs,const char *path,JsonDocument &doc)
{  
  File file = fs.open(path);  //jsonファイルオープン

  //json解析
  DeserializationError error = deserializeJson(doc, file);  //ファイル(Stream)からデシリアライズ
  file.close();
}
wifi_setting.json
{
	"cliant": {
		"dhcp": "no",
		"ip": "192.168.1.30",
		"subnet": "255.255.255.0",
		"gateway": "192.168.1.1",
		"port": 50001
	},
	"server": {
		"ip": "192.168.1.70",
		"port": 50007
	},
	"wifi": {
		"ssid": "hogehoge",
		"password": "fugafuga"
	}
}



アカウントを作成 して、もっと沢山の記事を読みませんか?


この記事が気に入ったら Sylphy さんを応援しませんか?
メッセージを添えてチップを送ることができます。


この記事にコメントをしてみませんか?


プログラミング、ジャンク品修理、ゲームなどの趣味の部分を主に取り扱っていきます。

おすすめの記事