七月底對 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
可見, 重啟後多重連線也自動被關閉了.
Dear Tony,
回覆刪除謝謝你的文章,目前正在學習esp8266. 對於esp8266 的各種AT指令,描述得非常詳細。對於初學者來說有很大的幫助。現在可以利用Arduino + ESP8266 + DHT22 做一個簡單的web sever 顯示溫度和濕度。
with regards, DH Lu
歡迎互相分享交流!
回覆刪除看完版主的文章真的做出結果,真的很謝謝你的文章,獲益良多,謝謝版主 :)
回覆刪除謝謝您的留言, 我也是看前輩的文章學到的, 一定要自己動手做才知道會遇到那些問題, 我只是把過程與解決問題的眉角記錄下來而已. 把 AT 玩熟後就可以進到我現在正研究的 MicroPython 啦! ESP8266 目前很紅喔!
回覆刪除