2019年9月6日金曜日

ESP-WROOM-02のATモードでWeb Server構築

"WROOM-02のATモードでWiFI接続"、"ArduinoでWiFi接続してみる"の続きで、ESP-WROOM-02でATコマンドを用いてWebサーバーを構築します。

Arduinoを直接使う事はないので、ESP-WROOM-02単体で設定しても問題ありません。

まずは、WiFiモードの確認。
AT+CWMODE?
+CWMODE:1

OK
+CWMODE:1(ステーションモード)になっています。
自分で設定してあるので当たり前何ですけどね。

WiFiの接続とIPアドレスの確認。
AT+CIFSR
+CIFSR:STAIP,"XXX.XXX.XXX.XXX"
+CIFSR:STAMAC,"XX:XX:XX:XX:XX:XX"

OK
※Xには、WiFi環境によって任意の数値が入ります

Webサーバーの設定

接続数制限の有無を設定。
設定コマンド
コマンド AT+CIPMUX=<mode>
戻り値 OK
パラメータ <mode>:
  1. 単一接続
  2. 複数接続
注釈
  • デフォルトのモードはシングル接続モードです。
  • 複数の接続は、透過送信が無効(AT+CIPMODE=0)になっている場合にのみ設定できます。
  • このモードは、すべての接続が切断された後にのみ変更できます。
  • TCPサーバーが実行されている場合は、単一接続モードをアクティブにする前に削除(AT+CIPSERVER=0)する必要があります。
AT+CIPMUX=1
現在の設定内容を確認。
AT+CIPMUX?
+CIPMUX:0

OK
+CIPMUX:0(単一接続)に設定されているのが確認出来ました。

これを複数接続にするには、"透過送信が無効(AT+CIPMODE=0)"である必要があるようなので、その辺りも調べてみます。+CIPMODEはクエリコマンドでの実行もできるので確認。
AT+CIPMODE?
+CIPMODE:0

OK
下記で詳細を確認。
設定コマンド
コマンド AT+CIPMODE=<mode>
戻り値 OK
パラメータ <mode>:
  1. 通常の送信モード。
  2. UART-Wi-Fiパススルーモード(透過送信)、リモートIPとポートが変更されない場合、TCPシングル接続モードまたはUDPモードでのみ有効にできます。
注釈
  • 設定の変更はフラッシュに保存されません。 
  • UART-Wi-Fiパススルー送信中に、TCP接続が切断された場合、ESP8266は、送信を終了を指示する+++が入力されるまで再接続を試行し続けます。通常のTCP転送であり、TCP接続が切断された場合、ESP8266はプロンプトを表示し、再接続を試行しません。
AT+CIPMODE=1
"通常送信モード"に設定されているので、複数接続の要件は問題ない事が確認できました。
続いて、複数接続(AT+CIPMUX=1)に設定します。
AT+CIPMUX=1

OK
TCPサーバーを作成・・・する前に、複数接続の最大数を確認しておきます。
設定コマンド
コマンド AT+CIPSERVERMAXCONN=<num>
戻り値 OK
パラメータ <num>: TCPまたはSSLサーバーへの接続が許可されるクライアントの最大数、範囲: [1, 5]
注釈 この構成を設定するには、サーバーを作成する前にコマンドAT+CIPSERVERMAXCONN=<num>を呼び出す必要があります。
AT+CIPMUX=1
AT+CIPSERVERMAXCONN=2
AT+CIPSERVER=1,80
"+CIPSERVERMAXCONN"をクエリコマンドで実行。
AT+CIPSERVERMAXCONN?
+CIPSERVERMAXCONN:5
OK
最大数の"5"に設定されています。
"5"つも接続する予定もないので、"例"にならい"2"に設定しておきます。
AT+CIPSERVERMAXCONN=2

OK
以降で、いよいよTCPサーバーを作成します。

Webサーバーの起動

設定コマンドを確認。
設定コマンド
コマンド AT+CIPSERVER=<mode>[,<port>]
戻り値 OK
パラメータ
  • <mode>:
    1. サーバーを削除します。
    2. サーバーを作成します。
  • <port>:ポート番号; デフォルトでは333。
注釈
  • TCPサーバーは、複数接続がアクティブになっている場合(AT+CIPMUX=1)にのみ作成できます。
  • TCPサーバーが作成されると、サーバーモニターが自動的に作成されます。
  • クライアントがサーバーに接続されると、1つの接続を使用してIDが割り当てられます。
