2015年11月16日 星期一

ESP8266 網頁伺服器 AT 指令測試

七月底對 ESP8266 進行 AT 指令測試時, 對於伺服器部分僅做了簡單的 PING 及與 Java client 程式的 TCP 連線測試, 沒有進行網頁伺服器的測試, 參考 :

ESP8266 WiFi 模組 AT command 測試

今天看到 alselectro 的這篇文章, 介紹使用 AT 指令來測試 ESP8266 網頁伺服器功能的方法 :

# WiFi Module ESP8266 – 2. TCP CLIENT /Server mode

晚上就按圖索驥, 依照這篇描述來測試看看. 關於 AT 指令語法參考 :

# ESP8266 Serial WIFI Module
https://github.com/espressif/ESP8266_AT/wiki/AT_Description

首先, 做為伺服器用時, ESP8266 必須工作在 STATION (mode=1) 或 STATION+AP (mode=3) 模式, 因為這樣它才會從 DHCP 獲得一個區網 IP (作為區網中的一台主機) :

AT+CWMODE=1


OK
AT+CIFSR

192.168.2.116

OK

這是 STATION 模式下所取得之區網 IP. 去 PING 它應該要能獲得回應 :

C:\Users\petertw89>PING 192.168.2.116

Ping 192.168.2.116 (使用 32 位元組的資料):
回覆自 192.168.2.116: 位元組=32 時間=876ms TTL=255
回覆自 192.168.2.116: 位元組=32 時間=65ms TTL=255
回覆自 192.168.2.116: 位元組=32 時間=70ms TTL=255
回覆自 192.168.2.116: 位元組=32 時間=77ms TTL=255

192.168.2.116 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 65ms,最大值 = 876ms,平均 = 272ms  

如果是在 STATION+AP 模式下, 將獲得兩個 IP :

AT+CWMODE=3

OK

AT+CIFSR

192.168.4.1         (SoftAP 的 IP)
192.168.2.116     (Station 的 IP)

OK

其中第一個 IP=192.168.4.1 是 ESP8266 作為 SoftAP 之 IP, 僅作為網路接取點用, 無法作為主機使用. 第二個 IP 192.168.2.116 則是作為 STATION 用, 從 DHCP 所分派而得之 IP, 在區網中做為其他主機的伺服器要用到的就是這個 IP. 如果把 ESP8266 設為 AP 模式, 那麼就只剩下這個 SoftAP 的 IP 了 : 

AT+CWMODE=2

AT+CIFSR

192.168.4.1

OK

這個 SoftAP 的 IP 在區網中 PING 不到 :

C:\Users\petertw89>PING 192.168.4.1

Ping 192.168.4.1 (使用 32 位元組的資料):
要求等候逾時。
要求等候逾時。
要求等候逾時。
要求等候逾時。

192.168.4.1 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 0, 已遺失 = 4 (100% 遺失),


搞定工作模式後 (即須在模式 1 或 模式 3), 還有一個必要的設定要做才能啟動伺服器, 那就是開啟多重連線, 因為所謂伺服器就是要服務許多客戶端的連線要求的 (但 ESP8266 同一時間最多只能接受 6 個連線) :

AT+CIPMUX=1

OK

開啟多重連線後, 才可以啟動 TCP 伺服器, 其 AT 指令需輸入兩個參數, 第一個參數必須為 1 (0 的話是關閉伺服器), 第二個參數是要開啟的埠號, 一般網頁伺服器為 port 80, 當然也可以開啟不是專用 (well-known) 與註冊 (registered) 的埠號, 例如 8080 :


AT+CIPSERVER=1,80

OK

如果是在單一連線下開啟伺服器功能, 會收到 ERROR 回應 :

AT+CIPSERVER=1,80


ERROR

好, 啟動伺服器後, 便可用手機, 平板, 或電腦連線到與 ESP8266 所連的相同 AP (這樣才會在同一區網內), 啟動瀏覽器, 在網址列輸入伺服器的 IP 位址 (此處是 192.168.2.116), 我是從手機連線的, 這時瀏覽器會停在那邊, 不會看到任何內容 (因為要等 ESP8266 伺服器回應才知道要呈現啥內容啊!) :


這時在序列埠監視視窗會看到 ESP8266 收到來自手機的連線要求 (Link), 可看到手機瀏覽器傳來的 HTTP 標頭 :

