15章:TCPサーバから任意タイミング送信タイプのWiFi無線

    作成2015.11.02

  1. TCPサーバから任意タイミング送信タイプのWiFi無線の参考アドレス
    WiFi library
    http://www.arduino.cc/en/Reference/WiFi
     無線LANシールド用のファームウェアは、ArduinoのIDEの1.0.5で変更されました。
     これらの指示に従って、この更新プログラムをインストールすることをお勧めします。
     Arduinoの無線LANシールドにおいて、このライブラリでArduinoのボードはインターネットに接続することができます。
     着信接続を受け付けるサーバーまたは発信するクライアント、いずれかの役割を果たすことができます。
     ライブラリは、WEPとWPA2パーソナル暗号化をサポートしますが、WPA2エンタープライズはサポートしません。
     また、SSIDがブロードキャストされない場合、シールドは接続できませんので注意してください。


  2. スケッチの作成
    (1)メニュー「ファイル」_「スケッチの例」_「ESP8266WiFi」_「WiFiClient」で作成されるスケッチを参考に以下のように修正しました。
    //TCP Client サンプルスケッチ
    #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サーバのポート
    WiFiClient client;
     boolean gRes=false;//TCPサーバとの接続フラグ
    
    void setup() 
    {
       delay(500);
      Serial.begin(115200);
      delay(10);
      WiFi.begin(ssid, password);//無線LANに接続要求
      Serial.println("");
      while (WiFi.status() != WL_CONNECTED) 
      {
        delay(500);
        Serial.print(".");
      }
      Serial.println("WiFi connected"); //無線LANに接続完了 
    }
    
    void loop() 
    {
        delay(500);
      if(gRes)//TCPサーバとの接続判定
      {//TCPサーバと接続済みの場合
        while(client.available())
        {
          String line = client.readStringUntil('\n');
          Serial.println(line);
           client.print(line + "OK\r\n");
    
           int ii=line.indexOf('E');
           if(line[ii]=='E' && line[ii+1]=='N' && line[ii+2]=='D' )
           {gRes=false;delay(5000);}//ENDコマンド受信の場合
        }
      }
      else
      {//TCPサーバと接続していない場合
         gRes = client.connect(host, httpPort);///TCPサーバに接続要求
        delay(1000);
      }
    }
    


  3. スケッチの解説
    (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)if(gRes)//TCPサーバとの接続判定
     TCPサーバと接続しているか判定します。
    (6)TCPサーバと接続済みの場合
    *受信データがある場合、受信データを読み出します。
    *受信データをシリアルモニタに送信します。
    *受信データに"OK\r\n"を追加して、TCPサーバに送信します。
    *受信データに「END」が含まれる場合、TCPサーバとの接続フラグをfalseに設定し、5s停止します。
    (7)TCPサーバと接続していない場合
    *TCPサーバに接続要求します。
    *1s停止します。

    上記シーケンスのポイント
    *TCPサーバと接続できない状態のときは約1.5s毎にTCPサーバに接続要求します。
    *接続が成功したら、接続要求をやめます。
    *接続が成功時は、受信データをチェックして読み出します。
    *ENDを受信したら、TCPサーバ側が終了の合図なので、TCPサーバと接続できない状態に戻します。
     (TCPサーバとの接続フラグをfalseに設定しないと矛盾が発生します。)


  4. スケッチの書込み
    (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の電源を再投入します。


  5. TCPサーバープログラム
     7章:TCPサーバプログラム自作の検討(3)の以下プログラムを使用します。
     使用するプログラム(MyTcpListener.exe)は以下からダウンロードできます。
    [7-1.zip]をダウンロードする。

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


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



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



    (7)これでTCPサーバ側から送信して、ESP-WROOM-02側から返信が帰ってくることが確認できました。


  7. 終了手順
    以下正しく終了するには、以下の手順をふむ必要があります。
    (1)TCPサーバの送信テキスト内にENDと入力して、\r\n送信ボタンを押します。
    (2)\r\n送信ボタンを押し後、5s以内に切断ボタンを押します。



    (3)この後は、再度接続ボタンを押すか、プログラムの終了が選択できます。
    (4)再度接続ボタンを押した場合は以下のようになります。



    (5)正しい終了手順をふまずにTCPサーバプログラムを終了すると以下のようになります。



    (6)ESP-WROOM-02のプログラム実行でエラーが発生し、ESP-WROOM-02が自動的に再起動されます。


  8. TCPサーバから任意タイミング送信タイプのWiFi無線まとめ
    (1)TCPサーバから任意タイミング送信タイプのWiFi無線は可能であることが確認できました。
    (2)TCPサーバプログラムはTcpListener クラス
    https://msdn.microsoft.com/ja-jp/library/system.net.sockets.tcplistener(v=vs.110).aspx
    を参考にしたものです。
    (3)コード記述が簡潔でわかりやすい反面、TcpClientの接続待ちの状態で接続が完了するまでの間、サーバー アプリケーションがロック状態となる欠点があります。
    (4)TCPサーバとクライアント間の命令のやりとりに矛盾があるとエラーが発生します。
    (5)TCPサーバプログラムを無条件に終了すると命令のやりとりに矛盾が発生するため、手順を踏んで終了する必要があります。
    (6)TCPサーバから任意タイミング送信タイプのWiFi無線は、パソコンもESP-WROOM-02も自作プログラムのため、自由度の高いプログラミングが可能です。
    (7)TCPサーバプログラムTcpListenerクラスは、接続待ちの状態でロック状態となるため、接続待ちの回数を大幅に制限しています。このため、標準的な通信手順とは異なっています。
    (8)非同期なサーバーのソケットの例
    https://msdn.microsoft.com/ja-jp/library/fx6588te(v=vs.110).aspx
    の適用も検討する必要がありそうです。




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

トップページに戻る。