往期
《ESP8266通信指南》8-连接WIFI(Arduino开发)(非常简单)-CSDN博客
《ESP8266通信指南》7-Arduino 开发8266的环境配置与示例代码烧录-CSDN博客
《ESP8266通信指南》6-创建TCP服务器(AT指令)-CSDN博客
《ESP8266通信指南》5-TCP通信透传模式(AT指令)-CSDN博客
《ESP8266通信指南》4-以Client进行TCP通信(AT指令)-CSDN博客
《ESP8266通信指南》3-常用AT指令详解-8266连WIFI-CSDN博客
《ESP8266通信指南》2-ESP8266 AT测试-CSDN博客
《ESP8266通信指南》1-ESP8266 简介-CSDN博客
1. 小节目标
通过 Arudino 编程,实现 ESP8266 的 TCP 通信,完成以下功能:
- 实现 ESP8266 每个 5 秒上报一次累加的数据(1、2、3、4)
- TCP 服务器发送数据给 ESP8266 的时候,ESP8266 要立马打印出来,不允许堵塞
2. 开始实践
2.1. 开启 TCP 服务器
开启一个 TCP 服务器就需要有 TCP 调试组手,在之前的小节已经讲过了,如果还没有看到的话就可以到这一小节中学习:《ESP8266通信指南》4-以Client进行TCP通信(AT指令)_前端tcp通信 client-CSDN博客
2.2. 完整代码
各位读者,直接上代码,为什么 TCP 服务器开启会在代码的前面呢?
因为我们在代码中需要写入 TCP 服务器的信息,所有就需要先开启 TCP 服务器,同时将 TPC 的服务器 IP、端口就填写到代码中,如下。
#include <ESP8266WiFi.h>
#ifndef STASSID
#define STASSID "ct-iot" // 你的 WiFi 热点名称
#define STAPSK "111222333" // 你的 WiFi 密码
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
const char* host = "192.168.137.1"; // 目标主机名称TCP服务器IP
const uint16_t port = 8010; // 目标主机端口 TCP服务器端口
unsigned long lastSendTime = 0;
int sendData = 0;
WiFiClient client;
void setup() {
Serial.begin(115200);
// 开始连接到 WiFi 网络
Serial.println();
Serial.println();
Serial.print("连接到 ");
Serial.println(ssid);
/* 明确将 ESP8266 设置为 WiFi 客户端,否则,默认情况下,
它会尝试充当客户端和接入点,可能会导致
WiFi 网络上的其他 WiFi 设备出现网络问题。 */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi 连接成功");
Serial.println("IP 地址: ");
Serial.println(WiFi.localIP());
}
void loop() {
if (!client.connected()) {
if (!connectToServer()) {
return;
}
}
if (millis() - lastSendTime >= 5000) {
sendToServer();
lastSendTime = millis();
}
readFromServer();
}
bool connectToServer() {
Serial.print("连接到 ");
Serial.print(host);
Serial.print(':');
Serial.println(port);
if (!client.connect(host, port)) {
Serial.println("连接失败");
return false;
}
Serial.println("连接成功");
return true;
}
void sendToServer() {
if (!client.connected()) {
Serial.println("未连接到服务器");
return;
}
Serial.println("向服务器发送数据");
client.print("Data: ");
client.println(sendData);
sendData++;
}
void readFromServer() {
if (!client.available()) {
return;
}
Serial.println("接收来自远程服务器的数据");
while (client.available()) {
char ch = static_cast<char>(client.read());
Serial.print(ch);
}
Serial.println();
}
2.3. 运行程序
如果你是以下的效果,那么就是成功了
2.3.1. Arduino 串口上
- Arduino 串口上显示的
2.3.2. TCP 服务器上
- TCP 服务器上显示的
2.4. TCP 服务器往 ESP8266 发送数据
我们在 TCP 服务器上发送数据的时候,ESP8266 就可以接收到了
3. 代码详解
在进行代码详解的时候,我们还是会介绍 WIFI 连接的内容,这是给没有看到上一小节的读者准备的。
在代码中我们先连接到指定的WiFi网络,然后在主循环中持续执行以下步骤:
- 检查连接状态并连接到远程服务器,定时向服务器发送数据
- 读取并输出服务器返回的数据
3.1. 包含必要的库文件
#include <ESP8266WiFi.h>
这一行代码包含了 ESP8266WiFi 库,它提供了与 ESP8266 WiFi 模块交互所需的函数和类。
3.2. 定义 WiFi 凭证
#ifndef STASSID
#define STASSID "ct-iot" // 你的 WiFi 热点名称
#define STAPSK "111222333" // 你的 WiFi 密码
#endif
这里定义了 WiFi 热点的名称和密码。通过 STASSID
和 STAPSK
宏定义,我们可以在不修改代码的情况下更改 WiFi 凭证。
3.3. 设置 WiFi 连接信息
const char* ssid = STASSID;
const char* password = STAPSK;
将 WiFi 热点的名称和密码分配给 ssid
和 password
变量,以便在连接时使用。
3.4. 设置目标服务器信息
const char* host = "192.168.137.1"; // 目标主机名称
const uint16_t port = 8010; // 目标主机端口
指定了要连接的远程服务器的主机名和端口号,也就是 TCP 服务器的 IP 和端口。
3.5. 全局变量和对象声明
unsigned long lastSendTime = 0;
int sendData = 0;
WiFiClient client;
声明了一些全局变量和对象,包括上次发送数据的时间、要发送的数据、WiFi 客户端对象等。
3.6. 设置函数 setup()
void setup() {
Serial.begin(115200);
// 开始连接到 WiFi 网络
Serial.println();
Serial.println();
Serial.print("连接到 ");
Serial.println(ssid);
/* 明确将 ESP8266 设置为 WiFi 客户端,否则,默认情况下,
它会尝试充当客户端和接入点,可能会导致
WiFi 网络上的其他 WiFi 设备出现网络问题。 */
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi 连接成功");
Serial.println("IP 地址: ");
Serial.println(WiFi.localIP());
}
在 setup()
函数中,通过串行通信初始化,并连接到指定的 WiFi 热点。使用 WiFi.mode(WIFI_STA)
将 ESP8266 设置为 WiFi 客户端模式,以确保它不会充当接入点。
3.7. 设置主循环函数 loop()
void loop() {
if (!client.connected()) {
if (!connectToServer()) {
return;
}
}
if (millis() - lastSendTime >= 5000) {
sendToServer();
lastSendTime = millis();
}
readFromServer();
}
loop()
函数包含了连接到服务器、定时发送数据以及从服务器读取数据的逻辑。
3.8. 连接到服务器的函数
bool connectToServer() {
Serial.print("连接到 ");
Serial.print(host);
Serial.print(':');
Serial.println(port);
if (!client.connect(host, port)) {
Serial.println("连接失败");
return false;
}
Serial.println("连接成功");
return true;
}
connectToServer()
函数用于连接到远程服务器。
3.9. 向服务器发送数据的函数
void sendToServer() {
if (!client.connected()) {
Serial.println("未连接到服务器");
return;
}
Serial.println("向服务器发送数据");
client.print("Data: ");
client.println(sendData);
sendData++;
}
sendToServer()
函数用于向服务器发送数据。
3.10. 从服务器读取数据的函数
void readFromServer() {
if (!client.available()) {
return;
}
Serial.println("接收来自远程服务器的数据");
while (client.available()) {
char ch = static_cast<char>(client.read());
Serial.print(ch);
}
Serial.println();
}
readFromServer()
函数用于从服务器读取数据。
4. 结语
在本小节中,我们学习了如何使用 ESP8266 进行 TCP 通信,虽然我们之前已经实现了使用 AT 指令,需要使用到 AT 指令库,现在我们可以随时开机就可以跟 TCP 服务器进行通信了。
同学们还可以进行拓展,就是在 ESP8266 上接一个单片机,然后将单片机采集的传感器数据发到 TCP 服务器,当接收到 TCP 服务器发来的数据的时候就转发到 STM32 上,这一部分我们会在后续小节中讲到。
柴头物联网出品