2014年12月9日 星期二

操控 ESP8266 無線模組 - 經由 AP、STA 和 AP+STA 三種模式,學習 ESP8266 AT 指令

網頁最後修改時間:2016/12/19
ESP8266, ESP-01 電路板接腳名稱
上一篇 "初遇 IoT ( Internet of Thing, 物聯網 ) - 使用 Arduino 控制 ESP8266 無線模組上傳資料到 IoT Server ( ThingSpeak )" 直接就以實際例子展示了 ESP8266 無線模組的使用方法,不過在此當時並未針對其 AT 指令有過特別介紹,為的是希望由例子中先知道 ESP8266 無線模組可以做什麼應用,直接由例子中不懂的地方找資料可以更容易的學習到東西,而不是只是重頭從最無聊的 AT 指令來認識 ESP8266 無線模組。

由於 ESP8266 無線模組的韌體一直在更新當中,因此若是韌體版本不同 ( 可以在連線之後,傳送 AT+GMR\r\n 指令取回模組的韌體版本 ) 就會有新舊指令或是新增指令間輸入的差別,不同版本間 AT 指令可能會回傳 ERROR,所以這篇網頁只適用於 AT+GMR\r\n 之後回傳的版本號為

0018000902-AI03

其中,前面四個數字代表的是 AT Command 的韌體版本號,0018 表示 v18;後面五個數字代表的是 SDK 的版本號,000902 表示 SDK v0.9.2

ESP8266 無線模組的開發 SDK 與 AT 指令的韌體程式都是開放的,所以所有的 AT 指令原始碼都可以查閱。程式碼會比官方文件出的速度要快,因此真的不理解或是有問題,可以直接打開原始碼去看比看文件會更清楚

AT 指令韌體原始碼:{雲端硬碟} / SDK / at_v0.19 / at_v0.19_14_10_30.zip
SDK 韌體開發原始碼:{雲端硬碟} / SDK / esp_iot_SDK_v0.9.3 / esp_iot_sdk_v0.9


ESP8266, ESP-01 AT 指令簡介:

Note:每一條 AT 指令的最後都必須加上 \r\n,除非有特別說明,下面的 AT 指令都會將其省略,請讀者下 AT 指令時特別注意 !

ESP8266 無線模組的指令主要分為:基礎 AT 指令WiFi 功能 AT 指令TCP/IP 工具箱 AT 指令 ... 等,根據韌體版本的不同,會新增或修改 AT 指令以方便使用者的操作。

每一條指令可以細分四種命令:
  1. 測試命令

    AT+指令=?

    =? 用於查詢設置指令或內部設置的參數,以及其取值範圍;白話一點,就是測試剛剛下的 AT+指令 是否成功
  2. 查詢命令

    AT+指令?

    返回該指令的當前設定值
  3. 設置命令

    AT+指令=...

    =... 用來設置用戶自定義的參數值
  4. 執行命令

    AT+指令

    用來執行模組內部已定義的程序

要注意下面幾點:
  • 不是每條 AT 指令都具備上面 4 種命令
  • 前後若加上雙引號代表字串
  • 鮑率 ( Baud Rate ) 依韌體板本會有所不同,版本 0018000902 預設使用 9600 bps

接下來,直接操作 ESP8200, ESP-01  AP+STA ( 混和模式 ) 三種模式來間接說明無線模組的 AP ( Access Point, 無線網路基地台 )、STA ( Station, 個人工作站 ) 模式指令,方法步驟如下:
  • PC 與手機測試軟體下載與安裝
    .
  • 取得無線網路的 SSID ( Service Set Identifier, 無線網路的名稱或識別碼 ) 與密碼
    .
  • ESP8266, ESP-01 無線模組通訊接線
    .
  • ESP8266 無線模組 AT 指令操作 ( 以 AP+STA 模式說明 AP 和 STA 模式 )

PC 與手機測試軟體下載與安裝:

下面列出幾個在手機與 PC 好用的軟體,除了手機 APK 需要安裝之外,其他都是綠色軟體不需要安裝就可以使用。

ps. 除了 Roboremo 手機 APP 之外的軟體,其他下面所講的軟體都可在 "{雲端硬碟}/測試軟體" 目錄下找到。


手機:
  • Android Serial Test,USR-TCP-Test_android [ APK ]
    使用這個軟體,可以使用手機來測試串列埠通訊,支援 TCP Server / Client 和 UDP Server / Client 四種工作模式。

    Note: 這個 APK 不能直接由 Google Play 安裝,APK 要先複製到手機,再由手機安裝!
USR-TCP-Test 畫面
  • Roboremo
    支援藍牙、有線和無線網路遠端控制,GUI 介面可客製化的手機軟體!
    強烈建議安裝免費版,簡單的客製化操作介面與按鈕對應輸出字元設定,可以很快地用來控制外部裝置,省下寫手機程式的時間,介面範例如下:
Roboremo 介面範例

PC:

下面列出的軟體都不需要安裝,只要解壓縮後就可以使用,建議全部下載並解壓縮以備不時之需 !
USR-TCP232-Test 啟動畫面, 來源:www.usr.co
  • SSCOM32
    COM 埠測試軟體,絕大部分都使用這個軟體做 AT 指令測試。
  • ESP8266-Config-Utility
    如果不熟 AT 指令的話,可以使用這個軟體直接操作;但是反過來說,如果不熟 AT 指令使用這軟體,操作沒有順序容易導致指令錯誤!
    只要 COM 埠與 ESP8266 無線模組連上線,就會另外開啟一個 Serial Monitor 的視窗,任何輸出以及回應的情況都會顯示在這個視窗中。
