图像缩略图

简单的UDP通信应用程序

version 1.2.0.0 (2.89 KB) by 凯文·巴特利特
发送/接收UDP数据包使用Matlab的Java接口。

39下载

更新2010年3月29日

视图版本历史

查看许可协议

UDP包用于通过网络将数据从一台计算机发送到另一台计算机或在一台计算机内从一个应用程序发送到另一个。

judp。m程序使用Matlab的能力,调用Java代码,使其能够发送和/或接收UDP数据包。一个Matlab会话可以与另一个Matlab会话通信(在同一台机器上或通过网络),也可以与一个完全不同的程序通信(同样,在同一台机器上或通过网络)。

引用

凯文•巴特利特(2021)。简单的UDP通信应用程序(//www.tatmou.com/matlabcentral/fileexchange/24525-a-simple-udp-communications-application), MATLAB中央文件交换。检索

评论和评级(76

冈萨雷斯加里多

马特Fetterman

很好。我修改了它,使它返回socket。这样就可以以持久的方式使用它。如果有UDP数据发送,而我们不听,我们可以回来并得到这个数据。

约翰内斯·奥斯特勒

xiandaxiezaixiaoxie

温和的警察所

毛边Shoaib

非常感谢你的贡献。我唯一的评论是,您已经通过检查函数的第102行上的timeout <= 0来阻止UDP阻塞模式。如果您将其更改为timeout < 0,我们可以将timeout值设置为0,这意味着UDP可以无限等待数据包,这是我的应用程序的要求。

大卫尼尔

莎拉Ghayouraneh

你好,凯文。我有一个问题,我想知道你和你的代码可以帮我解决它。我试图将数据输入到一个设备,并将其导入到MATLAB中。我的笔记本电脑和设备连接到同一个网络。这个链接
http://tinypic.com/r/viitn6/9显示我得到UDP数据包,但我不知道如何得到数据到MATLAB。您知道您的代码是否可以处理这个问题吗?在这一点上我是非常守旧的。

非常感谢,
萨拉

Ricardo Rodriguez.

凯文·巴特利特

@Mehmet—我对Simulink的内部工作一无所知,所以我不能回答你关于使用judp的问题。金宝appm。不过,我要补充的是,您可能需要考虑使用jtcp。m(也在FileExchange上),而不是judp。我欢迎你的申请。TCP协议通常比UDP协议慢,但它具有内置的错误检查功能,以纠正丢失的数据包等。

你好,

我尝试了这个函数,发现数据传输速度比MATLAB的内置函数好很多。
我想知道我们是否可以在Simulink环境中使用此功能。金宝app

如果没有,您是否有实现高比特率而不是在Simulink中使用内置函数(块)的任何建议?金宝app我尝试了许多方法,包括外部模式中的Simulink Desktop实金宝app时数据包I / O块,但仍然无法达到所需的比特率。

再次感谢分享这个文件!

凯文·巴特利特

@Pranav——“帮助跳跃”会告诉你那个跳跃。M以int8格式发送和接收数据。不能直接发送十六进制数。

发送之前,将十进制转换为int8:
myHexNum = ' 84 ';
myInt8Num =定型(hex2dec (myHexNum),“int8”);
在另一端接收数据时,转换回小数,然后转到十六进制:
dec2hex(定型(myInt8Num,“双”))
==>'84',这是你开始的。

Pranav Thiagarajan

你好,

谢谢你的帮忙。我正在用它接收雷达的数据。在这个过程中,它将接收到的一些十六进制数转换为正的十进制数,而另一些则转换为负数。

如。0 x19变成25
0 x84变成-124

你知道为什么会这样吗?

再次感谢。

KdG

@Kevin Bartlett。啊,这是真的。不,它仍然必须是UDP。我会继续狩猎。但谢谢你的所有帮助。您的代码很容易理解和工作!

凯文·巴特利特

@kdg。我会承认我不是网络专家。但我可以告诉你,向固定IP发送消息不会使其TCP。UDP和TCP之间的区别是TCP是一种双向对话:发件人希望回到收到数据包的确认;如果没有确认回来,则发件人再次发送相同的数据包(又一次又一次地),直到它得到确认。UDP协议不涉及发送和接收确认 - UDP数据包刚刚投入到以太和遗忘。这使得TCP更可靠的两个协议,但也涉及大量的开销。因此,您可以将UDP数据包发送到固定的IP。您也可以通过调用“发送”两次或使用所谓的“广播”地址(我认为广播方法在为其他人减慢网络时具有一些缺点 - 它,您也可以发送给多个收件人可能不会让你非常受欢迎)。 Best of luck.

KdG

@Kevin Bartlett。没烦恼!谢谢你的快速回复,很有意义。我不太确定UDP是如何工作的。两个程序运行在同一台计算机上,但数据发送程序模拟发送消息到其他东西(与固定的ip,不确定这是否使它TCP?)。我想把它们也放到matlab中。也许这是不可能的。我没有它假装发送的其他程序,所以我也不确定他们是如何交流的。陡峭的学习曲线:)

凯文·巴特利特

@KdG,你不能直接跳。m从一个特定的地址接收——这不是UDP消息传递工作的方式。你能做的就是给它打电话。m with the [mssg,sourceHost] = judp('receive',…语法。然后,如果消息来自错误的源IP,您可以告诉程序忽略该消息。我不确定我完全理解了您的设置,但是如果您的两个程序都在同一台计算机上运行,使用计算机的实际IP地址而不是127.0.0.1“环回”地址是没有好处的。这有意义吗?

KdG

你好,

我只是把我的头围绕UDP的事情,所以道歉在什么可能是不可行的提前。我可以收到UDP数据包,从另一个程序,如果我使用127.0.0.1在其他程序,但如果我设置一个特定的IP地址不。有办法让我指挥跳跃吗。M从一个特定的IP地址接收?还是说它应该监听所有内容?

debayan ghosh.

zer044

凯文·巴特利特

@ inck - 如果您在尝试从其他某些程序接收数据包之前,您可能会在两个Matlab会话之间工作可能是最简单的。在Linux和(我相信)在Mac上,您可以在同一本地机器上运行两个Matlab会话;在Windows上,我认为您必须在单独的计算机上有两个会话。

完全按照你在“帮助跳跃”中看到的第一个例子。在一个会话中,输入:
MSSG = JAWP('接收',21566,10); CHAR(MSSG')

在第二个会话中(在1秒默认超时超时之前),输入:
Judp('发送',21566,'208.77.188.166',Int8('howdy!'))

确保端口21566在防火墙中打开并替换为“208.77.18888.166”的接收机器的IP地址(或者,如果MATLAB会话都在同一台计算机上,则可以使用“环回”地址:127.0.0.1)。

如果这不起作用,您可能有一些东西在您的网络阻塞UDP包,这是我不能帮助您。您可以尝试安装wireshark包嗅探应用程序,看看是否看到UDP包进入您的网络接口(或loopback接口,如果您正在使用该接口)。但是,请注意,在Windows(和mac ?)上,wireshark会在内置防火墙之前看到数据包,因此,仅仅因为您看到了在wireshark上到达的数据包,并不意味着它们到达了Matlab。

对不起,我不能更多地帮助。祝你好运。

尼克

你好:)我正在浏览代码,它看起来很恶心,尽管我有一些麻烦。

我需要在MATLAB中从unity接收数据(将动态发送数据的VR程序)

我首先只是想接收数据,但它不工作;

我尝试了udp。善有善报。

目标是得到统一发送0和1之间的数字(如:0.937262),并为matlab接收它。

两个程序都会在我的电脑上运行。

你能帮个忙吗,有什么好主意吗,谢谢

尼克

j

凯文·巴特利特

@Habib——这里的“服务器”是指发送udp数据包的应用程序,而“客户端”是指接收udp数据包的应用程序?

如果这是正确的,那么对话的Matlab端简单地是“judp('send',21566,'208.77.188.166',int8('Howdy!')”……同样,你必须用正确的端口号替换21566,用正确的IP地址替换'208.77.188.166'。

至于客户端(非matlab)方面的对话,我将无法帮助您——这将完全取决于您正在使用的应用程序。您可能需要确保指定的UDP端口在您的防火墙中是开放的(尽管如果您的客户端和服务器应用程序运行在同一台计算机上,这就不应该是必要的。

Habib Khan.

谢谢您的回复。我在服务器上有Matlab,但对于客户端,我使用的是另一个应用程序,这不是基于Matlab。在这种情况下我如何使用judp ?

凯文·巴特利特

@ habib - 如果您输入“帮助judp”,则应查看您可以运行的三个示例。在其中的第一个时,您键入“mssg = judp('接收',21566,10); char(mssg')”在一个matlab会话中,“judp('send',21566,'208.77.188.166',Int8('rowdy!'))“另一个(这假设您正在使用端口21566,并且接收计算机的IP为208.77.188.166,因此您必须为特定系统修改这些命令)。接收MATLAB会话现在应该在其包含“howdy”字中的工作区上称为“MSSG”的变量。

Habib Khan.

我已经下载了文件,但当我在Matlab中运行文件时,出现以下错误。

使用judp时出错(第50行)
输入参数不足。

显而易见,因为函数judp要求某些参数。
我该如何处理这个问题

拉斯•豪厄尔

问候,。我从下面回答了自己的问题。似乎,一夜之间,我心爱的Windows防火墙已经授权自己阻止UDP通信到Matlab。在Windows中纠正了这个错误后,“简单UDP通信应用程序”就可以正常工作了(就像他们在英国说的那样)。我给它五颗星:节奏好,容易跳舞!

拉斯•豪厄尔

我下载了judp.m文件,它的几天内完美无缺。昨天突然,我开始接受:“使用judp(第166行)错误”
“judp。m——接收UDP报文失败;连接超时”。

我看不出我改变了什么。这个judp函数位于一个脚本中,它在正常工作时并没有改变。什么好主意吗?

凯文·巴特利特

@Luca Gacy——通过(开放的)UDP端口21566将59的值发送到IP地址为208.77.188.166的计算机将通过以下行实现:

Judp('发送',21566,'208.77.188.166',INT8(59))

问题是Motion Composer是否将59表示为一个int8值作为一个ASCII字符。如果没有,最好使用jtcp。M,它使用起来更复杂,但不限于传输int8。

在kpb@uvic.ca上给我发电子邮件,如果您有其他问题。

Luca Gacy.

你好,我正在尝试建立Matlab和一个叫做Aerotech Motion Composer的程序之间的连接,以便通过Matlab而不是其本地环境来控制翻译表。我有连接设置在运动作曲家的一边,以接收一个59(;)的ASCII值。我不知道如何把这个ASCII值发送到另一个程序。我对Matlab有点新,所以我可以给你额外的信息,如果是必要的。提前感谢您的回复。

佩德罗Goncalves

工作非常好,更快,然后一个由Matlab实现

谢谢

Vinicius Goecks.

凯文·巴特利特

@bryan womack - 我现在远离工作,而无法访问matlab,我无法解决这个问题。

但是,我可以告诉您,“Who has…”消息不是由我的代码生成的。我代码的“SEND”部分由对Java程序的调用组成,这些调用对我来说几乎就是黑盒。也许其中一个正在生成这条消息?您可以尝试在我的代码中添加一些诊断“disp”或“键盘”调用,以查看它执行到什么程度,以及在什么阶段生成了“Who has”消息。例如,就在我的代码说“if action == SEND”之后,就在“addr = InetAddress.getByName(host);”之前插入字符串“keyboard”并再次运行程序。通过这种方式,您可以逐行执行SEND代码,并有希望找到问题。

布莱恩·沃马克

Sup Fam,

我正在尝试使用这个示例代码发送一个UDP数据包到一个运行lwIP的微控制器。我可以使用“接收”命令读取广播数据,但当我尝试使用“发送”命令时,它没有多大作用。

当我通过wireshark监视以太网端口时,我看到我的计算机发送了一个ARP,上面写着“谁有169.254.185.93?”告诉169.254.185.77”

在这个ARP中,以。93结尾的IP地址是微控制器,以。77结尾的IP地址是计算机。

难道就不能盲目地发送数据包吗?我打的电话是这样的:

judp(“169.254.185.93”“发送”,5555年,int8(“好神”))

澄清一下我看到的行为:

1)如上所述调用judp
2)检查wireshark
3)“谁有169.254.185.93 ?告诉169.254.185.77”

问候,
布莱恩

凯文·巴特利特

@ Joost - 我担心这只是UDP通讯的性质。如果您在网络或计算机处理的网络或计算机太快,则UDP协议会丢弃数据包。这使得UDP通信非常有弹性,但成本为“损失”。如果您真的需要每个数据包,您可以切换到使用TCP / IP协议(请参阅我的JTCP.M程序,也在文件交换中)。这里的危险是,如果它们过于快速,则TCP协议不会丢弃数据包,因此如果您的计算机无法跟上传入数据包,您的计算机可能会冻结。如果您能弄清楚减少发送的数据包数量的方法可能会更好。

Joost

嗨,凯文,
谢谢你的这个伟大的犹大贡献。
似乎何时何时需要接收彼此又一快速发送的多个消息时,邮件会丢失,导致超时。是否有一种方法可以在背景中“保持频道打开”并收到所有消息?
消息从同一台机器发送,因此速度非常快。
提前感谢您的回复。

凯文·巴特利特

嗨Verena,

如果您查看代码,您将看到该行:

包= DatagramPacket (0 (1 packetLength int8) packetLength);

这是对Java代码的调用,我从其他地方“借来”的,并且我没有完全理解(judp。m实际上只是这个Java代码的一个Matlab包装器)。

这个神秘的代码中嵌入了“int8”格式;我想您可以尝试将它更改为'int16'或其他什么,但作为一个Java程序员,我真的不知道这是否可行,或是否会导致其他问题。

凯文

Verena穆勒

你好,
我用LAN连接了两台PC,通过UDP包从一个发送。与另一个是我的matlab脚本 - 我收到了它的数据。它很好地工作(谢谢你这个judp功能!)。但是我现在已经存在的问题是,我正在将数据从C-Programm(整数16/32位)发送到MATLAB,它用于“消息输出”MSSG ANT8 DataTyp。所以我丢失了数据。如何将MSSG的类型更改为INT16或其他数据?
提前谢谢!

凯文·巴特利特

@Gus - 好消息!我逐渐学习它几乎总是是一种防火墙,这些情况是在这些情况下归咎于这些情况。简单地关闭防火墙是一个非常好的测试,看看是问题的源头。

格斯洛特

解决了。最近更新的McAfee互联网安全导致阻塞高UDP端口。它没有阻塞TCP端口。JUDP现在接收到正确的广播消息。谢谢你对防火墙的建议。

凯文·巴特利特

@Gus——是的,但是发送内容是发送到255.255.255.255,不是吗?你能换一下吗?

格斯洛特

不尝试发送-只在端口4992接收广播。
mssg = judp(“接收”,4992、266、3000);
它总是超时。

凯文·巴特利特

@Gus——从你的Wireshark截图(//www.tatmou.com/matlabcentral/answers/230698-judp-to-onitor-udp-broadcast.),它看起来像是你试图发送到特殊的广播地址,255.255.255.255 (https://en.wikipedia.org/wiki/broadcast_address.)。您是否尝试过发送到目标计算机的实际IP地址而不是广播地址?

格斯洛特

我删除了监听同一端口的DAX软件。移除后,我做了你建议的测试。
我开始Matlab会议1:
MSSG = JAWP('接收',4991,10,5000);char(mssg')
然后在MATLAB中执行session 2:
Judp('发送',4991,'127.0.0.1',Int8('howdy!'))
第一部分展示了:
ans =.
你好!
所以环回是工作的。
但是,WireShark仍然显示这台计算机正在接收我在问题中描述的4992端口数据包,但是仍然不能使用JUDP看到它。
mssg = judp(“接收”,4992、266、3000);char(mssg')
使用judp错误(第166行)
judp。m——接收UDP报文失败;连接超时。

凯文·巴特利特

@Gus——当你说“localhost工作没有问题”时,这是什么意思?这句话向我暗示,judp发送/接收工作只要你使用环回地址,但这似乎与你7月21日的第一个帖子相矛盾。请澄清。

格斯洛特

Localhost工作没有问题。我没有提交一个社区问题,为什么我没有看到UDP广播。看到的:
//www.tatmou.com/matlabcentral/answers/230698-judp-to-onitor-udp-broadcast.
会欣赏发现错误的帮助。

凯文·巴特利特

@ gus - 我认为bindexception意味着已经拍摄了您尝试使用的端口。听起来像你的“DAX”软件使用与judp相同的端口,这是一个巧合。您是否尝试过使用不同的端口号超过21566?它可以是1025和65535之间的任何整数,因此有很多可供选择。我想这仍然不会解释为什么你禁用了Dax的超时,但它可能值得尝试。

格斯洛特

谢谢凯文。你那绝妙的程序以前很管用。我回来了,遇到了问题。

发现产生给定错误的问题。当FlexRadio SmartSDR DAX.exe运行时,我得到“java.net.BindException. exe”。当我关闭它时,接收超时。

由于DAX软件被禁用,我听从了您的建议。在一个会议中开始:
mssg = judp(“接收”,21566年,5000);
然后在另一个会议中立即做到这一点:
judp('send',21566,'127.0.0.1',Int8('howdy!'))

在接收会话上获取此结果:
使用judp错误(第166行)
judp。m——接收UDP报文失败;连接超时。

将故障排除。所有其他软件在计算机上正确地会谈TCP和UDP。

凯文·巴特利特

@ gus - 我无法访问2015年版本的matlab,所以我无法真正解决您的问题。但是,我会说,从网络问题或防火墙设置的变化可能会出现相同的症状。一个好的测试是在同一台计算机上有两个MATLAB会话。使用一个会话使用127.0.0.1的“环回”IP地址发送UDP数据包。使用其他MATLAB会话接收数据包。因为通信是相同计算机的内部,所以这绕过了网络。我不确定这是否会有所作为,但你也可以尝试使用计算机的防火墙。

格斯洛特

MATLAB版本:8.5.0.197613(R2015A)
Java版本:Java 1.7.0_60-b19

在最新的Matlab或Java版本中有什么变化吗?这曾经是工作的,侦听端口4992的广播。

73 /格斯

>> [mssg,sourceHost] = jup('接收',4991,4096,5000)
使用judp错误(第166行)
judp。m——接收UDP报文失败。
Java错误信息如下:
Java异常发生:
java.net.bindexception:已使用的地址:不能绑定
java.net.DualStackPlainDatagramSocketImpl.socketBind(本机方法)
java.net.DualStackPlainDatagramSocketImpl.bind0(未知源)
java.net.AbstractPlainDatagramSocketImpl.bind(未知源)
java.net.DatagramSocket.bind(未知源)
在java.net.datagramsocket。(未知来源)
在java.net.datagramsocket。(未知来源)
在java.net.datagramsocket。(未知来源)

彼得

exosceleton

@Kevin Bartlett
这似乎是聪明的方式。谢谢

凯文·巴特利特

@ Exceleton - 我的猜测是Matlab的Java机器没有做好垃圾收集(我已经看到了Matlab的类似问题的Matlab的数据库游标对象)。因此,当您经历256个IP地址时,您正在创建256个Java套接字对象,并且它们堵塞了Matlab的分配的Java空间并减慢了计算机。作为解决方法,为什么不向网络的广播地址发送单个数据包(参见http://en.wikipedia.org/wiki/Broadcast_address) ?你应该能够在调用jupd.m时使用255.255.255.255。您网络上的所有机器都将接收UDP包,但只有您正在寻找的机器将知道如何响应您发送的特定UDP包。一旦“握手”完成,两台计算机将知道彼此的IP地址,您将不再需要使用广播地址。

exosceleton

如果我输入目的地的静态IP,我可以以快速的速率发送和接收(每秒多个周期)。

然而,当我在一个环路中改变ip地址,试图在DHCP环境中找到正确的设备ip时,周期时间迅速增加到每发送和接收命令数秒。

查找IP xxx.xxx.xxx的设备。1:255需要几分钟。

固定IP或多个IP目的地之间的处理时间变化有什么原因吗?

谢谢

manoj.

当我发送UDP包使用这个脚本,目的UDP端口号保持固定的一个在参数中传递,但源UDP端口号似乎是递增1每次我调用judp。有没有一种方法有一个固定的源UDP端口号以及?
提前谢谢。

keane gonzalez.

凯文·巴特利特

actionStr是一个输入参数,可以是字符串'send'或字符串'receive'。您是否尝试过遵循当您键入'help jump '时显示的示例?它们应该基本按原样工作,除了当您使用'send'时,您将必须提供目标的实际IP地址,并且在'send'和'receive'情况下,您将需要提供一个介于1025和65535之间的整数端口号。注意,指定的端口必须在接收机器的防火墙中打开。

亚当·布罗德赫斯特

关于脚本我如何定义actionStr输入参数?在启动和运行脚本时遇到一些麻烦。

提前致谢

Chacha

惊人的!此代码正是我需要在两台计算机之间快速发送小数据包,都是发送和接收。在一个小循环中使用测试代码我能够GT循环,平均约为10毫秒。我无法相信它,因为我测试的电脑相对较慢。

(P.S.我想给出代码5星,但网站的Java不起作用,所以它不会让我提交我的评分。)

凯文·巴特利特

@Victoria——actionStr是一个输入参数,可以是字符串'send'或'receive'。

维多利亚Emberle

什么是actionStr,因为它是未定义的matlab 2006a版本

凯文·巴特利特

抱歉,Gabriel,我不知道多播数据包与常规UDP数据包有何不同。你不能只是接收他们与judp()像一个常规的UDP包?

加布里埃尔

嗨,谢谢你的代码。你能提交一个支持多播的版本吗?金宝app我是一个新手用户在这东西,但真的需要在UDP多播包阅读。

海滨住宅

非常感谢您的分享。

凯文·巴特利特

@ Jawad - 如果在Matlab命令行的“帮助judp”中键入“帮助judp”,则应看到应该作为起点的三个简单示例。第三个例子最简单,因为它使用“localhost”作为UDP数据包的目标;这意味着您可以从同一台计算机(在单独的Matlab会话中)运行“接收”和“发送”judp命令。只需确保指定端口,21566在防火墙中打开。

jawad

任何一个人都可以指导我如何逐步运行此代码。

亚洲划线凯

嘿。一个伟大的计划。我有一个言论。如果函数有很多迭代,让我们在循环接收实时UDP-Packages中说套接字在每个呼叫中​​打开并关闭。这不是批评,我认为经验丰富的Matlab程序员将没有问题重新设计代码。顺便说一句,如果有人对我的问题有解决方案,我将非常感谢,因为我的matlab技能​​有限。

格瓦拉阿

你好,
在一位朋友提出建议后,我看到了你的“裘裘酱”,以解决使用MATLAB的图像获取的图像获取问题。
我想知道你的功能“跳”。我能完成这笔收购吗?
如果是,那我们怎么做呢?
提前谢谢你!

备注!
-我在matlab 2010a工作
- 使用的相机是“Teltonika - IP-Camera-H264,型号:Camera3G MVC200

凯文·巴特利特

@Rahul——judp。m真的不是那么复杂的程序,所以我怀疑它比来自仪器控制工具箱的等效命令慢。Mathworks的UDP/TCP通信程序的问题在于它们非常复杂——它们可能快速且高度灵活,但它们使用起来也非常复杂(它们也比judpm贵得多)。

负担

拉胡湖

它比没有内容控制工具箱命令UDP更快吗?

Tanyer艾伦

彼得Manley-Cooke

很好。这一切都是可行的,它为我提供了一个起点,我想做什么。

亚当贝克

要快速修复Ctrl-C问题,只需添加“socket.setReuseAddress(1)”

杰夫•巴顿

该实用程序完全按照宣传的方式执行,并且使用简单。(非常及时!它完美地遇到了我的需求。)

我注意到的唯一问题是,它(经常)不能很优雅地处理Ctrl-C中断……如果我Ctrl-C在调用judp()接收UDP消息在指定的端口,我不能再接收相同的端口。(在随后调用同一端口上的judp()时,我得到一个“cannot bind”错误。)除此之外,伟大的服从!

MATLAB版本兼容性
用R2009A创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!