《ESP8266通信指南》9-TCP通信(Arudino开发)


往期

《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 通信,完成以下功能:

  1. 实现 ESP8266 每个 5 秒上报一次累加的数据(1、2、3、4)
  2. 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 热点的名称和密码。通过 STASSIDSTAPSK 宏定义,我们可以在不修改代码的情况下更改 WiFi 凭证。

3.3. 设置 WiFi 连接信息

const char* ssid = STASSID;
const char* password = STAPSK;

将 WiFi 热点的名称和密码分配给 ssidpassword 变量,以便在连接时使用。

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 上,这一部分我们会在后续小节中讲到。



柴头物联网出品

  • 15
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值