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 にはカメラや各種センサ、もしくはモータ駆動装置を接続できるので様々な利用シーンが想定できます