2022年8月23日 星期二

NodeMCU 上的 HTTP 客戶端 Arduino IDE

 

介紹

HTTP(超文本傳輸協議)是一種標準的應用程序協議,用作客戶端和服務器之間的請求-響應協議。

HTTP 客戶端幫助發送 HTTP 請求和接收來自 HTTP 服務器的 HTTP 響應。

它廣泛用於基於物聯網的嵌入式應用,如家庭自動化、車輛發動機參數遠程監控以進行分析等。

NodeMCU 是一個開源的物聯網平台。它是在 Espressif Systems 的 ESP8266 Wi-Fi SoC 上運行的固件。它具有板載 wi-fi,通過它可以輕鬆構建 IoT 應用程序。

NodeMCU HTTP 客戶端

例子

讓我們為 NodeMCU 編寫一個基於 C/C++ 的 Arduino 草圖作為 HTTP 客戶端,並將數據從 Thingspeak 服務器獲取/發布。

在這裡,我們將 Thingspeak 服務器用於 HTTP 客戶端演示目的。

Thingspeak是一個開放的物聯網平台,任何人都可以在其中可視化和分析來自其傳感器設備的實時數據。此外,我們可以使用 Thingspeak 中的 Matlab 代碼對遠程設備發布的數據進行數據分析。要了解有關 Thingspeak 的更多信息,請參閱鏈接 

https://thingspeak.com/pages/learn_more

只需註冊並創建一個頻道。我們在 Thingspeak 上有通道和寫入鍵,用於數據發送和接收。

  • 頻道 ID = 309236
  • 寫入密鑰 = 1EYZIS5OCRJSKZHG

注意:  不要忘記在 Thingspeak 頻道的頻道設置選項中勾選 Make Public 字段。

用於 HTTP 客戶端獲取的 Arduino 草圖

#include <ESP8266WiFi.h>

/*Put your SSID & Password*/
const char* ssid = "ssid";		// Enter SSID here
const char* password = "password";	//Enter Password here

const char* server = "api.thingspeak.com";

/* Set GET link with channel ID */
const char* _getLink = "http://api.thingspeak.com/channels/309236/feeds/last.txt";

WiFiClient client;

void setup() {
  Serial.begin(9600);
  delay(1000);

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
	delay(500);
	Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

void loop() 
{
  if (client.connect(server,80))     // "184.106.153.149" or api.thingspeak.com
  { 
    String getStr = _getLink;

    client.print("GET "+getStr+"\n");
    client.print("HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n\n\n");

    while(client.available()){
	char c = client.read();
	Serial.print(c);
    }
    Serial.println("");
  }
  client.stop();
  Serial.println("Waiting…");
  delay(10000);
}

HTTP Get 的輸出窗口

下面是 Arduino 串行監視器窗口,它顯示了從 Thingspeak 服務器接收到的最後更新數據。

thingspeak http 獲取

 

用於 HTTP 客戶端帖子的 Arduino 草圖

#include <ESP8266WiFi.h>

String apiKey = "1EYZIS5OCRJSKZHG";	// replace with your channel’s thingspeak API key,

/*Put your SSID & Password*/
const char* ssid = "ssid";		// Enter SSID here
const char* password = "password";	// Enter Password here

const char* server = "api.thingspeak.com";
int Sample;

WiFiClient client;

void setup() {
  Serial.begin(9600);
  delay(1000);

  Serial.println("Connecting to ");
  Serial.println(ssid);

  //connect to your local wi-fi network
  WiFi.begin(ssid, password);

  //check wi-fi is connected to wi-fi network
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
}

void loop() 
{
  if (client.connect(server,80))     // "184.106.153.149" or api.thingspeak.com
  { 
    String postStr = apiKey;
    postStr +="&field1=";
    postStr += String(Sample++);
    postStr += "\r\n\r\n";

    client.print("POST /update HTTP/1.1\n");
    client.print("Host: api.thingspeak.com\n");
    client.print("Connection: close\n");
    client.print("X-THINGSPEAKAPIKEY: "+apiKey+"\n");
    client.print("Content-Type: application/x-www-form-urlencoded\n");
    client.print("Content-Length: ");
    client.print(postStr.length());
    client.print("\n\n");
    client.print(postStr);
  }
  client.stop();

  Serial.println("Waiting…");       // thingspeak needs minimum 15 sec delay between updates

  delay(20000);
}

HTTP Post 的輸出窗口

下面是 Thingspeak 服務器的計數輸出窗口。

thingspeak http 帖子

 


資料來源:https://www.electronicwings.com/nodemcu/http-client-on-nodemcu-with-arduino-ide

沒有留言: