ESP32のプログラミング準備

ESP32は『ESP32-WROVER-DEV』『ESP32-WROOM-32』の両方で確認してます

ArduinoIDE を利用して ESP32 をプログラミングします。Arduino の設定は省略し WebSocket について記載しておきます

まず WebSocket のライブラリをダウンロードします。『スケッチ』→『ライブラリをインクルード』→『ライブラリを管理』をクリックして『ライブラリマネージャ』を開き『ArduinoWebsockets』を選択してダウンロードします

ESP32プログラミング

SSIDとPASSWORDは、ルータとの設定を入れます

サーバープログラムは、ローカルサーバー vs Htmlクライアントと同じものを使い、そのローカルサーバーを立てたPCのIPアドレスをSERVER_HOSTとして入れます

SERVER_PORTは、ローカルサーバーで設定したポートアドレスを入れます

ESP32のWifiは2.4GHzのみのサポートですので注意してください

下記プログラムは、『setup』関数でWifi 設定とWebsocket設定しているのと、コールバック関数をセットしています

『onEventsCallback』関数は、Websocket のオープン、クローズなどのイベントをセットしていて、『onMessagesCallback』関数は、受信データを受け取る関数です。ここでのサンプルでは、主に文字列長さと文字列を表示してます

#include <ArduinoWebsockets.h>
#include <WiFi.h>

using namespace websockets;

WebsocketsClient Client;
const char*      SSID        = "?????";						// SSID
const char*      PASSWORD    = "?????";						// Password
const char*      SERVER_HOST = "192.168.1.19";					// server adress
const uint16_t   SERVER_PORT = 8080;							// server port

/*************************/
/*     コールバックイベント      */
/*************************/
// event:受信イベント
// data :受信データ
void onEventsCallback( WebsocketsEvent event, String data ) 
{
	switch( event )
	{
		case WebsocketsEvent::ConnectionOpened:
			Serial.println( "Event is opened" );
			break;
		case WebsocketsEvent::ConnectionClosed:
			Serial.println( "Event is closed" );
			break;
		case WebsocketsEvent::GotPing:
			break;
		case WebsocketsEvent::GotPong:
			break;
	}
}
/*************************/
/*    メッセージ受信イベント    */
/*************************/
// message:受信イベント
void onMessagesCallback( WebsocketsMessage message )
{
	char*  data   = (char*)message.c_str();					// uint_8 とすると プラス演算で文字列の変更されてしまうので char とする事
	int    length = message.data().length();					// 受信データ長

	/*************************/
	/*     デバッグ用表示     */
	/*************************/
	if( message.isBinary() ) Serial.println( "Binary" );
	if( message.isText()   ) Serial.println( "Text"   );
	Serial.print(  "length " );
	Serial.println( length   );
	for(int index = 0; index < length; index++ )
	{
		Serial.print( data[ index ] );
	}
	Serial.println( "" );
}
/*************************/
/*      起動セットアップ      */
/*************************/
void setup()
{
	Serial.begin( 115200 );

	/*************************/
	/*       Wifi接続        */
	/*************************/
	WiFi.begin( SSID, PASSWORD );

	for( int i = 0; i < 10 && WiFi.status() != WL_CONNECTED; i++ )	// ウエイト
	{
		Serial.print( "." );
		delay( 1000 );
	}
	if( WiFi.status() != WL_CONNECTED )							// ウエイト消化で接続チェック
	{
		Serial.println( "No Wifi!" );							// 未接続
		return;
	}
	Serial.println("Connected to Wifi, Connecting to server.");// Wifi接続完了

	/*************************/
	/*    Websockets接続     */
	/*************************/
	Client.onMessage( onMessagesCallback );					// メッセージ受信イベントセット
	Client.onEvent( onEventsCallback );							// 受信イベントセット

	bool connected = Client.connect( SERVER_HOST, SERVER_PORT, "/" );
	if( connected )												// 接続チェック
	{
		Serial.println( "Connected!" );
		Client.send( "Hello Server" );							// 接続完了
	}
	else
	{
		Serial.println( "Not Connected!" );						// 未接続
	}
}
/*************************/
/*       無限ループ        */
/*************************/
void loop()
{
	// let the websockets client check for incoming messages
	if( Client.available() )
	{
		Client.poll();
	}
	delay( 500 );
}

実行結果

ローカルサーバー vs Htmlクライアントと同じくローカルサーバーを起動します。ESP32 にプログラムをダウンロードすると(or リセットすると)、”Hello Server” を ESP32→ローカルサーバーに送信されます

ローカルサーバーは、送信元の ESP32 に 受信文字列 + “_response” の文字列を返信んします。この場合 ”Hello Server_response” を返信します

以下に、ArudinoIDE のシリアル通信モニタ表示を示します。ESP32 が ”Hello Server_response” を受信していることが分かります

次の展開

ESP32 を IOT のメインプロセッサとして使用し、サーバー経由でモニタに ESP32 の状況を吸い上げ、逆に ESP32 への指示を送信することができます。ESP32 にはカメラや各種センサ、もしくはモータ駆動装置を接続できるので様々な利用シーンが想定できます