明珠的个人博客

是谁告诉你,你是赤裸的?

0%

物联网之向服务器发送信息

简介

ESP8266开发板以网络客户端的角色向服务器发送HTTP请求,并且获取何处理服务器响应信息。通过这一操作,我们可以实现ESP8266开发板间的物联网数据通信。

如上图所示,接下来我们将需要两块ESP8266-NodeMCU开发板。其中一块作为服务器,另一块作为客户端。

使用ESP8266客户端向ESP8266服务器发送数据

先上栗子。在这个示例中,ESP8266客户端将会通过HTTP协议向ESP8266服务器发送信息。在运行过程中,客户端ESP8266将会实时检测板上的按键状态,并且把按键状态发送给服务器。服务器在接收到客户端按键状态后,可以根据客户端按键状态来控制服务器端板上的LED点亮和熄灭。最终实现的效果是,我们可以通过客户端ESP8266开发板上的按键来“遥控”服务器上的LED点亮和熄灭。

注意,服务器端和客户端ESP8266必须连接同一WiFi网络,方可实现数据通讯。

服务器端程序:

  • 接收客户端发来的http请求并且解析信息中的数据信息
  • 将解析的数据信息通过串口监视器显示供用户查看
  • 将解析的客户端按键状态信息用于控制服务器端板上LED的点亮和熄灭
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    /**********************************************************************
    项目名称/Project : 零基础入门学用物联网
    程序名称/Program name : csd_server
    团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
    作者/Author : CYNO朔
    日期/Date(YYYYMMDD) : 20200228
    程序目的/Purpose :
    演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
    一个以客户端模式运行。

    此代码为服务器端代码。此代码主要功能:
    - 接收客户端发来的http请求
    - 解析客户端请求中的数据信息
    - 将解析的数据信息通过串口监视器显示供用户查看
    - 将解析的客户端按键状态信息用于控制板上LED的点亮和熄灭

    -----------------------------------------------------------------------
    修订历史/Revision History
    日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
    20200229 CYNO朔 0.01 加入IP设置

    ***********************************************************************/

    #include <ESP8266WiFi.h>
    #include <ESP8266WiFiMulti.h> // 使用WiFiMulti库
    #include <ESP8266WebServer.h> // 使用WebServer库

    ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'

    ESP8266WebServer server(80); // 建立网络服务器对象,该对象用于响应HTTP请求。监听端口(80)

    IPAddress local_IP(192, 168, 0, 123); // 设置ESP8266-NodeMCU联网后的IP
    IPAddress gateway(192, 168, 0, 1); // 设置网关IP(通常网关IP是WiFI路由IP)
    IPAddress subnet(255, 255, 255, 0); // 设置子网掩码
    IPAddress dns(192,168,0,1); // 设置局域网DNS的IP(通常局域网DNS的IP是WiFI路由IP,点击自己的无线网信息查看)

    void setup(void){
    Serial.begin(9600); // 启动串口通讯
    Serial.println("");

    pinMode(LED_BUILTIN, OUTPUT);
    digitalWrite(LED_BUILTIN, HIGH);

    // 设置开发板网络环境
    if (!WiFi.config(local_IP, gateway, subnet)) {
    Serial.println("Failed to Config ESP8266 IP");
    }

    wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里
    wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
    wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
    Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。

    // 尝试进行wifi连接。
    while (wifiMulti.run() != WL_CONNECTED) {
    delay(250);
    Serial.print('.');
    }

    // WiFi连接成功后将通过串口监视器输出连接成功信息
    Serial.println('\n');
    Serial.print("Connected to ");
    Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
    Serial.print("IP address:\t");
    Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP

    server.on("/update", handleUpdate); // 处理服务器更新函数

    server.begin(); // 启动网站服务
    Serial.println("HTTP server started");
    }

    void loop(void){
    server.handleClient(); // 检查http服务器访问
    }

    void handleUpdate(){
    float floatValue = server.arg("float").toFloat(); // 获取客户端发送HTTP信息中的浮点数值
    int intValue = server.arg("int").toInt(); // 获取客户端发送HTTP信息中的整数数值
    int buttonValue = server.arg("button").toInt(); // 获取客户端发送HTTP信息中的按键控制量

    server.send(200, "text/plain", "Received"); // 发送http响应

    buttonValue == 0 ? digitalWrite(LED_BUILTIN, LOW) : digitalWrite(LED_BUILTIN, HIGH);

    // 通过串口监视器输出获取到的变量数值
    Serial.print("floatValue = "); Serial.println(floatValue);
    Serial.print("intValue = "); Serial.println(intValue);
    Serial.print("buttonValue = "); Serial.println(buttonValue);
    Serial.println("=================");
    }

