16章:非同期なサーバーソケットによるWiFi無線

    作成2015.11.03

  1. 非同期なサーバーソケットによるWiFi無線の参考アドレス
    非同期なサーバーのソケット
    https://msdn.microsoft.com/ja-jp/library/fx6588te(v=vs.110).aspx
    次の例では、クライアントから接続要求を受け取るサーバーを作成します。 サーバーはソケット非同期な構築し ているので、クライアントから接続を待つ間、サーバー アプリケーションの実行が中断されません。


  2. 非同期なTCPサーバープログラム
     プロジェクトの種類は、C#「Windowsフォームアプリケーション」を使用しました。本プログラムはマルチスレッドを使用 しており、プログラム構造が複雑で難解です。

     完成プログラム(MyTcpListener.exe)は以下からダウンロードできます。
    [16-1.zip]をダウンロードする。

    解凍するとAsynchronous2フォルダーがあります。フォルダー内に
    (1)Asynchronous2.sln等のソースファイル群
    (2)Asynchronous2.exe:実行ファイル
    があります。

    注(1)TCPサーバのポートは13000に設定してあります。
    注(2)接続の切断はアプリケーションの終了で行います。
    注(3)プログラムの詳細はソースファイルを参照願います。


  3. スケッチの作成
    (1)メニュー「ファイル」_「スケッチの例」_「ESP8266WiFi」_「WiFiClient」で作成されるスケッチを参考に以下のように修正しました。
    //WiFiClient 非同期
    #include 
    const char* ssid     = "SSID";//無線LANのSSD
    const char* password = "password";//無線LANのパスワード
    const char* host = "192.168.11.2";//パソコンのIPアドレス
    const int httpPort = 13000;//TCPサーバのポート
    static String gSendText="";
    
    void setup() {
      Serial.begin(115200);//シリアルポートを115200bpsで開始
      delay(10);
      // We start by connecting to a WiFi network
      Serial.println();
      
      WiFi.begin(ssid, password);//無線LANに接続要求
      
      while (WiFi.status() != WL_CONNECTED) {//接続完了まで待ちます。
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");  
    }
    
    void loop()
    {
      delay(500);
    
      // Use WiFiClient class to create TCP connections
      WiFiClient client;
    
      if (!client.connect(host, httpPort)) {//TCPサーバへの接続要求
        //Serial.print("x");
      }
      else
      {
        if(gSendText.length() > 1)
        {
          client.print(gSendText);//データを送信
          gSendText="";
        }
        else{client.print("a");}//"a"を送信
        delay(10);
        // Read all the lines of the reply from server and print them to Serial
        while(client.available())
        {
          String line = client.readStringUntil('\n');//受信します。
          Serial.print(line+"\r\n");
          gSendText=line + "=OK\r\n";//送信データのセット
        }
      }
    }
    


  4. スケッチの解説
    (1)以下を修正します。
    const char* ssid = "SSID";//無線LANのSSD
    const char* password = "password";//無線LANのパスワード
    const char* host = "192.168.11.2";//パソコンのIPアドレス
    const int httpPort = 13000;//TCPサーバのポート

    (2)Serial.begin(115200);
     シリアルポートを115200bpsで開始します。
    (3)WiFi.begin(ssid, password);//無線LANに接続要求
     無線LANに接続を開始します。(無線LANが動作しているのが前提です。)
    (4) while (WiFi.status() != WL_CONNECTED)
     接続完了まで待ちます。
    (5)client.connect(host, httpPort):TCPサーバへの接続要求
    (6)client.print(gSendText):gSendTextにデータがセットされている場合データを送信します。
    (7)client.print("a"):gSendTextにデータがセットされていない場合"a"を送信します。
    (8)String line = client.readStringUntil('\n'):受信します。

    上記シーケンスのポイント
    *標準的なTCPサーバとクライアントの通信手順となっています。
    *最初にクライアントからサーバに接続要求をします。
    *接続したら、クライアントからサーバにデータを送信します。
    *次にサーバからクライアントにデータを送信します。
    *サーバはクライアントにデータを送信後、接続を切断し接続待ちの状態で待機します。
    *サーバはほとんどの時間で接続待ちの状態で待機することになります。
    *接続待ちの状態では、どのクライアントからの接続要求も受け付けるため、複数のクライアントとの通信が可能です。


  5. スケッチの書込み
    (1)ESP-WROOM-02のフラッシュ書き換え時のピン設定
    *ENピン:(Chip Enable.)→High(10kΩプルアップ)
    *GPIO-15ピン:(Type I/O MTDO;HSPI_CS; UART0_RTS)→LowHigh(10kΩプルダウン)
    *GPIO-2ピン:(Type I/O UART Tx during flash programming)→High(10kΩプルアップ)
    *GPIO-0ピン:(Type I/O SPI_CS2)→Low(10kΩプルダウン)(Lowでラッシュ書き換えモード)
    *TXピン:USBシリアル変換モジュールのRX
    *RXピン:USBシリアル変換モジュールのTX
    *GNDピン:USBシリアル変換モジュールのGND

    (2)ESP-WROOM-02の電源を投入します。
    (3)メニュー「ツール」_「ポート」_「COM14」を選択します。
    (4)メニュー「スケッチ」_「マイコンボードに書込む」を選択します。
    (5)書込みが完了します。
    (6)GPIO-0ピン:(Type I/O SPI_CS2)→High(10kΩプルアップ)に戻します。
    (7)ESP-WROOM-02の電源を再投入します。


  6. 動作試験
    (1)arduino.exeを起動して、シリアルモニタを開きます。
    (2)GPIO-0ピン:(Type I/O SPI_CS2)→High(10kΩプルアップ)に戻し、ESP-WROOM-02の電源を再投入します
    (3).............WiFi connectedがシリアルモニタに表示されます。
    (4)Asynchronous2.exeを起動します。
    (5)接続ボタンを押すと以下のように接続完了が表示されます。



    (6)TCPサーバの送信テキスト内にABCDEFGHIJKLMNOPQRSTUVWXYZと入力し て、\r\n送信ボタンを3回ゆっくりとおしますと以下のようになります。



    (7)これでTCPサーバ側から送信して、ESP-WROOM-02側から返信が帰ってくることが確認できました。
    (8)終了はAsynchronous2.exeのクローズボタンを押します。
    (9)再開時はAsynchronous2.exeを再起動して、接続ボタンを押します。
       (ESP-WROOM-02は起動状態のままとします。)


  7. 非同期なサーバーソケットによるWiFi無線まとめ
    (1)非同期なサーバーソケットによるWiFi無線は、接続待ちの状態でロック状態とならないため、標準的なTCPサーバとクライアントの通信手順が適用できます。
    (2)最初にクライアントからサーバに接続要求をします。
    (3)接続したら、クライアントからサーバにデータを送信します。
    (4)次にサーバからクライアントにデータを送信します。
    (5)サーバはクライアントにデータを送信後、接続を切断し接続待ちの状態で待機します。
    (6)サーバはほとんどの時間で接続待ちの状態で待機することになります。
    (7)接続待ちの状態では、どのクライアントからの接続要求も受け付けるため、複数のクライアントとの通信が可能です。
    (8)Windowsのプログラムコードは、少し難解なのですが使い勝手の良いアプリケーションが作成できます。
    (9)やはり、非同期なサーバーソケットによるWiFi無線は本命の方法です。




17章:ESP-WROOM-02で気圧センサーモジュール/LPS25H(I2C)制御に行く。

トップページに戻る。