ESP8266 Config Utility 啟動後連線成功畫面
  • SocketTest,TCP Server / Client 測試軟體
    這軟體是用 Java 寫的,所以適用大部分的作業系統,是用來讓 PC 作為 TCP Server 或是 TCP Client 的軟體,也是等一下完成 AT 指令設置之後作為測試的主角。
    下載後解完壓縮,雙擊 {SocketTest 目錄} / webstart / SocketTest.jnlp 就可以開啟程式。
SocketTest 啟動畫面

取得無線網路的 SSID ( Service Set Identifier, 無線網路的名稱或識別碼 ) 與密碼:

取得家中或是環境中的無線網路的名稱可以使用 AT 指令,但是密碼就無法由 AT 指令取得 ! 想辦法去取得這個密碼,當 ESP8266 作為 STA 需要這密碼才能連上無線路由器再連到區域網路中的 TCP Server。

假設等一下要連線的無線路由器資料是:
  •  SSID 名稱:I_AM_ROUTER
  •           密碼:1234567890
現在就可以先將 PC 連線到 I_AM_ROUTER


ESP8266, ESP-01 無線模組通訊接線:

最重要,也是網路上一堆人無法正確與 ESP8266 通訊的接線問題!

其實這問題不難,主是因為這片模組的接腳很多,因此在通訊出現問題時就會想說 「是不是有什麼沒接好,或是模組壞掉了...」等問題。

其實當你被這些問題搞過一遍之後,不懂也會懂了!但是最好不要,因為只要掌握下面幾個重點,就會變得很簡單:
  • 電源、功率兩個因素很重要,韌體燒錄會比通訊需要更多的電流需求!
    通訊時只要使用我們選擇的 USB 轉 TTL 模組就可以;韌體燒錄就看韌體燒錄時的線路說明。

  • ESP8266, ESP-01 是使用 UART 傳送 AT 指令去切換無線模式和操作模組的功能,因此基本接線就是 3 ~ 3.6V 的電源 ( VCC, GND ) 和 UART 接腳 ( UTXD, URXD ) 共四支接腳,但是比較不同的是,ESP8266 需要另外一支晶片致能 ( CH_PD ) 的接腳與 VCC 接腳接在一起才能正常動作,不然無法通訊。

ESP8266, ESP-01 的接法可以分為直接通訊,與外接電源是接法。前者不需要另一個外接電源介入;後者需要另外一個外接電源提供足夠的電流。在下面,會有兩種方式的接法說明,但是建議使用外接電源的方式,因為這會避免因為 USB 轉 TTL 模組電流不夠而且不能用於燒錄韌體等問題,會省下很多除錯的時間。

直接接線通訊方式:

通訊的電路接線
ESP8266, ESP-01 入門學習的套件資料,可以參考露天賣場的商品網頁,依照裡面的材料清單去準備這些東西
ESP8266, ESP-01
其中,拿出下面幾項東西,先接線再準備與 PC 連線
  • 1  x  [ USB 轉 TTL 模組 ( 左下 ) ]
  • 1  x  [ ESP8266, ESP-01 ( 左中 ) ]
  • 3  x  [ ( 一母對一母 ) 杜邦線 ( 黑、黃、綠色 ) ]
  • 1  x  [ ( 一母對二母 ) 杜邦線 ( 藍色 ) ]
下表是最終接線通訊接線表格
USB 轉 TTL 模組杜邦線顏色ESP8266, ESP-01
3V31 藍 1VCC
1 藍 2CH_PD
TXDURXD
RXDUTXD
GNDGND
+5VXX

注意 !!!
接下來的每一步驟都不能跳過,並照著下面的步驟接線再依指示開啟 SSCOM32E,不然會導致 PC 的 COM 埠不能正常與 ESP8266 通訊!
另外,在未接線之前,先將 USB 轉 TTL 模組插上 PC,確認驅動程式是否正常驅動?以及系統所給的 COM 埠號碼是多少?

照著下面照片先將四條線接上 USB 轉 TTL 模組,再分別將黃線與綠線接到 ESP8266, ESP-01 的 URXDGND 接腳
STEP 1 / 5
拉近看,兩條杜邦線都是接在下排接腳
STEP 1 / 5,近看圖
拉出黑線另一頭接到 ESP8266, ESP-01 的 UTXD 接腳 ( 綠線上面那一支接腳 )
STEP 2 / 5
拉出其中一條藍線接到 ESP8266, ESP-01 的 VCC 接腳 ( 黃線上面那一支接腳 )
STEP 3 / 5
好了!現在先插上 USB 轉 TTL 模組到 PC 的 USB 插槽上,這時會看到 USB 轉 TTL 模組與 ESP8266, ESP-01 的電源燈 ( 紅色 LED ) 都是亮起的狀態。
STEP 4 / 5
開啟 SSCOM32E 並設定好相關的參數與 COM 埠號碼。

按下 "Open Com" 按鈕先連線到 USB 轉 TTL 模組,這時不能出現任何的錯誤訊息!

最後,重點來了!接上另一根藍色的線在黑線右邊,這時就會看到 ESP8266, ESP-01 板子上面的藍色燈與 USB 轉 TTL 模組藍色的燈都同時閃了幾下,表示兩者通訊成功,而且在 SSCOM32E 顯示區會出現一段亂碼 ( 等一下再解釋 ),這時按下 "CloseCom" 再 "Open Com" 就可以開始確定模組是否可正常通訊了!