客户端程序:

  • 客户端通过HTTP协议向服务器发送信息
  • 信息中包含客户端按键开关引脚状态用于控制服务器板上LED的点亮和熄灭
  • 信息中还包含测试数据以便我们更好的了解如何使用ESP8266发送和接收物联网数据信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/**********************************************************************
项目名称/Project : 零基础入门学用物联网
程序名称/Program name : csd_client
团队/Team : 太极创客团队 / Taichi-Maker (www.taichi-maker.com)
作者/Author : CYNO朔
日期/Date(YYYYMMDD) : 20200228
程序目的/Purpose :
演示如何实现两个NodeMCU间通过WiFi进行通讯。两台NodeMCU一个以服务器模式运行,
一个以客户端模式运行。

此代码为客户端代码。此代码主要功能:
- 通过HTTP协议向服务器发送HTTP请求
- HTTP请求中包含客户端按键开关引脚状态和程序测试数据
-----------------------------------------------------------------------
修订历史/Revision History
日期/Date 作者/Author 参考号/Ref 修订说明/Revision Description
-----------------------------------------------------------------------
http信息发送说明
192.168.0.123/update?float=1.5&int=2&button=0
***********************************************************************/
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h> // 使用WiFiMulti库

#define buttonPin D3 // 按钮引脚D3

ESP8266WiFiMulti wifiMulti; // 建立ESP8266WiFiMulti对象,对象名称是 'wifiMulti'

bool buttonState; //存储客户端按键控制数据
float clientFloatValue; //存储客户端发送的浮点型测试数据
int clientIntValue; //存储客户端发送的整数型测试数据

const char* host = "192.168.0.123"; // 即将连接服务器网址/IP
const int httpPort = 80; // 即将连接服务器端口

void setup(void){
Serial.begin(9600); // 启动串口通讯
Serial.println("");

pinMode(buttonPin, INPUT_PULLUP); // 将按键引脚设置为输入上拉模式

wifiMulti.addAP("ssid_from_AP_1", "your_password_for_AP_1"); // 将需要连接的一系列WiFi ID和密码输入这里
wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2"); // ESP8266-NodeMCU再启动后会扫描当前网络
wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3"); // 环境查找是否有这里列出的WiFi ID。如果有
Serial.println("Connecting ..."); // 则尝试使用此处存储的密码进行连接。

while (wifiMulti.run() != WL_CONNECTED) { // 尝试进行wifi连接。
delay(250);
Serial.print('.');
}

// WiFi连接成功后将通过串口监视器输出连接成功信息
Serial.println('\n');
Serial.print("Connected to ");
Serial.println(WiFi.SSID()); // 通过串口监视器输出连接的WiFi名称
Serial.print("IP address:\t");
Serial.println(WiFi.localIP()); // 通过串口监视器输出ESP8266-NodeMCU的IP
}

void loop(void){
// 获取按键引脚状态
buttonState = digitalRead(buttonPin);

// 改变测试用变量数值用于服务器端接收数据检测
clientFloatValue += 1.5;
clientIntValue += 2;

// 发送请求
wifiClientRequest();
delay(1000);
}

void wifiClientRequest(){
WiFiClient client;

// 将需要发送的数据信息放入客户端请求
String url = "/update?float=" + String(clientFloatValue) +
"&int=" + String(clientIntValue) +
"&button=" + String(buttonState);

// 建立字符串,用于HTTP请求
String httpRequest = String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n" +
"\r\n";

Serial.print("Connecting to ");
Serial.print(host);

if (client.connect(host, httpPort)) { //如果连接失败则串口输出信息告知用户然后返回loop
Serial.println(" Sucess");

client.print(httpRequest); // 向服务器发送HTTP请求
Serial.println("Sending request: ");// 通过串口输出HTTP请求信息内容以便查阅
Serial.println(httpRequest);
} else{
Serial.println(" failed");
}

client.stop();
}

其中出现过一次问题,是因为板子的硬件问题导致无法连接。

示例程序成功通信后截图如下: