完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
一、简介
使用Ubuntu搭建UDP服务器,ESP32作为客户端。实现ESP32和ESP32之间的通信,以及ESP32和服务器直接的通信。 二、需要的工具
四、服务器 为实现通信要求,服务器要求具有以下的功能。首先是实现UDP数据接受发送,这是通信的基础;其次是对来自ESP32的数据做出反应,主要包括两种,一种是返回ESP32某种数据,一种是对ESP32发来的数据进行某种处理。 流程图详解 按照流程图所示: 第一步先是要初始化UDP通信,我设计的这个系统的整体通信都是基于UDP网络通信实现的;第二步建立一个空的用户列表,这个用户列表后期会被用来存储每一个ESP32的基本信息。最后,阻塞等待UDP数据,每收到一个数据就建立一个线程对这个数据进行处理。下面的介绍详细的描述了这个过程:
如图所示,基本所有在网络间传输的数据都要遵循上图所示的规则。每次进行通信的数据都是由若干个字节构成的(最少 3 个字节)。 第一个字节用于初步校验,即在服务器刚收到数据时就通过该字节是不是程序需要的数据,是需求的数据才将进入下一步,不是则直接丢弃该数据。 第二个字节用来判断接收方,数据分为发送给服务器和转发给其他控制终端的数据。第二个字节如果是0 ,则表示该数据会交给服务器来进行处理;如果是非 0 则表示数据是要发送给其他控制终端来处理的,服务器在这一步里只起到了转发数据的功能。 以上两种情况对于不同的第三个字节以及第三个字节以后的数据,接收方为服务器时,第三字节为0、1、2、3分别代表更改自己的描述信息、给服务器发送的信息、获取控制终端机列表、控制终端主动断开。 更改自己的数据描述信息,从第四字节开始存储描述信息,描述信息的结构定义如下: #define DESCRIBE_SIZE 32// 描述信息typedef struct{ char type; char describe[DESCRIBE_SIZE];}describe; 在给服务器发送信息时要保留数据的格式,数据格式并未给明确的定义。在服务器上,代码里会直接以字符串的形式对数据进行输出。 获取控制终端机列表,第三字节为2表示获取控制终端列表,这个通信过程只有三个字节。系统收到这个信号之后,服务器将开始以规定的数据格式向发起这个请求信号的控制终端回发一个控制终端的列表。这里所说的规定的数据格式在后面的章节中会有介绍。 控制终端会主动断开,第三字节为3的时候表示控制终端会主动断开此时的连接,这个通信过程也只有三个字节。收到这个信号之后服务器会首先获取数据锁,获取到之后从控制终端列表中删除这个控制终端,释放数据锁,然后结束此刻进行的线程。 五、ESP32流程图 首先对OLED进行初始化,我在本系统的设计中采用了0.9寸的OLED显示屏作为输出显示模块,一般0.9寸的OLED显示屏模块都支持SPI和IIC通信,ESP32作为一个IO比较少的单片机使用这两种通信方式都可以很大程度上节约IO资源。 开启Station模式,即初始化ESP32的Station工作模式,使ESP32作为一个路由的终端接入网络。需要注意的是在ESP32中初始化话Station工作模式之前需要初始化NVS存储系统,因为关于网络的硬件信息需要从NVS分区读取。 UDP的连接使用中,在使能Station模式之后就要开始创建UDP连接使得该设备可以连接到服务器,创建UDP连接可以使用类似Linux的socket网络编程,也可以使用esp-idf封装的UDP网络函数,这两种方法本质上没有差别,都可以实现我们设计中要求的网络连接,我在本设计中使用了第二种方法。在使用后者时,创建UDP连接的过程中需要注册接收回调函数,该函数在UDP接收到数据后会被调用。具体注册如下: // 注册接收回调函数 udp_recv(my_udp_pcb, my_udp_recv, NULL); my_udp_recv为注册的回调函数名,my_udp_pcb是关于UDP控制的数据结构体。 接收回调函数会在每一次UDP接收到数据之后被调用,在接收回调函数中处理接收到的数据,在本设计中的处理方式为通过OLED显示出相应的信息。 依次发送测试数据,分别是更改描述信息、给服务器发送信息、获取客户机列表、主动断开连接的测试信息 六、参考程序下载 这是我的毕业设计作品,上述的功能都是实现的,哦,除了数据锁的那个,最后赶作品没有加,不过我们毕业的时候的测试场景都是非常的简单,根本不可能出现数据冲突。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2956 浏览 16 评论
3456 浏览 1 评论
8988 浏览 16 评论
4050 浏览 18 评论
1103浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 15:08 , Processed in 1.009186 second(s), Total 81, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号