所以當接線正確時,模組通電的時候就會看到紅燈與藍燈一起亮起,且藍燈會閃爍之後滅掉只剩下紅燈一直亮著,藍燈只有在通訊時會閃爍!
STEP 5 / 5
輸入 AT ( 記得 SendNew 要打勾 ),回傳 OK 就表示可以開始下指令了!
ESP8266, ESP-01 通訊起始與測試 AT 啟動
如果沒有回應的話,再重新 "CloseCom" 再 "Open Com" 一次試試!這是使用這方法通訊的缺點,但是說真的比較方便,因為只要動作正確,還是可以直接使用 USB 轉 TTL 模組的電源供給 ESP8266!

但如果要更穩定,就要使用下面的外接電源通訊接法,也就是使用材料清單左上角的電源模組來負責供給 ESP8266 3V3 電壓,而且就不會有這個問題出現了。所使用到的杜邦線就如同材料清單上面的就可以完成,完全不需要用到麵包板。

[ 2015/06/05 更新 ]
ESP8266, ESP-01 因為使用的韌體版本不同會有不同的 BaudRate。藍板 ( 001800902 ):9600 bps;黑板 AT v0.23, SDK v1.0.1:115200 bps。

*********************************************************************************
ESP8266 開機時亂碼的原因:

這是因為開機時會先跑 boot rom 的一段 log,然後才會進入到用戶程式區,而這兩個時段使用的 鮑率不一樣。boot rom 是 74880 bps,用戶程式區就是 AT Command 韌體所定義的 9600 bps。
*********************************************************************************

外接電源通訊接法:

這種接法是最穩定的接法,而且可以提供足夠的電流給模組使用,可用在一般通訊以及韌體燒錄上,所需要的全部杜邦線就在材料清單照片上。
ESP8266, ESP-01 外接電源通訊接線電路圖
接線電路圖如上所示,每一條線代表一條杜邦線。若是有分支,表示要使用 1 對 2 杜邦線作連接。

從實際完成的接線照片中可以看到,USB 轉 TTL 模組只需要 TXD、RXD 和 GND 三隻接腳 ( 不需要 3V3 接腳 ),且 ESP8266, ESP-01 與 USB 轉 TTL 模組的 GND 使用杜邦線 1 對 2 連接到麵包板電源模組的 GND 接腳就可以,其餘的接法與直接通訊的接線相同,這樣就完成外接電源通訊接線。
ESP8266, ESP-01 外接電源通訊接法完成圖
完成接線之後,麵包板電源模組先不要通電 ( 可以先插電電源,但要確認按鈕在關閉的檔位 ( 也就是 LED 沒有亮 ) ),先插上 USB 轉 TTL 模組到 USB 插槽,確認通訊沒問題之後開啟 SSCOM32E 並設定好所有通訊參數之後按下 "Open Com" 按鈕,然後進行三個 AT 基本指令的操作 ( 這三個 AT 指令的說明在下一段 ),每一個動作或 AT 指令使用紅色需線隔開。
ESP8266, ESP-01 通電與基本指令測試

(1) 是按下電源模組供應電源切換按鈕通電後,所接收到的開機訊息,最後出現 ready 表示可以開始 AT 指令通訊;(2) 是用來測試 ESP8266, ESP-01 現在是否可以接收 AT 指令;(3) 是取得現在 ESP8266, ESP-01 內部的 AT 指令韌體和SDK 的版本,利用版本號碼得知可以使用的 AT 指令有那些,或是用來查閱原始碼;(4) 是重置 ESP8266, ESP-01 的韌體,一般是用在一些參數設定之後需要重新啟動才會生效的 AT 指令,指令成功下達之後,除了回傳 OK,模組也會重新啟動,輸出與通電時一樣的訊息,不過這些指令不多,有遇到會再特別標示。

*********************************************************************************
下面所談論到的 AT 指令都是經過實際測試,而雲端硬碟或是網路上面所找到的 AT 指令的解釋資料,並不會完全適用到本篇網頁所談論到的 AT 指令,只要韌體版本 ( 0018000902-AI0
3) 是與本篇相同的就以本篇網頁所說的 AT 指令操作為主要依據,其他的資料當作參考就好。
*********************************************************************************


ESP8266 無線模組 AT 指令操作 ( 以 AP+STA 模式說明 AP 和 STA 模式 )

下面先介紹三個  ESP8266, ESP-01 常用到的 AT 基本指令,實際動作請看剛剛上面的操作。

指令:
AT
測試 AT 指令的韌體是否啟動

OK
沒參數


指令:
AT+GMR
查看模組的版本
<版本號碼>(1)

OK
沒參數
 (1) 例如回傳為 0018000902-AI03:若是官方 AT 韌體,只會回傳 0018000902 ( 0018 表示 AT 韌體版本為 V0.18;000902 表示 SDK 版本為 V0.9.2 )。額外加上 -AI03 表示這是第三方廠商自行修改製作的版本,用來作為與官方 SDK 和 AT 韌體的區別,避免客戶回報時無法確認來源。


指令:
AT+RST
重新啟動 ESP8266, ESP-01模組

OK
沒參數