Link

+IPD,0,498:GET / HTTP/1.1
Host: 192.168.2.116
Connection: keep-alive
x-wap-profile: http://wap1.huawei.com/uaprof/HONOR_H30-L02_Global_UAProfile.xml
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; H30-L02 Build/HonorH30-L02) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
Accept-Encoding: gzip,deflate
Accept-Language: zh-TW,en-US;q=0.8
X-Requested-With: com.android.browser


OK

注意在 +IPD 後面的那個數字, 就是代表連線的通道編號, 此處為通道 0, 後面的 498 表示收到 498 個字元. 這時若用 AT+CIPSTATUS 去查看連線狀態 :


AT+CIPSTATUS

STATUS:3
+CIPSTATUS:0,"TCP","192.168.2.102",38679,1

OK

可以看到目前有來自 192.168.2.102 (就是我的手機連上 WiFi 所獲得的無線區網 IP) 埠號 38679 的一個 TCP 連線, STATUS 為 3 表示 Connected. 最後的 1 表示 ESP8266 目前是作為 Server (0 表示 Client), 參考 :

# https://github.com/espressif/esp8266_at/wiki/CIPSTATUS

接下來我們必須在伺服器連線逾時 (timeout) 之前送出回應給客戶端, 這個逾時計時器預設是 180 秒, 可用 AT+CIPSTO? 查詢 :

AT+CIPSTO?

+CIPSTO:180

OK

當然也可以用 AT+CIPSTO=timeout 設定, 逾時秒數範圍 0~28800.

回到送出回應, 首先要用 AT+CIPSEND 指令告訴 ESP8266 要送出的回應長度, 以便它能組建 TCP 訊息. 例如伺服器回應 "Hello!", 此字串含有 6 個字元, 但要額外加上 "\r\n"  這兩個跳行字元, 一共是 8 個字元, 所以 AT 指令 :

AT+CIPSEND=0,8

這時 ESP8266 回應大於符號, 表示可以開始傳送資料, 接著送出 Hello! :

> Hello!
SEND OK

看到 SEND OK 表示傳送成功, 但這時瀏覽器還看不到伺服器回應, 必須關閉 TCP 連線才會收到回應 :


AT+CIPCLOSE=0    (關閉 TCP 連線)


OK
Unlink
Link

+IPD,0,357:GET /favicon.ico HTTP/1.1
Host: 192.168.2.116
Connection: keep-alive
Accept: */*
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; H30-L02 Build/HonorH30-L02) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36
Accept-Encoding: gzip,deflate
Accept-Language: zh-TW,en-US;q=0.8
X-Requested-With: com.android.browser


OK
Unlink

這時手機瀏覽器才會收到伺服器回應的 "Hello!" :


再用 AT+CIPSTATUS 去查詢 IP 連線狀態, 可知連線已中斷 (4=DISCONNECTED) :

AT+CIPSTATUS

STATUS:4

OK

以上便是網頁伺服器的 Server-Client 互動流程.

最後, 若要關閉伺服器, 停止網頁服務, 同樣是下 AT+CIPSERVER 指令, 但只要給一個參數 0 即可 :

AT+CIPSERVER=0

we must restart

這表示關閉伺服器後必須重啟 ESP8266 :


AT+RST


OK
bB��Sb禔S��"�芀�侒��S��
[Vendor:www.ai-thinker.com Version:0.9.2.4]

ready

AT+CIPMUX?

+CIPMUX:0

OK

可見, 重啟後多重連線也自動被關閉了.

 

4 則留言:

  1. Dear Tony,

    謝謝你的文章,目前正在學習esp8266. 對於esp8266 的各種AT指令,描述得非常詳細。對於初學者來說有很大的幫助。現在可以利用Arduino + ESP8266 + DHT22 做一個簡單的web sever 顯示溫度和濕度。

    with regards, DH Lu

    回覆刪除
  2. 看完版主的文章真的做出結果,真的很謝謝你的文章,獲益良多,謝謝版主 :)

    回覆刪除
  3. 謝謝您的留言, 我也是看前輩的文章學到的, 一定要自己動手做才知道會遇到那些問題, 我只是把過程與解決問題的眉角記錄下來而已. 把 AT 玩熟後就可以進到我現在正研究的 MicroPython 啦! ESP8266 目前很紅喔!

    回覆刪除