双esp8266-01之间UDP透传传输,自定义协议

使用AT模式的透传,串口打印的数据包含+pd1,4,数据

打印的数据不是直接将数据打印出来,包含了+pd1,4,特殊字符,针对想要直接开机直接透传,打印数据且按照自主协议帧头的功能进行开发。

1.server程序:

/*************SERVER***CLENIT**************** */
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>// 配置网络参数
const char* ssid = "ESP8266_UDP_SERVER";
const char* password = "12345678";const IPAddress SERVER_IP(192, 168, 1, 100);  // 服务器固定IP
const unsigned int SERVER_UDP_PORT = 8888;            // 通信端口IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);const IPAddress CLIENT_IP(192, 168, 1, 101);  // 客户端固定IP
const unsigned int CLIENT_UDP_PORT = 8888;            // 通信端口WiFiUDP Udp;
char packetBuffer[512];  // UDP接收缓冲区
/*************SERVER******************* */
void setup() {Serial.begin(115200);// 连接WiFi// WiFi.begin(ssid, password);//Wifi热点WiFi.softAPConfig(SERVER_IP,gateway,subnet);WiFi.softAP(ssid,password);// Serial.print("Connecting to WiFi");// Serial.printf("WIFI-ssid:%s;WIFI-password:%s;WIFI-Server_IP:%s;WIFI-Server_udp_port:%d;WIFI-client_IP:%s;WIFI-Client_udp_port:%d",ssid,password, SERVER_IP.toString(),SERVER_UDP_PORT,CLIENT_IP.toString(),CLIENT_UDP_PORT);// Serial.println("\nConnected! IP: " + SERVER_IP.toString());// 启动UDP服务Udp.begin(CLIENT_UDP_PORT);Serial.println("UDP server started on port " + String(CLIENT_UDP_PORT));
}void loop() {// 处理串口输入 (发送到客户端)if (Serial.available()) {String serialData = Serial.readStringUntil('\n');//截止符Udp.beginPacket(CLIENT_IP, CLIENT_UDP_PORT);// int W_len=Udp.write(serialData.c_str(),serialData.length());Udp.write(serialData.c_str(),serialData.length());Udp.endPacket();// Serial.println("[Sent] " + serialData);// Serial.println(W_len);// Serial.println(serialData.length());Serial.println(serialData);}// 处理UDP数据 (接收并输出到串口)int packetSize = Udp.parsePacket();// if(packetSize>0)//   Serial.println(packetSize);if (packetSize) {int len = Udp.read(packetBuffer, packetSize);if (len > 0) {packetBuffer[len] = '\0';// Serial.println("[Received] " + String(packetBuffer));// Serial.println(len);Serial.println(String(packetBuffer));}}
}

2.client程序:

/*************SERVER***CLENIT**************** */
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>// 配置网络参数
const char* ssid = "ESP8266_UDP_SERVER";
const char* password = "12345678";const IPAddress SERVER_IP(192, 168, 1, 100);  // 服务器固定IP
const unsigned int SERVER_UDP_PORT = 8888;            // 通信端口IPAddress gateway(192,168,4,1);
IPAddress subnet(255,255,255,0);const IPAddress CLIENT_IP(192, 168, 1, 101);  // 客户端固定IP
const unsigned int CLIENT_UDP_PORT = 8888;            // 通信端口WiFiUDP Udp;
char packetBuffer[512];  // UDP接收缓冲区/**************client**************** */
// 配置网络参数
void setup() {Serial.begin(115200);// 连接WiFiWiFi.begin(ssid, password);Serial.print("Connecting to WiFi");while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print(".");}Serial.println("\nConnected! IP: " + WiFi.localIP().toString());// 启动UDP服务Udp.begin(SERVER_UDP_PORT);Serial.println("UDP client started. Target: " + SERVER_IP.toString());
}void loop() {// 处理串口输入 (发送到服务器)int len = Serial.available();if (len) {String serialData = Serial.readStringUntil('\n');//截止符Udp.beginPacket(SERVER_IP, SERVER_UDP_PORT);// int W_len=Udp.write(serialData.c_str(),serialData.length());Udp.write(serialData.c_str(),serialData.length());Udp.endPacket();// Serial.println("[Sent] " + serialData);// Serial.println(W_len);// Serial.println(serialData.length());Serial.println( serialData);}// 处理UDP数据 (接收并输出到串口)int packetSize = Udp.parsePacket();// if(packetSize>0)//   Serial.println(packetSize);if (packetSize) {int len = Udp.read(packetBuffer, packetSize);if (len > 0) {packetBuffer[len] = '\0';// Serial.println("[Received] " + String(packetBuffer));// Serial.println(len);Serial.write(packetBuffer,len);}}
}

