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

news2025/5/18 14:10:26


往期

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



柴头物联网出品

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1632104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:string 类

在C中定义一个 std::string 字符串可以采用以下几种方式&#xff1a; 1.使用字符串字面量初始化&#xff1a; std::string str "Hello, world!"; 2.使用构造函数初始化&#xff1a; std::string szStringB("Hello wolven"); 3.使用重复字符初始化&am…

UE4内存优化

内存查看命令​ 可以通过Stat MemoryPlatform查看对应的内存信息 Total Virtual虚拟内存的总量 Available Virtual可用的虚拟内存 Total Physical 物理内存的总量 Available Physical 可用物理内存总量 Peak Used Virtual 表示应用程序或游戏在运行过程中达到的虚拟内存使用峰…

android 分区存储(沙盒存储)适配总结

目录 一、分区存储概念 1.外部存储分类 2.分区存储如何影响文件访问 二、分区适配方案 1. 应用分区存储的文件访问规定 (1).应用专属目录--私有目录 (2).共享目录文件--公有目录 2.MediaStore API介绍 3.Storage Access Framework介绍 三、所有文件访问权限 四、总结…

十大USDT交易平台大全XEX交易所

USDT是一种基于比特币区块链网络的加密代币&#xff0c;主要运用于数字货币交易平台&#xff0c;以稳定币为主。USDT的核心价值在于其与真实货币的固定兑换比率1:1&#xff0c;所以被称为Tether。随着加密货币市场的不断壮大&#xff0c;越来越多的交易平台开始支持USDT&#x…

常用的4个Linux Shell脚本,实现运维自动化的基础

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是Shell脚本 二、实…

go引入自建包名报错 package XXX is not in std和goland设置GO111MODULE提示冲突

首先在引入自建包的时候报错 查找网上的解决方法&#xff1a; 1、goland取消勾选Enable Go modules integration 2、set GO111MODULEoff 但是都没解决&#xff0c;而且更奇怪的是&#xff0c;我在cmd里面查看go env就显示set GO111MODULEoff 但是在goland里面的终端输入 go…

户外小型气象站

TH-QC10随着环境保护意识的日益增强&#xff0c;气象监测在环保工作中扮演着越来越重要的角色。户外小型气象站作为一种便携、高效的气象监测设备&#xff0c;为环保工作提供了有力的支持。本文将对户外小型气象站的功能、应用场景进行简要介绍。 一、户外小型气象站的功能 户…

第九届中国海洋大学信息安全竞赛 Re 睡Lite wp

还得自己查资料 相近的版本就行 可以找到一些字符&#xff0c;经过分析可以猜测sub_48就是类似sleep的减速函数 就算真用芯片也跑不出来&#xff0c;一直sleep 往下翻可以找到很多字符 拼在一起可以大致看出flag

操作系统——优先权算法c++实现

变量描述 测试数据 5 A 0 4 4 B 1 3 2 C 2 5 3 D 3 2 5 E 4 4 1 先来先服务算法 简述 该算法实现非常简单就是对到达时间排个序&#xff0c;然后依次进行即可&#xff0c;对结构体的sort进行了重载 代码 void FCFS() {//先来先服务算法std::cout<<"\n\t\t\t\t\…

快速生成个人信息测试数据

特点&#xff1a; 业务测试的数据比较多&#xff0c;苦于测试数据生成麻烦&#xff0c;用javascripthtmlcss快速生成页面并支持导出&#xff1b; 用途&#xff1a; 1、可用于频繁的功能测试&#xff1b; 2、可用于性能测试参数化&#xff1b; 3、可用于自动化测试参数&…

Python | Leetcode Python题解之第58题最后一个单词的长度

题目&#xff1a; 题解&#xff1a; class Solution:def lengthOfLastWord(self, s: str) -> int:ls[]for i in s.split():ls.append(i)return len(ls[-1])

二叉树理论和题目

二叉树的种类 在我们解题过程中二叉树有两种主要的形&#xff1a;满二叉树和完全二叉树。 满二叉树 满二叉树&#xff1a;如果一棵二叉树只有度为0的结点和度为 2 的结点&#xff0c;并且度为 0 的结点在同一层上&#xff0c;则这棵二叉树为满二叉树。 这棵二叉树为满二叉树…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-6.4

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

Python绘制3D曲面图

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 探索Python中绘制3D曲面图的艺术 在数据可视化的世界中&#xff0c;3D曲面图是一种强大的工…

OpenCV如何模板匹配

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投 下一篇 &#xff1a;OpenCV在图像中寻找轮廓 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入图像之间…

Python学习笔记------异常

当检测到错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现一些错误提示&#xff0c;就是所谓异常&#xff08;bug&#xff09; 1、异常的捕获方法 任何程序运行过程中都可能出现异常&#xff0c;我们可以在力所能及的范围内&#xff0c;对可能出现的bug提…

家庭教育-家长指导手册

背景介绍 写这篇文章的动机&#xff1a;我在抖音上一个视频中看到孩子洗了碗&#xff0c;家长翻一本打印的册子&#xff0c;从里面找表扬的话。这个册子左侧写了孩子的行为&#xff0c;比如&#xff1a;洗碗&#xff0c;右边写了家长应该说的表扬的话。 所以&#xff0c;我寻思…

[论文笔记]SEARCHING FOR ACTIVATION FUNCTIONS

引言 今天带来另一篇激活函数论文SEARCHING FOR ACTIVATION FUNCTIONS的笔记。 作者利用自动搜索技术来发现新的激活函数。通过结合详尽的搜索和基于强化学习的搜索&#xff0c;通过实验发现最佳的激活函数 f ( x ) x ⋅ sigmoid ( β x ) f(x) x \cdot \text{sigmoid}(βx…

MOS(My Oracle Support)怎么用?Oracle DBA必备技能!

MOS简介 老Oracle DBAer都知道MOS的前身是Metalink&#xff0c;2012年MOS替换掉原有的Metalink平台&#xff1b;MOS是Oracle提供的新一代在线支持平台&#xff0c;MOS平台整合了以前的Metalink功能&#xff0c;并提供了更强大的功能和用户体验。它允许客户提交和跟踪技术支持…

ubuntu系统搭建pytorch环境详细步骤【笔记】

实践设备&#xff1a;华硕FX-PRO&#xff08;NVIDIA GeForce GTX 960M&#xff09; 搭建PyTorch环境的详细步骤如下&#xff1a; 1.安装Ubuntu系统&#xff1a; 下载Ubuntu的镜像文件并制作启动盘。将启动盘插入计算机&#xff0c;启动计算机并按照提示安装Ubuntu系统。 2.…