AT+CIPMUX=1
AT+CIPSERVER=1,1001
サーバーを作成するので<mode>は"1"、<port>は"80"を指定します。
AT+CIPSERVER=1,80

OK
ブラウザから作成したサーバーのIPアドレスにアクセスすると、シリアルモニタが以下のような表示に変わります。(Macの場合です。)
0,CONNECT
1,CONNECT

+IPD,0,XXX:GET / HTTP/1.1
Host: XXX.XXX.XXX.XXX
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_XX_X) AppleWebKit/XXX.XX (KHTML, like Gecko) Chrome/XX.X.XXXX.XXX Safari/XXX.XX
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate
Accept-Language: ja,en;q=0.9,und;q=0.8

シリアルモニタに表示されている、上記の赤字"0"は"link ID"となります。試しに別にブラウザを開いて再度アクセスすると"link ID"の個所が"1"となった表示を確認出来るかと思います。

このままではブラウザは読み込み状態のままで何も表示されません。
ブラウザに表示を行うには、以下の設定コマンドを用いてHTML書式の文字列を送信する必要があります。
設定コマンド
コマンド
  • Single connection: (+CIPMUX=0)
    AT+CIPSEND=<length>
  • Multiple connections: (+CIPMUX=1)
    AT+CIPSEND=<link ID>,<length>
  • Remote IP and ports can be set in UDP transmission:
    AT+CIPSEND=[<link ID>,]<length> [,<remote IP>,<remote port>]
戻り値 指定された長さのデータを送信します。
設定コマンドの後に、return > をラップします。シリアルデータの受信を開始します。<length> で定義されたデータ長に達すると、データの送信が開始されます。
接続を確立できないか、データ送信中に中断した場合、システムは次の値を返します。:
ERROR
データが正常に送信された場合、システムに戻ります:
SEND OK
失敗した場合、システムに戻ります:
SEND FAIL
パラメータ
  • <link ID>: 複数接続の場合、接続ID(0~4)。
  • <length>: データ長、最大: 2048 bytes
  • [<remote IP>]: リモートIPはUDP伝送で設定できます。
  • [<remote port>]: リモートポートはUDP伝送で設定できます。
<H1>Hello Arduino!</H1>を表示してみます。
<link ID>は0で、表示する文字列は、23byteなので、
AT+CIPSEND=0,23

OK
>
を送信して>が戻ってきたら、
さらに、"<H1>Hello Arduino!</H1>"を送信。
busy s...

Recv 23 bytes

SEND OK
ブラウザに、
と表示された事が確認できたでしょうか?

ブラウザに上記の文字が表示された後も、ブラウザは読み込み状態のままなので接続を閉じる必要があります。

TCP / UDP / SSL接続を閉じるためのコマンドを確認してみましょう。
設定コマンド 実行コマンド
コマンド AT+CIPCLOSE=<link ID> AT+CIPCLOSE
戻り値 OK
パラメータ <link ID>:
接続を閉じる対象のID。IDが5の場合、全ての接続が閉じられます。(サーバーモードでは、ID 5は無効となります)
-
どちらのコマンドも、複数接続(+CIPMUX=1)で設定されている事が前提となります。設定コマンドでは<link ID>を指定して接続を閉じ、実行コマンドでは全ての接続を閉じます。

ここでは、設定コマンドで<link ID>を指定して実行してみます。
AT+CIPCLOSE=0
0,CLOSED

OK
1,CLOSED
0,CONNECT

+IPD,0,XXX:GET /favicon.ico HTTP/1.1
Host: XXX.XXX.XXX.XXX
Connection: keep-alive
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_XX_X) AppleWebKit/XXX.XX (KHTML, like Gecko) Chrome/XX.X.XXXX.XXX Safari/XXX.XX
Accept: image/webp,image/apng,image/*,*/*;q=0.8
Referer: http://XXX.XXX.XXX.XXX/
Accept-Encoding: gzip, deflate
Accept-Language: ja,en;q=0.9,und;q=0.8
以上が、Webサーバーを構築する際の一連の流れとなります。

Arduinoの出番は全くありませんが、Webサーバーの設定はフラッシュメモリへ保存されないので、ここで出てきた一連の操作をArduinoのスケッチとして書き込む必要があります。

やっとArduinoの出番ですが、長くなったのでここまで。

0 件のコメント:

コメントを投稿