分别下载两个esp8266-01里面,双esp8266上电,自动建立链接,由Server串口发送数据,通过UDP发送至client的串口,就可以看到server发送的数据了。

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

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

相关文章

BGP 路由优选属性(7)【MED】官方考试综合实验题【bgp】【acl】【ip-prefix】【route-policy】【icmp 环路】精讲

目录 一、MED 属性介绍 二、实验 2.1 实验目的 2.2 拓扑图 2.2 实验说明 2.3 配置脚本 2.4 验证配置 2.5 问题分析 2.7 题目需求解析 2.8 场景 1&#xff1a;只允许在 AS12 上操作 2.9 场景 2&#xff1a;只允许在 AS34 上操作 正文 一、MED 属性介绍 MED 全称 mu…

html-初级标签

一.浏览器能识别的标签 1.1 head标签里的编码和title <head><meta charset"UTF-8"><title>Title</title> </head>1.2 标题 <body><h1>Welcome to my website</h1><h2>Welcome to my website</h2><…

【八股消消乐】Kafka集群 full GC 解决方案

&#x1f60a;你好&#xff0c;我是小航&#xff0c;一个正在变秃、变强的文艺倾年。 &#x1f514;本专栏《八股消消乐》旨在记录个人所背的八股文&#xff0c;包括Java/Go开发、Vue开发、系统架构、大模型开发、具身智能、机器学习、深度学习、力扣算法等相关知识点&#xff…

《Java Web程序设计》实验报告二 学习使用HTML标签、表格、表单

目 录 一、实验目的 二、实验环境 三、实验步骤和内容 1、小组成员分工&#xff08;共计4人&#xff09; 2、实验方案 3、实验结果与分析 4、项目任务评价 四、遇到的问题和解决方法 五、实验总结 一、实验目的 1、HTML基础知识、基本概念 2、使用HTML标签、表格进行…

jenkins使用Jenkinsfile部署springboot+docker项目

文章目录前言一、前期准备二、编辑构建文件二、Jenkins构建总结前言 前面使用Jenkinsfile部署了前端vue项目&#xff0c;接着学习Jenkinsfile部署springboot项目。 一、前期准备 已经安装好centos,并且安装了jenkins和docker。本地新建springboot并上传到gitee上。 二、编辑…

使用ESM3蛋白质语言模型进行快速大规模结构预测

文章目录ESM3介绍ESM3在线使用本地使用api批量预测ESM相较于AlphaFold的优势ESM3介绍 ESM3是由EvolutionaryScale&#xff08;前Meta团队&#xff09;开发的一款蛋白质大语言模型&#xff0c;于2025年以《用语言模型模拟 5 亿年的进化》为题正式发表在Science上 文章链接: htt…

PostgreSQL 时间/日期管理详解

PostgreSQL 时间/日期管理详解 引言 PostgreSQL是一款功能强大的开源关系型数据库管理系统&#xff0c;在时间/日期管理方面具有独特的优势。本文将详细介绍PostgreSQL中时间/日期数据类型及其相关功能&#xff0c;帮助读者更好地理解和应用时间/日期管理。 时间/日期数据类型 …

Agent篇

Agent包含哪些模块&#xff0c;实现了什么功能Agent 就像一个多功能的接口&#xff0c;它能够接触并使用一套工具。根据用户的输入&#xff0c;Agent会规划出一条解决用户问题的路线&#xff0c;决定其中需要调用哪些工具&#xff0c;并调用这些工具。Agent 大语言模型规划记忆…

利用 MySQL 进行数据清洗

利用 MySQL 进行数据清洗是数据预处理的重要环节&#xff0c;以下是常见的数据清洗操作及对应 SQL 示例&#xff1a;1. 去除重复数据使用 ROW_NUMBER() 或 GROUP BY 识别并删除重复记录。-- 查找重复记录&#xff08;以 user_id 和 email 为例&#xff09; WITH Duplicates AS …

