[Node-RED] Giao tiếp Server Node-RED với ESP8266 qua giao thức HTTP (GET/POST)

 

[Node-RED] Giao tiếp Server Node-RED với ESP8266 qua giao thức HTTP (GET/POST)


Khái niệm của HTTP

HTTP là tên viết tắt của cụm từ HyperText Transfer Protocol, dịch theo tiếng Việt là giao thức truyền tải siêu văn bản. HTTP được dùng trong www (world wide web) với mục đích tạo nên nền tảng kết nối giữa client và server. Client ở đây đại diện cho bất kỳ loại thiết bị hoặc chương trình nào, có thể là PC, smartphone… Còn Server được dùng để chỉ những máy tính trên đám mây. HTTP là một giao thức cho phép trao đổi và sử dụng các nguồn tài nguyên khác nhau, chẳng hạn như HTML doc. Một doc hoàn chỉnh sẽ được tạo nên từ nhiều doc con bao gồm văn bản, layout, media, video, script…

HTTP lần đầu được giới thiệu vào những năm 90. Cho đến ngày nay, nó không ngừng được mở rộng và chiếm một vị trí rất quan trọng trong thế giới Internet. HTTP được coi như là một giao thức ứng dụng của bộ các giao thức nền tảng cho Internet TCP/IP. Nó cũng có thể được gửi thông qua kết nối TCP được mã hóa TLS.

Nhờ vào đặc tính mở rộng không giới hạn của nó, ngoài các tài liệu siêu văn bản, HTTP còn được dùng để tìm nạp hình ảnh và video. Thậm chí là đăng tải cả nội dung lên server. Chính vì thế, HTTP đóng vai trò quan trọng trong quy trình cập nhật website thông qua khả năng nạp dữ liệu cho các doc theo yêu cầu.

Cấu trúc cơ bản của HTTP

Cấu trúc hoạt động của HTTP rất đơn giản và dễ hiểu. HTTP là một nền tảng cho phép sự giao tiếp giữa 2 phía là Client và Server. Client ở đây là người dùng, thường truy cập vào HTTP thông qua một công cụ bất kỳ như trình duyệt web. Còn Server sẽ đại diện cho phía website, đằng sau giao diện web gồm có kịch bản phản ứng từ máy chủ và cơ sở dữ liệu.

Vậy hoạt động của giao thức HTTP là gì? Quá trình giao tiếp của Client và Server sẽ dựa trên các message độc lập. Đầu tiên, phía khách hàng sẽ gửi một message đến cho máy chủ, thường là các yêu cầu lợi ích khiến khách hàng truy cập website này. Sau khi tiếp nhận yêu cầu và xử lý, máy chủ sẽ trả lại một message được gọi là phản hồi.

Mỗi một phản hồi đều là độc lập. Phản hồi sau sẽ không biết và cũng không chịu bất kỳ tác động nào từ phản hồi trước.

Ví dụ về HTTP trên Node-RED và ESP8266

Code Node-RED

///////////////////////////////////////////////////////////////////////////////////////
[
    {
        "id": "b8c2b7f74b8d9cc0",
        "type": "http in",
        "z": "aa65b8457413190c",
        "name": "",
        "url": "/esp8266",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 170,
        "y": 80,
        "wires": [
            [
                "ea36c8209f1d550d",
                "4889e6488580d8eb"
            ]
        ]
    },
    {
        "id": "4358c1457acd0654",
        "type": "debug",
        "z": "aa65b8457413190c",
        "name": "HTTP GET",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 80,
        "wires": []
    },
    {
        "id": "9625724b1d6dfb50",
        "type": "http response",
        "z": "aa65b8457413190c",
        "name": "",
        "statusCode": "200",
        "headers": {},
        "x": 500,
        "y": 140,
        "wires": []
    },
    {
        "id": "ea36c8209f1d550d",
        "type": "function",
        "z": "aa65b8457413190c",
        "name": "",
        "func": "msg.payload = \"OK\"\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 340,
        "y": 140,
        "wires": [
            [
                "9625724b1d6dfb50"
            ]
        ]
    },
    {
        "id": "ecb80872cd050cca",
        "type": "http in",
        "z": "aa65b8457413190c",
        "name": "",
        "url": "/esp8266",
        "method": "post",
        "upload": false,
        "swaggerDoc": "",
        "x": 180,
        "y": 220,
        "wires": [
            [
                "7ded787d72b4402a",
                "b605047b37bf929f"
            ]
        ]
    },
    {
        "id": "67c34583f8d74e16",
        "type": "debug",
        "z": "aa65b8457413190c",
        "name": "HTTP POST",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 490,
        "y": 220,
        "wires": []
    },
    {
        "id": "7ded787d72b4402a",
        "type": "function",
        "z": "aa65b8457413190c",
        "name": "",
        "func": "msg.payload = \"OK\"\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 340,
        "y": 280,
        "wires": [
            [
                "f7cf2f5e363f3765"
            ]
        ]
    },
    {
        "id": "f7cf2f5e363f3765",
        "type": "http response",
        "z": "aa65b8457413190c",
        "name": "",
        "statusCode": "200",
        "headers": {},
        "x": 500,
        "y": 280,
        "wires": []
    },
    {
        "id": "b605047b37bf929f",
        "type": "json",
        "z": "aa65b8457413190c",
        "name": "",
        "property": "payload",
        "action": "obj",
        "pretty": false,
        "x": 350,
        "y": 220,
        "wires": [
            [
                "67c34583f8d74e16"
            ]
        ]
    },
    {
        "id": "4889e6488580d8eb",
        "type": "json",
        "z": "aa65b8457413190c",
        "name": "",
        "property": "payload",
        "action": "obj",
        "pretty": false,
        "x": 330,
        "y": 80,
        "wires": [
            [
                "4358c1457acd0654"
            ]
        ]
    }
]
///////////////////////////////////////////////////////////////////////////////////////

Code ESP8266

///////////////////////////////////////////////////////////////////////////////////////
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>

const char *ssid = "Phong 3";
const char *password = "0392071213";

String serverName = "http://192.168.1.20:1880/esp8266";
unsigned long lastTime = 0;
unsigned long timerDelay = 2000;

void httpGET()
{
WiFiClient client;
HTTPClient http;

int temp = random(50, 100);
String serverPath = serverName + "?temp=" + String(temp);
http.begin(client, serverPath.c_str());

int httpResponseCode = http.GET();

if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
}

void httpPOST()
{
WiFiClient client;
HTTPClient http;

http.begin(client, serverName.c_str());

int humi = random(50, 100);
String data = "{\"humi\":" + String(humi) + "}";

int httpResponseCode = http.POST(data);

if (httpResponseCode > 0)
{
Serial.print("HTTP Response code: ");
Serial.println(httpResponseCode);
String payload = http.getString();
Serial.println(payload);
}
else
{
Serial.print("Error code: ");
Serial.println(httpResponseCode);
}
http.end();
}

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

WiFi.begin(ssid, password);
Serial.println("Connecting");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());
}

void loop()
{
if ((millis() - lastTime) > timerDelay)
{
if (WiFi.status() == WL_CONNECTED)
{
httpGET();
httpPOST();
}
else
{
Serial.println("WiFi Disconnected");
}
lastTime = millis();
}
}
///////////////////////////////////////////////////////////////////////////////////////

Video hướng dẫn




Chúc các bạn thành công!

No comments:

Post a Comment