最近一个月做了一个有关PM2.5室内空气净化的一个项目,控制器采用的是STM32,其中一部分就是实现PC-----控制器------风机之前的通信,采用的技术是WIFI技术,核心部分就是UDP之间的通信。下面总结一下。。。
机制:PC采用UDP广播模式,即控制器需要提供一个指定的端口,比如10100,PC通过配置对端IP 255.255.255.255 PORT 10100即可向对端(控制器)发送指定的协议,我的控制器采用的是ESP8266WIFI模块,该模块是与串口进行直连,支持透传和AT指令,我采用的是AT指令模式,此模块最多支持4路连接,我采用配置其中的两路完成我的整个功能,一个是与PC通信的UDP连接,另一个是与风机通信的UDP广播。
与PC通信的UDP连接处理机制:系统启动过程中有一个默认的对端IP和对端端口以及一个确定的本地端口,由于PC用的是广播模式,所以只要保证向我确定的本地端口发送广播数据,我就可以接收到,但是我想要向PC返回数据时,我就需要知道PC端的IP和端口,因此在广播数据中,按照指定的协议,需要包含PC端的IP地址和PC端的端口号,当我接收到的IP和端口与我默认的IP和端口不一致时,我程序需要自动再次完成socket连接(AT指令连接),连接完成后即可点对点UDP数据收发。
与风机通信的UDP广播机制:通过AT指令配置第二个UDP广播模式连接,说来也奇葩,配了好长时间就是配不成功,原因是需要将对端IP配置成192.168.1.255,而不是通常的255.255.255.255,这块部分应该是因模块厂家不同而不同,配置成广播模式之后,即可通过AT指令向相应的连接发送数据。
此部分是后来补充:上网查了下,原来192.168.1.255是局域网中进行广播,不可以跨路由;而255.255.255.255是全网进行广播,可以跨路由进行广播!
我用的WIFI模块工作模式是AP+STA工作模式,作为AP目的:PC和我控制器直连,配置我要连接的热点的ssid和密码;作为STA,通过连接到局域路由,完成PC---控制器----风机的通信,这三大部分都是连接的同一个路由!
关于TCP/UDP:
仅个人理解:
TCP协议:分为TCP sever和TCP client ,TCP client与TCP sever 三次握手之后建立连接完成两者之间的通信
UDP协议:部分服务器端和客户端(仅个人理解),实际就是点对点通信,我只要知道对端的IP和对端的端口,我就可以向对端发送数据,前提是对端和自己在同一个路由上连接,如果对端IP改成255.255.255.255,PORT为某一个端口,比如:10100,则在该局域网中不论IP为多少,只要是端口设置成10100的,都能接收到广播端数据,通过TCP/UDP调试软件可进行局域内部测试
LINUX 下的TCP/UDP socktet工作原理