【MySQL笔记】事务的ACID特性与隔离级别

目录1. 什么是事务&#xff1f;2. 事务的ACID特性&#xff08;重要&#xff09;3. 事务控制语法4. 隔离级别与并发问题1. 什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;是由一组SQL语句组成的逻辑单元&#xff0c;这些操作要么全部成功&#xff0c;要么全部…

Mock 数据的生成与使用全景详解

Mock 数据的生成与使用全景详解 在后端开发过程中,真实数据往往受限于业务进度、隐私保护或接口未完成等因素,无法及时获取。这时,Mock数据(模拟数据)就成为开发、测试、联调不可或缺的利器。本文将从Mock数据的意义、常用场景、主流工具、实战案例到最佳实践,带你全面掌…

HTML 标题标签

需求&#xff1a;在网页显示六级标题标签。代码&#xff1a;//需求&#xff1a;在网页显示六级标题标签。 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><h1>一级标题&l…

(限免!!!)全国青少年信息素养大赛-算法创意实践挑战赛小学组复赛(代码版)

选择题部分在 C 中&#xff0c;以下代表布尔类型的是&#xff08;  &#xff09;选项&#xff1a;A. double B. bool C. int D. char答案&#xff1a;B解析&#xff1a;C 中布尔类型的关键字为bool&#xff0c;用于存储逻辑值true或false。执行以下程序&#xff0c;输出的…

编译器优化——LLVM IR,零基础入门

编译器优化——LLVM IR&#xff0c;零基础入门 对于大多数C开发者而言&#xff0c;我们的代码从人类可读的文本到机器可执行的二进制文件&#xff0c;中间经历的过程如同一个黑箱。我们依赖编译器&#xff08;如GCC, Clang, MSVC&#xff09;来完成这项复杂的转换。然而&#x…

react中为啥使用剪头函数

在 React 中使用箭头函数&#xff08;>&#xff09;主要有以下几个原因&#xff1a;1. 自动绑定 this传统函数的问题&#xff1a;在类组件中&#xff0c;普通函数的this指向会根据调用方式变化&#xff0c;导致在事件处理函数中无法正确访问组件实例&#xff08;this为undef…

JavaSE-多态

多态的概念在完成某个行为时&#xff0c;不同的对象在完成时会呈现出不同的状态。比如&#xff1a;动物都会吃饭&#xff0c;而猫和狗都是动物&#xff0c;猫在完成吃饭行为时吃猫粮&#xff0c;狗在完成吃饭行为时吃狗粮&#xff0c;猫和狗都会叫&#xff0c;狗在完成这个行为…

TDengine 使用最佳实践(2)

TDengine 使用最佳实践&#xff08;1&#xff09; 安装部署 目录规划 软件安装 参数配置 时钟同步 验证环境 集群部署 写入查询 连接方式 数据写入 数据查询 运维巡检 运维规范 数据库启停 状态检查 运维技巧 日常巡检 数据库升级 故障排查 故障定位 日志调试 故障反馈 关于 T…

如何通过公网IP访问部署在kubernetes中的服务?

背景说明我们有些私有化部署的项目&#xff0c;使用k8s来承载服务&#xff0c;通过ingress-nginx转发外部的请求到集群。有时候业主的域名没有申请下来&#xff0c;我们会配置临时的域名&#xff0c;测试同事配置主机hosts来完成功能验证&#xff0c;等功能验证完毕后&#xff…

Datawhale AI 夏令营2025科大讯飞AI大赛<夏令营:用AI做带货视频评论分析>

赛题题目 任务一&#xff1a;商品识别 基于视频内容识别对应的商品 【情感分析】对评论文本进行多维度情感分析&#xff0c;涵盖维度见数据说明&#xff1b; 任务二&#xff08;文本分类&#xff09;&#xff1a;从非结构化评论中提取情感倾向 评论聚类】按商品对归属指定维度的…

AI 时代的分布式多模态数据处理实践:我的 ODPS 实践之旅、思考与展望

AI 时代的分布式多模态数据处理实践&#xff1a;我的 ODPS 实践之旅、思考与展望 &#x1f31f;嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 1. 什…