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



柴头物联网出品

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

asp.net结课作业中遇到的问题解决1

作业要求 实现增删改查导出基本功能。 1、如何设置使得某个背景就是一整个而不是无限填充或者是这个图片的某一部分。 这就要求在设置这一块的时候&#xff0c;长和宽按照背景图片的大小进行设置&#xff0c;比如&#xff1a; 如果&#xff0c;图片的大小不符合你的要求&am…

如何让用户听话?

​福格教授&#xff08;斯坦福大学行为设计实验室创始人&#xff09;通过深入研究人类行为20年&#xff0c;2007年用自己的名子命名&#xff0c;提出了一个行为模型&#xff1a;福格行为模型。 模型表明&#xff1a;人的行为发生&#xff0c;要有做出行为的动机和完成行为的能…

操作系统——优先权算法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\…

字典及GitHub字典爬取工具

红队API接口Fuzz字典可以用于WEB安全&#xff0c;渗透测试&#xff0c;SRC等场景 完整文件已上传知识星球&#xff0c;需要的朋友可加入查看。

STM32应用开发教程进阶--Wi-Fi通信(ESP8266模块:STA、AP、STA+AP)

实现目标 1、熟悉Wi-F、ESP8266模块 2、掌握ESP8266模块共3种工作模式&#xff1a;STA、AP、STAAP的配置 3、具体实现目标&#xff1a;&#xff08;1&#xff09;AT固件烧录&#xff1b;&#xff08;2&#xff09;ESP8266模块STA、AP、STAAP的配置 一、Wi-Fi概述 1、Wi-Fi定…

OpenCV-Python: 强大的计算机视觉库

文章目录 OpenCV-Python: 强大的计算机视觉库背景OpenCV-Python是什么&#xff1f;安装简单的库函数使用方法场景示例人脸检测和识别图像分割目标跟踪 常见问题和解决方案总结 OpenCV-Python: 强大的计算机视觉库 背景 OpenCV (Open Source Computer Vision Library) 是一个开…

OceanBase 助力同方智慧能源,打造安全可靠、高性能的能源数据架构

本文作者&#xff1a;丁泽斌&#xff0c;同方智慧能源数据库工程师 业务背景 作为同方股份有限公司旗下的领军企业&#xff0c;同方智慧能源集团矢志成为全球领先的综合智慧能源解决方案提供商。凭借中核集团和清华大学的科技实力&#xff0c;专注于向建筑、交通、工业、北方供…

Altair® HPCWorks™——高性能计算(HPC)和云平台

Altair HPCWorks™——高性能计算&#xff08;HPC&#xff09;和云平台 强大的计算助力研发增速&#xff0c;Altair HPCWorks™ 使高性能和云计算变得快速、高效和提高有效产出 - 无论您的资源是在本地、云端还是混合环境中。专业地管理 IT 复杂性并支持最新的 AI 工作负载。使…

《QT实用小工具·四十五》可以在界面上游泳的小鱼

1、概述 源码放在文章末尾 该项目实现了灵动的小鱼&#xff0c;可以在界面上跟随鼠标点击自由的游泳&#xff0c;项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include "magicfish.h" #include <QtMath> #include <QPainter>…

CentOS7安装和升级nginx

文章目录 一 环境准备二 安装nginx三 升级nginx四 注意事项 一 环境准备 公司等保要求修复nginx的应用漏洞&#xff0c;从1.12.2升级到1.20.2版本。 本机操作系统是CentOS7.9&#xff0c;主机IP是192.168.0.201&#xff0c;nginx是在服务器部署而非容器部署。 下列安装和升级…

Springboot + MySQL + html 实现文件的上传、存储、下载、删除

实现步骤及效果呈现如下&#xff1a; 1.创建数据库表&#xff1a; 表名&#xff1a;file_test 存储后的数据&#xff1a; 2.创建数据库表对应映射的实体类&#xff1a; import com.baomidou.mybatisplus.annotation.IdType;import com.baomidou.mybatisplus.annotation.Table…

《R语言与农业数据统计分析及建模》学习——回归分析

一、线性回归 线性回归是一种广泛用于数据分析、预测和建模的技术&#xff0c;可以帮助我们理解变量之间的关系&#xff0c;并进行预测和推断。 1、简单线性回归 简单线性回归是线性回归的一种特殊情况&#xff0c;适用于只有一个自变量和一个因变量的情况。 在R语言中&#x…

QT c++ 代码布局原则 简单例子

本文描述QT c widget代码布局遵循的原则&#xff1a;实中套虚&#xff0c;虚中套实。 本文最后列出了代码下载链接。 在QT6.2.4 msvc2019编译通过。 所谓实是实体组件&#xff1a;比如界面框、文本标签、组合框、文本框、按钮、表格、图片框等。 所谓虚是Layout组件&#x…

IT廉连看——UniApp——样式绑定

IT廉连看——UniApp——样式绑定 一、样式绑定 两种添加样式的方法&#xff1a; 1、第一种写法 写一个class属性&#xff0c;然后将css样式写在style中。 2、第二种写法 直接把style写在class后面 添加一些效果&#xff1a;字体大小 查看效果 证明这样添加样式是没有问题的…

WPF —— MVVM 指令执行不同的任务实例

标签页 设置两个按钮&#xff0c; <Button Content"修改状态" Width"100" Height"40" Background"red"Click"Button_Click"></Button><Button Content"测试"Width"100"Height"40&…

clickhous学习之旅二

接上回继续鼓捣clickhouse 1.常用数据类型 1.1整型 固定长度的整型&#xff0c;包括有符号整型或无符号整型。整型范围(-2n-1~2n-1-1): Int8 - [-128 :127] -->相当于java中的byte Int16-[-32768 :32767] -->相当于java中的short Int32-[-2147483648 :2147483647] -…

最新官方破解版会声会影2024永久序列号和激活码

会声会影2024是一款功能强大的视频编辑软件&#xff0c;它集合了视频剪辑、音频调整、特效添加等多项功能于一身&#xff0c;为用户提供了一个全面且易用的视频制作平台。无论是初学者还是专业视频编辑人员&#xff0c;都能在这款软件中找到满足自己创作需求的工具。 会声会影最…

基于残差神经网络的汉字识别系统+pyqt前段界面设计

研究内容: 中文汉字识别是一项具有挑战性的任务&#xff0c;涉及到对中文字符的准确分类。在这个项目中&#xff0c;目标是构建一个能够准确识别中文汉字的系统。这个任务涉及到数据集的收集、预处理、模型训练和评估等步骤。尝试了使用残差神经网络&#xff08;ResNet&#x…

windows电脑改造为linux

有个大学用的旧笔记本电脑没啥用了&#xff0c;决定把它改成linux搭一个服务器&#xff1b; 一、linux安装盘制作 首先要有一个大于8G的U盘&#xff0c;然后去下载需要的linux系统镜像&#xff0c;我下的是ubuntu&#xff0c;这里自选版本 https://cn.ubuntu.com/download/d…

中国移动旋转验证码的识别过程

一、前言 今天有空研究了一下这个移动的登录&#xff0c;发现获取手机验证码的时候会弹出一种旋转验证码。这种验证码确实挺头疼。所以顺便研究了一下如何识别。 验证码的样子大家先看一下。看看大家有没有什么更好是思路。 二、验证码识别 我这里就直接上代码。我这里是使用…