ESP8266-Arduino网络编程实例-异步TCP客户端

异步TCP客户端

本次实例将使用ESPAsyncTCP库实现一个简单的客户端。

客户端实现的主要步骤如下:

  • 连接WiFi
  • 连接服务器
  • 注册TCP客户端事件回调函数

1、硬件准备

  • ESP8266 NodeMCU开发板一块
  • 数据线一条

2、软件准备

  • Arduino IDE或VSCode + PlatformIO

在前面的文章中,对如何搭建ESP8266开发环境做了详细的介绍,请参考:

ESP8266 NodeMCU的引脚介绍在前面的文章中做了详细的介绍,请参考:

3、代码实现

本次使用到的ESPAsyncTCp库下载地址如下:

第一步,导入依赖头文件

1
2
3
4
5
6
7
8
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>

extern "C" {
#include <osapi.h>
#include <os\_type.h>
}

第二步,定义WiFi及TCP客户连接信息

1
2
3
4
5
6
7
8
9
10
#define SSID "你的WiFi名称"
#define PASSWORD "你的WiFi密码"

#define SERVER\_HOST\_NAME "TCP服务器地址"

#define TCP\_PORT 5050
#define DNS\_PORT 53

static os\_timer\_t intervalTimer; // 定时器

第三步,定义定时器回调函数

1
2
3
4
5
6
7
8
9
10
11
12
static void replyToServer(void\* arg) {
AsyncClient\* client = reinterpret_cast<AsyncClient\*>(arg);

// 向服务器发送数据
if (client->space() > 32 && client->canSend()) {
char message[32];
sprintf(message, "this is from %s", WiFi.localIP().toString().c\_str());
client->add(message, strlen(message));
client->send();
}
}

第四步,定义TCP服务器事件回调函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 处理数据
static void handleData(void\* arg, AsyncClient\* client, void \*data, size\_t len) {
Serial.printf("\n data received from %s \n", client->remoteIP().toString().c\_str());
Serial.write((uint8\_t\*)data, len);

os\_timer\_arm(&intervalTimer, 2000, true); // schedule for reply to server at next 2s
}

// 连接事件
void onConnect(void\* arg, AsyncClient\* client) {
Serial.printf("\n client has been connected to %s on port %d \n", SERVER_HOST_NAME, TCP_PORT);
replyToServer(client);
}


第五步,在setup函数中初始化设备、TCP客户端

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
void setup() {
Serial.begin(115200);
delay(20);

// 设置WiFi工作模式为Station模式
WiFi.mode(WIFI_STA);
// 连接WiFi
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}

// 打印WiFi信息
Serial.println();

Serial.print("Connected\r\nIP address: ");
Serial.println(WiFi.localIP());
Serial.print("macAddress:");
Serial.println(WiFi.macAddress());
Serial.print("subnetMask:");
Serial.println(WiFi.subnetMask());
Serial.print("gatewayIP:");
Serial.println(WiFi.gatewayIP());

// 创建TCP客户端
AsyncClient\* client = new AsyncClient;
// 注册数据事件
client->onData(&handleData, client);
// 注册连接事件
client->onConnect(&onConnect, client);
// 连接服务器
client->connect(SERVER_HOST_NAME, TCP_PORT);
if(client->connected()){
Serial.println("connected to tcp server");
}else{
Serial.println("connect tcp server failed");
while(true);
}
// 定时器回调设置
os\_timer\_disarm(&intervalTimer);
os\_timer\_setfn(&intervalTimer, &replyToServer, client);
}


最后,loop函数不处理任何逻辑

1
2
3
4
void loop() {

}

文章来源: https://iotsmart.blog.csdn.net/article/details/127319379