ESP8266 無線模組可以切換三種無線模式,預設的無線模式是 AT+CWMODE 2 ( AP, 無線基地台模式、AT+CWSAP"ESP_9F5A7F","",1,0,指令查詢方式與完整指令解釋如下面所示
ESP8266, ESP-01 預設參數查詢

測試指令
AT+CWMODE=?
返回 <MODE> 可設定的模式的範圍
<MODE>1 ~ 3
1Station 模式
2AP 模式
3STA+AP 模式
+CWMODE:(<MODE> 取值範圍)

OK
查詢指令
AT+CWMODE?
返回現在的無線模式
+CWMODE:<MODE>

OK
設定指令
At+CWMODE=<MODE>

OK












Note:回應的表格中,空一行不是為了好看才加的,是表示回應的時候就是空一行!


查詢指令
AT+CWSAP?
返回現在的 AP 參數
這指令只有在開啟 AP 模式時有效!
用這個指令設置做為無線基地台的名稱<SSID>、密碼<PWD>、通道<CHL>以及加密方式<ECN>,其中

<SSID> <PWD> 是字串,必須使用雙引號框住,<PWD> 密碼最長 64 個字元。
<CHL>1 ~ 12
<ECN>0 ~ 4,如下
0OPEN,不用密碼
1WEP
2WPA_PSK
3WPA2_PSK
4WPA_WPA2_PSK
+CWSAP:<SSID>,<PWD>,
<CHL>,<ECN>

OK
設定指令
At+CWSAP=
“<SSID>”,”<PWD>”,
<CHL>,<ECN>
成功
OK
失敗
ERROR





















ESP8266, ESP-01 AP 資料設定:

如果由官網所釋出的文件,AT+CWMODE 設定好 AP 參數之後必須要下 AT+RST 指令重啟 ESP8266, ESP-01 無線模組,但是經過下面的測試之後發現其實不需要重新啟動也可以繼續設定,只不過為了確認 AP 資料是真的已登錄到模組中,必須要重啟模組再次確認!

為了方便測試,直接設定無線模式為 3 ( AP+STA ),而 AP 設定的資料如下:

  • <SSID>ESP8266-01
  • <PWD>12345
  • <CHL>1
  • <ECN>3 ( WPA2_PSK )
要將 ESP8266 作為無線 AP:關閉麵包板電源再開啟 (1),確認 AT 韌體啟動 (2) 、版本資訊 (3),和現在的無線模式 (3)3。列出現在已存在的 AP 資料 (4),再根據上面的 AP 參數設定 AT+CWSAP 指令的輸出格式 (5),然後下確認指令是否執行成功的測試指令 (6),應該就可以發現這格式並不存在。

查詢一下剛剛設定的 AP 資料是否已登錄成功 (7),結果是 OK 的!但是為了避免斷電之後開啟,剛剛設定的 AP 資料還是存在,必須要重啟模組 (8) 再確認一次 (9),結果令人滿意!

AT+CWSAP 指令測試

ESP8266, ESP-01 STA 資料設定:

將 ESP8266 無線模式設定為 AP+STA 混和模式的一個好處就是不需要切換模式而可以直接使用兩種模式的功能,而這種混和模式的就像是家中的無線路由器一樣,也像是手機作為無線基地台的功能。想想在家中,筆電都連線到同一部路由器 (同一個網路區段),但都可以利用路由器連到外部網路;就如同 ESP8266 的 AP 無線模式,可以讓家中其他無線裝置經由它連線在同一網路區段並互通資料,而 ESP8266 的 STA 無線模式則是可以直接連線到家中路由器 ( AP ),並且連線到外面的網路去,不過怎麼轉發,去看資料吧!

繼續我們的主題:STA 無線模式設定。作為 STA ( 個人工作站 ),若要與同一區段網路 PC 互通資料或是連線到外部網路,可以連線到 AP ( 無線基地台 ) 。假設家中的路由器開放的無線網路名稱與密碼分別是:

  • <SSID>I_AM_ROUTER
  • <PWD>1234567890

那麼 ESP8266 必須先連線到上述的 AP,只要一加入就可以跟同一網路區段的網路裝置溝通,由於 ESP8266 使用混合無線模式,因此就可以同時作為 Server 端也可以作為 Client 端。

要加入到 ESP8266 到現有的無線 AP:首先就必須知道環境中有那些無線網路 (3) 以及要連線的密碼 ( 已提供在上面 ),I_AM_ROUTER 列在第二項 ( 前面三項都是來自於同一台路由器,最後一項是另一台路由器,由訊號強度也可以大概得知 ),使用上面所提供的密碼鍵入 AT 指令連線 (4),最後再使用其查詢樣式指令查詢現在連線的 AP 資料 (6);同樣的,AT+CWJAP 沒有測試格式指令 (5)
AT+CWJAP 指令測試

查詢指令
AT+CWJAP?
返回現在選擇的 AP(無線基地台)
這指令只有在開啟 STA 模式時有效!

<SSID> <PWD> 是字串,必須使用雙引號框住,<PWD> 密碼最長 64 ASCII字元。
成功
+CWJAP:<SSID>

OK
失敗
ERROR
設定指令
At+CWJAP=<SSID>,
<PWD>
成功
OK
失敗
ERROR












設定指令
At+CWLAP
列出搜尋到的 AP(無線基地台)資料
<ECN>0 ~ 4,如下
0OPEN,不用密碼
1WEP
2WPA_PSK
3WPA2_PSK
4WPA_WPA2_PSK
<SSID>AP名稱(字串參數)
<RSSI>:訊號強度
<MAC>MAC位址(字串參數)
<CHL>:通訊頻道
成功
+CWLAP:(<ECN>,<SSID>,
<RSSI>,<MAC>,<CHL>)

OK
失敗
ERROR













完成上面的設定之後,就可以開始做連線測試。PC 端測試的軟體是使用 SocketTest,Android 手機 APP 是 USR-TCP-Test,兩者都可以單獨作為 TCP Server 端與 Client 端,測試上很方便!若是現在 PC 與手機上面沒有這軟體,請先下載並確認可以正常執行之後再繼續下面的測試!

SocketTest 是 Java 程式,要啟動這個軟體,到目錄 { SocketTest } / webstart / 尋找檔案SocketTest.jnlp,滑鼠點兩下就可以打開。


ESP8266, ESP-01 作為 Client 端與 PC 和手機互傳訊息:

要將 PC 作為 Server 端,首先就是要讓作為 Client 端的 ESP8266, ESP-01 知道 Server 端的 IP 位址,假設 PC 的 IP 位址為 192.68.1.104

打開 SocketTest 並切換為 Server 頁面,照著下面畫面做設定 ( IP 位址設定為 PC 的 IP );設定完成之後按下 "Start Listening"
PC:SocketTest as TCP server
( ESP8266, ESP-01 要不要重新關電再開電都可以) 輸入指令 (3) 和 (4),確認無線模式與加入的 AP 無誤;使用多方連線與 Server 端通訊 (5),只要是重開機就必須重新再下一次,因為預設的 CIPMUX 在重開機之後會恢復為 0
ESP8266, Client 端連線到 PC Server 端,01

最後下達連線到 Server 端的指令 (6),如果一切沒問題!以我測試的情況來說:5 秒鐘之後會同時出現回應的字串 ( 不然就傳回錯誤的訊息 ),接著在 5 秒鐘之內就會在 SocketTest 視窗中出現 New Client: 192.168.1.108 的訊息,所以 Server 端與 Client 端是不會同時出現連線的訊息,而是 Client 端出現後再 Server 端。
Socket, Server 端接受 ESP8266, Client 的連線,01
*********************************************************************************
如果所有的操作都正常,但是就是不知道為什麼連不上 USR-TCP-Test ( Server 模式 ),原因可能有二:
  1. 沒有真正連上無線 AP:"I_AM_ROUTER"
  2. JAVA 的安全性沒有開啟
第 1 點要靠自己解決!,有可能是 ( 手機或 ESP8266 ) 與 AP 的距離太遠或是連線品質不好,可能要調一下 ( 手機或 ESP8266 ) 的位置。

第 2 點是最可能發生的原因,Java 被系統防火牆擋住了!以我而言,未更新 Java 之前,所有的動作都正常。Java 更新之後,突然就無法連線了。經過檢查防火牆的設定,發現是新版的 Java 被擋住了無法接收網路連線。解決的方法,只要解開防火牆對於 Java 的限制設定為"允許連線" 就可以了。

完成設定之後的畫面如下
解除防火牆對於 Java 程式的封鎖
*********************************************************************************

接著,從 Client 端傳送一段文字給 Server 端。

要傳送字串,ESP8266 不管是作為 Server 端或是 Client 端是一樣的,程式設計師必須要先告訴 ESP8266 要由那一個連線傳送?且要傳送多少個字元?( 因使用 SendNew 選項,所以要記得多加兩個字元 ) (7),然後在出現 > 提示符號出現時輸入所要傳送的字串 (8);輸入的字串共有 23 個字元,加上 \r\n 就是 25 個字元,而傳送所使用的連線號碼為 4
ESP8266, Client 端連線到 PC Server 端,02

完成指令 (7) 與 (8) 的輸入之後,就會在 SocketTest 畫面中看到新的文字訊息出現 I am SSCOM32E as Client
Socket, Server 端接受 ESP8266, Client 的連線,02

接著在 SocketTest 輸入要傳送到 Client 端的字串再按下 Send 按鈕,就會在 SSCOM32E 視窗中收到 I am SocketTest as Server 的字串,並以形式 +IPD,4,27:I am SocketTest as Server 表示。

同樣的方式,換使用 Android 手機 APP 作為 Server 端。先將手機加入到與 ESP8266, ESP-01 同一個 AP,假設取得的 IP 位址是:192.168.1.111,Port:8888

( ESP8266, ESP-01 要不要重新關電再開電都可以)  輸入指令 (3) 和 (4),確認無線模式與加入的 AP 無誤;使用多方連線與 Server 端通訊 (5)。完成之後先開啟手機 APP:USR-TCP-Test,完成 TCP Server 設定之後再繼續接下去的指令。
ESP8266, Client 端連線到 Android 手機 Server端

USR-TCP-Test 開啟之後,選擇 tcp server 頁面並點下 configure 按鈕,輸入 8888 在出現的視窗欄位中,最後按下 active

USR-TCP-Test as Server - 01
成功建立 Server 端後,視窗下方就會彈出相關的提示訊息,這時切換到 SSCOM32E 的視窗輸入連線到 Server 端的指令 (6)
USR-TCP-Test as Server - 02
( 以我測試的強況而言 ) 雙方建立連線的時間很快,只要雙方建立成功,SSCOM32E 會回應 OK 並且在 USR-TCP-Test configure 圖示下方就會另外出現一個 Client 端連線的 IP 位址與聯接埠的圖示
USR-TCP-Test as Server - 03
接下來測試一下由 Client 端傳送一段文字到 USR-TCP-Test。首先,字串 I am SSCOM32E as Client 共有 23 個字元,加上 \r\n 共有 25 個字元要由 ID 4 傳送,因此在 SSCOM32E 下 AT 指令如 (6)。當出現 > 字元就可以將字串打進去 (7),成功就會回應 SEND OK,而 USR-TCP-Test 在成功收到之後,就換將字串顯示在畫面中,如下所示。
USR-TCP-Test as Server - 04
換過來在手機端輸入下面字串 ( I am xperiaP as server ),再按下 send 按鈕傳送字串
USR-TCP-Test as Server - 05
成功傳送出去,就會在手機畫面下方出現 send successfully ! 的提示訊息,同時於 SSCOM32E 的顯示區就會出現接收的字串長度與訊息 (9)
USR-TCP-Test as Server - 06

*********************************************************************************

查詢指令
AT+CMUX?
返回多連接的狀態是開或關
<MODE>
0 單路連接模式
1 多路連接模式
+CIPMUX:0

OK
設定指令**
At+CIPMUX=<MODE>

OK
如果已經處於連接狀態,回應
Link is builded

**只有當連接都斷開後才能做變更。如果有開啟 Server,就需要重啟模組再做設定。


AT+CIPSTART 建立 TCP 連接或註冊 UDP PORT號碼
測試指令
At+CIPSTART=?
回應各參數設定說明AT+CIPMUX=0
<ID>:連接的 ID 號碼
<TYPE>:字串參數。
“TCP” 表示 tcp 連接
“UDP” 表示 udp 連接
<ADDR>:字串參數。
遠端服務器的 IP 位址
<PORT>:遠端服務器PORT號碼
[<local port>]UDP 川書時,設置本地 PORT 號碼
[<mode>]
0:收到數據後,不修改遠端目標
1:收到數據後,修改一次遠端目標
2:收到數據後,改變遠端目標
此處的 mode 就是設置 UDP 的傳輸對方,建立後能再修改。

(預設值只對 UDP 有效,如果使用預設值,必須填寫 <local port>)
+CIPSTART(<TYPE>),(<ADDR>),<PORT>
[,(<local port>),(<mode>)]
+CIPMUX:(<TYPE>),
(<DOMAIN NAME>),(<PORT>)
[,(<local port>),(<mode>)]

OK
回應各參數設定說明 AT+CIPMUX=1
+CIPSTART:(<ID>),(<TYPE>),
(<ADDR>),<PORT>
[,(<local port>),(<mode>)]
+CIPMUX:(<ID>),(<TYPE>),
(<DOMAIN NAME>),(<PORT>)
[,(<local port>),(<mode>)]

OK
設定指令
(1)單路連接模式
(+CIPMUX=0)
AT+CIPSTART=
<TYPE>,<ADDR>,
<PORT>
[,<local port>,<mode>]

(2)多路連接模式
(+CIPMUX=1)
AT+CIPSTART=
<ID>,<TYPE>,
<ADDR>,<PORT>
[,<local port>,<mode>]
成功
如果格式正確且連接成功

OK
失敗
ERROR
如果連接已經存在
ALREADY CONNECT






































AT+CIPSEND 發送數據
測試指令
AT+CIPSEND=?

OK
<ID>用於傳輸連接的 ID 號碼
<LENGTH>:數字參數,欲發送之數據的長度,最大長度為 2048 Bytes
設定指令
(1)單路連接模式
(+CIPMUX=0)
AT+CIPSTART=
<LENGTH>

(2)多路連接模式
(+CIPMUX=1)
AT+CIPSTART=
<ID>,<LENGTH>
發送指定長度的數據。收到此命令後,先換行返回 >,然後開始接收通訊埠數據,當數據長度到達 <LENGTH> 時發送數據。
如果未建立連接或是連接被斷開,返回
ERROR
如果數據發送成功,返回
SEND OK
執行指令
AT+CIPSEND
即時發送數據。收到此命令後,先換行再回覆 >,然後進入到透傳(pass-through)模式,每個封包(packet)數據以 20ms 間隔區分,每個封包最大 2048 Bytes
當單獨輸入一個封包”+++”,返回指令模式。
該指令必須在開啟透傳模式以及單連接模式下使用。

























+IPD 接收到網路數據
(1)單路連接模式
(+CIPMUX=0)
+IPD,<LEN>:<DATA>

(2)多路連接模式
(+CIPMUX=1)
+IPD,<ID>,<LEN>:<DATA>
此指令是模組發出的指令。當模組接收到網路數據時,會向通訊埠發送 +IPD 和數據。
<ID>:收到連接的 ID 號碼
<LEN>:收到的數據長度
<DATA>:收到的數據
此提示在指令狀態下有效










*********************************************************************************


ESP8266, ESP-01 作為 Server 端與 PC 和手機互傳訊息:

ESP8266, ESP-01 作為 Server 端讓 Client 端的軟體可以連線,指令非常簡單!只要開啟 SERVER 並選擇 PORT 號碼即可。要開啟 Server 就是將 AT+CIPSERVER 第一個參數設定為 1,第二個參數設定為 8888 號碼 (6),而且一定要先開啟多方連線 (5);為了要知道 SocketTest ( as Client ) 要連線到的 Server 端 IP 位址,可以下 AT 指令詢問 ESP8266, ESP-01 (7),第一個是 ESP8266 作為 AP 的 IP 位址,第二個是作為 STA 的 IP 位址 ,這兩個位址都可以使用,但網頁範例使用第二個 IP 位址。
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-01

輸入 ESP8266, ESP-01 做為 STA 所取得的 IP 位址 ( 192.168.1.108 ) 與 Port 號碼 ( 8888 )
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-02

確認在 SSCOM32E 的 AT 指令都已下達完畢,這時就可以按下 Connect 連線到 ESP8266, ESP-01 ( as Server )。連線的時間取決於系統與環境,像我第一次連接就花了好幾分鐘,所以如果 SSCOM32E 出現 Link 但是 SocketTest 反應,就放在那耐心等一下,第二次連線時就會在幾秒鐘完成!

只要 SocketTest 連線上 ESP8266, ESP-01,畫面下方的 Message 輸入欄就會變成可以輸入的狀態 ( 如下所示 )
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-03
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-04

完成 Server 與 Client 的兩方的連線之後就能開始互傳訊息,請先由 ESP8266, ESP-01 這一方傳送訊息。假設要輸入的訊息是:I am SSCOM32E as Server,共是 23 個字元,加上 \r\n 共是 25 個字元,以這資料輸入 AT 指令 (7),等待出現 > 符號後,輸入剛剛的那段字串,就會在 SocketTest 的顯示區出現同樣的字串。
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-05
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-06

反過來,在 SocketTest ( as Client ) 的 Message 文字輸入區輸入字串:I am SocketTest as Client 到 ESP8266, ESP-01。按下 Send 送出,SocketTest 會將送出的字串前方加上 S: 先顯示在上方的文字區塊中,ESP8266, ESP-01 收到字串後,會將接收到的字元束腹與整段文字以 +IPD, ID,字串長度:I am SocketTest as Client 顯示在 SSCOM32E 的文字區塊中
ESP8266, ESP-01 作為 Server 端與手機互傳訊息-07

*********************************************************************************
AT+CIPSERVER 配置為 TCP UDP 服務器
設定指令**
At+CIPSERVER=
<MODE>,[<PORT>]
成功

OK
<MODE>
0:關閉 server 模式
1:開啟 server 模式
<PORT>PORT 號碼,預設值為 333

**開啟 server 後會自動建立 server 監聽,當有 client 端連接時會自動按順序占用一個連接。AT+CIPMUX=1 時才能開啟服務器。


AT+CIFSR 取得本地 IP 位址
測試指令
AT+CIFSR=?

OK
<IP ADDR>:本機目前的IP 位址。第一行為 AP 模式下的 IP,第二行為 STA 下的 IP

執行指令
AT+CIFSR
成功
+CIFSR:<IP ADDR>
+CIFSR:<IP ADDR>

OK
失敗

ERROR



*********************************************************************************


結論:

由上面的介紹可以知道,使用 ESP8266, ESP-01 實現無線網路之間的通訊非常簡單,不但可以做為個人工作站 (STA) 節點,也可以做為無線網路基地台 ( AP ),或是混和兩種的模式。更由於開放 SDK,因此使用者可以直接開發屬於自己的無線網路功能的項目,就如同在上面介紹的 AT 指令應用就是其中的一種。



<< 部落格相關文章 >>

23 則留言:

  1. 您好:
    先前有再貴賣場購買ESP8266 IOT 模組,在使用AT+CWMODE 與AT+CWSAP 來設定後,使用AT+CWMODE?與AT+CWSAP? 來查詢所設定之模式與名稱,其回應內容如我先前所設定之模式與名稱,但在斷電後或是使用AT+RST後,其模式與名稱又恢復到預設設定,請問這是什麼緣故呢? (我的韌體版本與您的版本相同)

    回覆刪除
    回覆
    1. 您好:
      您的問題在我寫這網頁做測試的時候並沒有遇到過!若您使用外部電源接法並依照網頁中的步驟,無法完成與網頁相同的動作,可以到賣場悄悄話告知一下,並寄回來給我做測試,有問題我會寄顆新的給您,但不要在這地方留下任何聯絡資料,謝謝!

      若有其他使用上的問題,歡迎討論!

      刪除
    2. 請參考部落格網頁 http://ruten-proteus.blogspot.tw/2015/05/esp8266-esp-01-at023-sdk101.html 就可以解決這問題。

      刪除
  2. 你好,我大致上設定都OK,可是我想要設定好後再Arduino上使用,但是有一個問題...就是斷電後設定好的CIPSERVER跟CIPMUX會重置...請問有什麼辦法可以讓他固定住嗎?

    回覆刪除
    回覆
    1. 這版本無法將設定值儲存,關掉電源幾秒鐘(線拔掉與電源模組關掉)再開資料就會不見,所以建議您將這些設定寫進去您的 Arduino setup() 函式中作為初始化的設定。

      刪除
    2. 這網站寫的真詳細,感謝版主的分享!!

      刪除
    3. 請參考部落格網頁 http://ruten-proteus.blogspot.tw/2015/05/esp8266-esp-01-at023-sdk101.html 就可以解決這問題。

      刪除
  3. 您好 我依照上面的方法在測試ESP8266時 回傳的內容都是亂碼是什麼狀況呢~

    回覆刪除
    回覆
    1. 您好:
      亂碼!就是 BaudRate 設定錯誤。
      這網頁是針對 0018000902 寫的 ( 也就是賣場之前藍色板子的通訊速率 );現在是黑板,在賣場網頁中有特別標柱為紅色字,使用的速率是 115200 bps。

      刪除
  4. 版主 你好 想跟您請教一下 :

    我有收到ESP8266 Ready 訊息, 但一直無法輸入資料

    http://imgur.com/oaNx6No (這是我在putty下看到的畫面)

    後來我用其他RS232工具 觀察 發現 USB to TTL一直收到資料 (不能打字應該是這個原因 @@"?)

    用16進制去看收到的資料 全是 00 00 00 00 .....

    一直收到無止盡的 00

    非常需要 除錯的建議 :) 感恩

    回覆刪除
    回覆
    1. 您好:
      如果您的硬體都是跟網頁中的一樣,出現 ready 表示韌體已經啟動OK,可以進行 AT 指令的輸入!不能輸入指令,有可能是您的電源供應方式與網頁中的不一樣,解決電源的問題大部分就可以解決!

      另一個就是換一個 USB 轉 TTL 試試!

      刪除
  5. 版主你好:
    我和您買了"ESP8266, ESP-01 入門學習的套件"來練習架設SERVER,版主寫得非常詳細,大部分都沒問題,有問題的是在最後用ESP8266架設SERVER後,只能用連和ESP8266相同WIFI的裝置才能連得上ESP8266架設的SERVER,其他地方的裝置都無法連的到(Port都一樣),請問這個問題是正常的嗎?如果能夠解決,請版主您為我解惑!
    非常感謝!

    回覆刪除
    回覆
    1. 您好:
      ESP8266 作為 AP 時,只有連線到 ESP8266 無線網路裝置可以連線到您設定的 SERVER;若是作為 STA,則只有連線到同一個路由器的網路裝置可以連線到您的 SERVER,除非您的路由器有設定好 Port-Forwarding,這樣才有可能讓外部網路連線到您的 SERVER。

      假設您要在外面使用手機連線到 ESP8266 設定的 SERVER,那您必須要有固定 IP 或是設定好 Dynamic DNS,這樣手機才有 IP 位址可以輸入。然後設定好 ESP8266 連線到的路由器轉址 ( Port-Forward ) 的功能,如此當手機輸入網址(或是IP),路由器才會將此需求轉址到 ESP8266 SERVER。相關設定的方法,可以上 Google 找資料看!



      刪除
  6. 大大你好 請問一下 這晶片會不會有熱當的情形?
    這一兩個星期試著上傳溫溼度至thingspeak,時常傳到一半就沒有反應去摸一下晶片發現很燙
    讓晶片冷卻後又可以正常上傳,就這樣斷斷續續 到了今天晶片電源燈有亮 藍色燈整個沒有回應。
    是因為晶片燒掉了嗎?

    回覆刪除
    回覆
    1. 現在我用的黑色板子做測試或是部落格實驗時,沒有出現熱當的問題過!
      當然,若是處理量多或是頻繁,都容易造成晶片溫度上升,此時就須要考慮加裝散熱電或是散熱;所以熱當不是不會,要看使用的情況而定。
      藍色 LED正常情況,就是在通電的時候會亮一下,然後熄滅!只有在上船韌體的時候會亮,因為它是接到 SCK 接腳,平常時候不會亮!但是若連通電的時候都不會亮或是一直亮,就是有問題,只能重新燒韌體試試是否能起死回生!

      刪除
  7. AT+CIPSTART 建立 TCP 連接或註冊 UDP PORT號碼這個小標題,請問依定要設定嗎??
    目前想完成物聯網的連接,但是目前設定完成相關的東西,用手機連接8266,開啟其他app卻無法使用!!!

    回覆刪除
    回覆
    1. 不設定兩方怎麼連線!
      適用網域推薦的APP嗎 ? 可換支手機試試!

      刪除
  8. 請問一下 手機傳值 給 esp8266 arduino端程式碼 需要寫什麼指令 才能接收呢

    目前 arduino 透過 esp8266 傳值給手機可以 但是 手機傳值 卻無法收到

    回覆刪除
    回覆
    1. 若是已形成透傳模式,檢查一下 Arduino 端接收的函式裡面,字串結尾事不是沒有處理好,也就是沒有斷句!Arduino 不知道手機傳過來的字串到哪裡結束。

      刪除
  9. 板大您好~
    我剛學習Arduino 想用WIFI 控制東西,在您的露天 " 智能硬體DIY開發和雲端服務平台 (SDK,手機APP) 入門學習開發模組板(A)-板載 ESP8266,ESP-12F "

    是否適合新手學者呢?

    回覆刪除
    回覆
    1. 另一組會比較適合!
      這一組在熟悉esp8266後,可用來學習更深入的部分,例如:雲端app開發、sdk 開發;當然現有的esp8266在網站上的例子也可以用,只不過需要懂esp8266後才會好用,不然遇到問題時挫折感會比較大。
      以上提供你做個參考!

      刪除
  10. 您好 輸入AT+RST後沒有ready 而是出現invalid請問是哪裡出問題呢?

    回覆刪除
    回覆
    1. 這個問題很間單 !
      第一種情況:跟賣場買的 ESP8266 不會有這種情況出現 ! 會出現這種情況表示您的 ESP8266 是跟其他人買的,裡面的韌體不支援原廠的雲端功能;不過還是可以正常使用 AT 指令 !
      第二種情況:有自己改過韌體,再重新燒錄 AT 韌體,但這韌體不是官方版的,或是沒有啟動,所以出現 invalid !
      如果您是跟賣場買的,賣場可以提供啟動的協助;如果不是,請詢問您的賣家吧!

      刪除