1. 程式人生 > >ESP8266與NodeMCU開發(三)客戶端

ESP8266與NodeMCU開發(三)客戶端

這一節將講解如何將ESP8266程式設計設定為一個網頁客戶端,訪問www.example.com,傳送請求並獲取返回資料,通過串列埠打印出來

流程如下:

1.首先需要連線上路由器或者任意AP,從而獲得能訪問外網的途徑,這一點在上一章節中已經說明。

相關程式碼:

#define WIFINAME "wifi名稱"
#define WIFIPW   "wifi密碼"

WiFi.begin(WIFINAME, WIFIPW);

等待ESP8266連線上AP
while (WiFi.status() != WL_CONNECTED)//try link to router
  {
    delay(500);
    Serial.print(".");
  }


2.例項化一個客戶端,用以建立http連線,併發送請求

設定請求網址

const char* host = "www.example.com";


例項化

WiFiClient client;

與服務端建立連線
client.connect(host, 80)

向服務端傳送請求

client.print(String("GET /") + "HTTP/1.1\r\n" + "Host:" + host + "\r\n" +
                 "Connection: close\r\n" + "\r\n"
                );

3.如果連線建立並且請求傳送成功,然後就可以收到由服務端傳送的回覆,使用一個字串來儲存

String line = client.readStringUntil('\n');

4.列印獲取的回覆訊息

Serial.println(line);



從列印結果可以看到,網頁頭部和主體都提示“HTTP Version Not Supported”,因為HTTP版本較低因此服務端未傳送網頁佈局檔案到ESP8266上,但整個通訊過程是成功的。

在實際的程式設計中需要追加連線成功才傳送請求的判斷,以防止ESP8266因錯誤的指令而重啟。

程式整體原始碼:

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>

#define WIFINAME "ChinaMobile-45012"
#define WIFIPW   "wangjinxuan"
const char* host = "www.example.com";

void setup() {

  pinMode(BUILTIN_LED, OUTPUT);
  Serial.begin(115200);
  Serial.println("");
  WiFi.begin(WIFINAME, WIFIPW);//link to router
  Serial.print("Connecting..");
  while (WiFi.status() != WL_CONNECTED)//try link to router
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Connected,IP Address:");//connecting succeed
  Serial.println(WiFi.localIP());

}

void loop() {
  // put your main code here, to run repeatedly:
  WiFiClient client;
  Serial.printf("\r\nConnectint to %s ..", host);
  Serial.println("");
  if (client.connect(host, 80))
  {
    Serial.println("Connected!");
    Serial.println("Send a request");
    client.print(String("GET /") + "HTTP/1.1\r\n" + "Host:" + host + "\r\n" +
                 "Connection: close\r\n" + "\r\n"
                );

    Serial.println("\r\n[Response:]");
    while (client.connected())
    {
      while (client.connected())
      {
        if (client.available())
        {
          String line = client.readStringUntil('\n');
          Serial.println(line);
        }
      }
      client.stop();
      Serial.println("\nClient stop, disconnected");
    }
  }
  else
  {
    Serial.println("connecting failed!");
    client.stop();
  }
  delay(8000);
}


參考:https://github.com/esp8266/Arduino/blob/master/doc/esp8266wifi/client-examples.md#select-a-server