2015年10月14日 星期三

用 ESP8266 的 TCP/IP 連線抓取網頁

完成 ESP8266 轉接板製作後, 我在想, 既然可以用 GET 方法傳送資料給 Thingspeak 伺服器, 那應該可以擷取遠端網頁的內容吧! 沒錯, 我搜尋 Google 發現這篇 :

# ESP8266 connecting to internet

作者是利用 USB-TTL 轉換線直接與 PC 的 USB 相連, 以 Realterm 下達 AT 指令來讀取 Google 首頁資料. 我則是利用 Nano 的軟體串列埠, 使用 Arduino IDE 下 AT 指令. 參考 :

# 製作 ESP8266 轉接板

#include <SoftwareSerial.h>
SoftwareSerial sSerial(10,11); //(RX,TX) 與 ESP8266 介接的軟體串列埠

void setup() {
  sSerial.begin(9600);
  Serial.begin(9600);
  Serial.println("SoftSerial to ESP8266 AT commands test ...");
  }

void loop() {
  if (sSerial.available()) {  //若軟體串列埠 RX 有收到來自 ESP8266 的回應字元
    Serial.write(sSerial.read());  //在串列埠監控視窗顯示 ESP8266 的回應字元
    }
  if (Serial.available()) {  //若串列埠 RX 有收到來自 PC 的 AT 指令字元 (USB TX)
    sSerial.write(Serial.read());  //將 PC 的傳來的字元傳給 ESP8266
    }
  }


此作者也有關於 ESP8266 的介紹 :

# ESP8266 WIFI module
https://nurdspace.nl/ESP8266


首先是與 Google 網頁伺服器建立 TCP 連線 :

AT+CIPSTART="TCP","www.google.com",80

然後告訴 ESP8266 要傳送 7 個 BYTE 資料 :

AT+CIPSEND=7

出現 > 符號後, 傳送 "GET /" 給 ESP8266 :

GET /

傳送的資料有 5 個 BYTE, 加上跳行 \r\n 共 7 個字元. 完整的回應如下 :


AT+CIPSTART="TCP","www.google.com",80


OK
Linked
AT+CIPSEND=7

> GET /

SEND OK

+IPD,496:HTTP/1.0 302 Found
Cache-Control: private
Content-Type: text/html; charset=UTF-8
Location: http://www.google.com.tw/?gfe_rd=cr&ei=dxEeVo_jAYyA0ATLoqSgDQ
Content-Length: 262
Date: Wed, 14 Oct 2015 08:25:27 GMT
Server: GFE/2.0

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>302 Moved</TITLE></HEAD><BODY>
<H1>302 Moved</H1>
The document has moved
<A HREF="http://www.google.com.tw/?gfe_rd=cr&ei=dxEeVo_jAYyA0ATLoqSgDQ">here</A>.
</BODY></HTML>

OK

OK
Unlink

很奇怪, 得到 302 回應 !


6 則留言 :

Unknown 提到...

hey 老師你好,最近在試ESP-01,請問你有試過連手機路由器嗎?

最近我在嘗試用WIFI模組連網路路由器,用get的方式,就像這篇文章所講,把資訊上傳到SERVER,是非常成功的。

但是如果我用手機的無線路由器,會發生400 bad request 請問我是哪一個環節弄錯了?

訊息如下


+IPD,289:

400 Bad Request

Bad Request
Your browser sent a request that this server could not understand.


address Apache Server at 192.168.1.102 Port 80 address


OK

小狐狸事務所 提到...

用手機的無線網路上網沒問題喔! 我打開手機行動網路與 wifi, 讓 ESP8266 連上手機 WIFI 就可以囉.

Unknown 提到...

感謝老師的回覆

我知道老師的意思,我也是可以連得上這個IP

不過就是不正常的發送,但是我連一般的路由器就很正常

然後我的寫法是這樣

AT+CIPSTART="TCP","114.33.148.1",80
AT+CIPSEND=64
GET /ketech/UD.php?id=123&c1=10.00&c2=34.3&c3=4124&c4=58&c5=15

上面兩個指令都是正常
直到最後一個指令他會告訴你bad request
但是我連一般路由器,都不會有這個問題產生

Unknown 提到...

HEY 老師你好

我發現問題了,這個網頁是架在QNAP上

如果我的手機是用中華電信的熱點,我的wifi mode就可以成功上傳

如果用台哥大,就上傳失敗

不過我可以確定的是,兩個電信的熱點,都可以上傳到Thingspeak的網頁上

那我要的解決方式,是要往NAS上解決,還是要買新的WIFI模組,來解決這個問題?

小狐狸事務所 提到...

新的 WIFI 模組是指買新的 ESP 模組嗎? 如果問題出在 QNAP NAS 網頁, 應該往 NAS 尋求解決辦法吧! 我想不通的是, 網頁是 HTTP 應用層的東東, 為何透過不同電信公司會有不同結果? 台哥大會攔截甚麼嗎? 奇怪.

Unknown 提到...

Hi 老師

買新的意思是買新的ESP模組

目前我的解決方式是聯絡QNAP NAS的人員,詢問這個問題

對方是說有可能是網路的設定問題,目前還在嘗試解決

QNAP的人員說這個問題不太好解,要一段時間了解

對,我一開始也是有同樣的疑問,同樣都是網路為什麼會有不同的結果