UDP理解及UDP的MATLAB实现
一、UDP通信方式理解
1、什么是UDP
UDP是User Datagram Protocol的简称,中文名是用户数据报协议,是OSI参考模型中的传输层协议,它是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。
2、TCP和UDP区别
特征点 | TCP | UDP |
---|---|---|
是否连接 | 面向连接 | 面向非连接 |
传输可靠性 | 可靠 | 会丢包,不可靠 |
应用场景 | 传输数据量大 | 传输量小 |
速度 | 慢 | 快 |
TCP(传输控制协议)提供的是面向连接、可靠的字节流服务。当客户端和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
UDP(用户数据报协议)是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
3、个人对UDP的理解
UDP类似于串口RS485的Modbus协议,不像TCP是两者固定的连接,而是使用广播的方式进行通信。
在UDP和Modbus中,发送方只负责发出数据,接收方需要判断数据是否是发送给自己的,同时,发送方都可以将数据一次性发送给多个接收方。
二、UDP的MATLAB实现
1、单窗口实现
基于上述对UDP的理解,现在开始使用Matlab完成对UDP的实现,这里完成一个小demo,具体程序如下:
fclose(instrfindall);%先关闭之前可能存在的UDP
%127.0.0.1即为本地
u1=udp('127.0.0.1','RemotePort',8847,'LocalPort',8848);
%u1的本机端口为8848,即监听所有发到8848端口的消息;
%u1的远程端口为8847,即若u1发送消息,则发送到8847端口,本机端口为8847的UDP便会受到u1的消息
u2=udp('127.0.0.1','RemotePort',8848,'LocalPort',8849);%同上
u3=udp('127.0.0.1','RemotePort',8848,'LocalPort',8850);%同上
u1.DatagramReceivedFcn = @instrcallback;%设置u1接收到数据包时,调用回调函数显示
u2.DatagramReceivedFcn = @instrcallback;%设置u2接收到数据包时,调用回调函数显示
u3.DatagramReceivedFcn = @instrcallback;%设置u3接收到数据包时,调用回调函数显示
fopen(u1);%打开udp连接
fopen(u2);%同上
fopen(u3);%同上
%-------------------------尝试让u2、u3发送消息,u1接收消息--------------------
fprintf(u2,'u1 receive data from u2');
%u2发送消息,因为u2的远程端口为8848,故此时u1监听到了这个消息
fscanf(u1)%u1接收到u2发来的消息
fprintf(u3,'u1 receive data from u3');%同上
fscanf(u1)%同上
%--------------------尝试让u1发送消息,u2、u3接收消息-------------------------
u1.Remoteport=8849;%更改u1的远程端口为u2的本地端口,这样u2可以收到u1的消息
fprintf(u1,'u2 reveive data from u1');%u1向8849端口发送消息,即u2的本机端口
fscanf(u2)%u2接收到u1发来的消息
u1.Remoteport=8850;%更改u1的远程端口为u3的本地端口,这样u3可以收到u1的消息
fprintf(u1,'u3 reveive data from u1');%u1向8850端口发送消息,即u3的本机端口
fscanf(u3)%u3接收到u1发来的消息
%综上,可以理解为UDP的远程端口为发送消息的端口,本机端口为接收消息的端口
%当u1的远程端口对应u2的本地端口时,u2接收到u1的消息
fclose(u1);%关闭udp1连接
fclose(u2);%同上
fclose(u3);
delete(u1);%删除udp1连接,释放内存
delete(u2);%同上
delete(u3);
clear u1;%清除工作区中的udp1数据
clear u2;%同上
clear u3;
尝试运行这个Demo的时候,打开一个Matlab,直接在Matlab中创建一个脚本,将这段代码复制进去运行就可以了,运行结果如下:
通信成功!
2、多窗口实现
上面的Demo只使用了一个Matlab窗口,我们可以尝试同时打开两个Matlab窗口,使两个Matlab窗口之间进行通信,具体Demo代码如下:
第一个窗口:UDP1.m
fclose(instrfindall);%先关闭之前可能存在的UDP
%127.0.0.1即为本地
u1=udp('127.0.0.1','RemotePort',8847,'LocalPort',8848);
%u1的本机端口为8848,即监听所有发到8848端口的消息;
%u1的远程端口为8847,即若u1发送消息,则发送到8847端口,本机端口为8847的UDP便会受到u1的消息
u2=udp('127.0.0.1','RemotePort',8848,'LocalPort',8849);%同上
u3=udp('127.0.0.1','RemotePort',8848,'LocalPort',8850);%同上
u1.DatagramReceivedFcn = @instrcallback;%设置u1接收到数据包时,调用回调函数显示
fopen(u1);%打开udp连接
%fopen(u2);%这里不需要建立u2和u3的UDP连接
%fopen(u3);%
%--------------------u1发送消息-------------------------
u1.Remoteport=8849;
fprintf(u1,'u2 reveive data from u1');%u1发送消息给u2
u1.Remoteport=8850;
fprintf(u1,'u3 reveive data from u1');%u1发送消息给u3
%--------------------u1接收消息-------------------------
fscanf(u1)
fscanf(u1)
fclose(u1);%关闭udp1连接
delete(u1);%删除udp1连接,释放内存
clear u1;%清除工作区中的udp1数据
再另开一个matlab窗口(不是标签页),如图:
在第二个窗口中,新建脚本,输入程序UDP2.m:
fclose(instrfindall);%先关闭之前可能存在的UDP
u2=udp('127.0.0.1','RemotePort',8848,'LocalPort',8849);
u3=udp('127.0.0.1','RemotePort',8848,'LocalPort',8850);
u2.DatagramReceivedFcn = @instrcallback;%设置u2接收到数据包时,调用回调函数显示
u3.DatagramReceivedFcn = @instrcallback;%设置u3接收到数据包时,调用回调函数显示
fopen(u2);%建立u2、u3连接
fopen(u3);
%--------------------u2、u3接收消息-------------------------
fscanf(u2)
fscanf(u3)
%--------------------u2、u3发送消息-------------------------
fprintf(u2,'u1 reveive data from u2');%u2发送消息给u1
fprintf(u3,'u1 reveive data from u3');%u3发送消息给u1
fclose(u2);%关闭连接
fclose(u3);
delete(u2);%删除连接
delete(u3);
clear u2;
clear u3;
先运行UDP2,之后切换窗口运行UDP1,运行效果如下:
UDP1运行效果:
UDP2运行效果:
此时,两个Matlab窗口实现了通过UDP的跨窗口通信。
同样,可以使用网络调试助手之类的工具,这些工具一般也都带有UDP调试功能,可以配合Maltab进行调试来验证我们的想法。.
补充
若udp对象创建时,本地端口缺省,则自动创建本地端口,远程端口必须指定,如下:
u1=udp('127.0.0.1',8845);
%此时只有一个端口号,该端口默认是远程端口,对象生成时,自动确定一个本地端口号
如图为使用上述语句生成的UDP对象,可以看出,该UDP对象的本地端口为系统自动生成。
参考
https://blog.csdn.net/china_jeffery/article/details/78923428
https://blog.csdn.net/qq_18820125/article/details/90384741
版权声明:本文为CSDN博主「china_jeffery」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/china_jeffery/article/details/78923428
版权声明:本文为CSDN博主「怎么不去做机械」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_18820125/article/details/90384741