首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

【Matlab/Unity】UDP通信在Matlab/Unity中的应用

  • 23-09-25 13:22
  • 2570
  • 8171
blog.csdn.net

在进行Matlab和unity联合仿真工作时候,我们需要在二者之间进行数据交互。这里我们介绍如何使用Matlab通过UDP协议向unity发送数据。

Matlab发送端代码

  1. u1=udp('10.1.1.198','RemotePort',8849,'LocalPort',55000);% 设置要把数据发送
  2. 到的IP地址和端口
  3. fopen(u1); % 打开端口
  4. a=1234.56; % 一次发送6个数据示例
  5. b=9654.78;
  6. c=6677.32;
  7. d=7831.21;
  8. e=2564.89;
  9. f=4638.54;
  10. string =num2str([a,b,c,d,e,f]);% 把数据格式更改为字符串
  11. fwrite(u1, string);% 把数据写入端口
  12. disp("string="+string);% 命令窗口显示发送数据格式
  13. fclose(u1);% 关闭端口
  14. delete(u1);% 删除端口
  15. clear u1;% 清理缓存

Unity接收端代码

这段代码是从网上找可以直接通用的,我增加了字符串数据分割提取和格式转换部分,用的时候主要根据需要设置下数据接收的IP端口,以及根据接收数据内容进行提取赋值等。

  1. using System.Collections.Generic;
  2. using System.Net;
  3. using System.Net.Sockets;
  4. using System.Text;
  5. using System.Threading;
  6. using UnityEngine;
  7. using System;
  8. using System.Text.RegularExpressions;
  9. using UnityEngine.UI;
  10. public class UDPClient: MonoBehaviour
  11. {
  12. ///
  13. /// 获取当前毫秒
  14. ///
  15. ///
  16. public static double CurrentMilliseconds
  17. {
  18. get
  19. {
  20. DateTime dt = DateTime.Parse("01/01/1970");
  21. TimeSpan ts = DateTime.Now - dt;
  22. return ts.TotalMilliseconds;
  23. }
  24. }
  25. //以下默认都是私有的成员
  26. //Socket socketSend; //发送socket
  27. UdpClient socketSend;
  28. IPEndPoint ipSend; //客户端端口
  29. Socket socketReceive; //接收socket
  30. IPEndPoint ipReceive; //服务端端口
  31. List clientEnds; //客户端
  32. string recvStr; //接收的字符串
  33. string sendStr; //发送的字符串
  34. byte[] recvData = new byte[1024]; //接收的数据,必须为字节
  35. byte[] sendData = new byte[1024]; //发送的数据,必须为字节
  36. int recvLen; //接收的数据长度
  37. Thread connectThread; //连接线程
  38. //输入框
  39. public InputField thisField;
  40. private Rect m_fps, m_dtime;
  41. private GUIStyle m_style = new GUIStyle();//GUI界面
  42. //初始化
  43. void InitSocket()
  44. {
  45. //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
  46. ipSend = new IPEndPoint(IPAddress.Parse("127.0.0.1"),8848);
  47. //ipSend = new IPEndPoint(IPAddress.Parse("192.168.1.200"),50000);
  48. //定义套接字类型,在主线程中定义
  49. socketSend = new UdpClient();
  50. //定义服务端
  51. //定义侦听端口,侦听任何IP
  52. ipReceive = new IPEndPoint(IPAddress.Any, 8849);
  53. //定义套接字类型,在主线程中定义
  54. socketReceive = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  55. //服务端需要绑定ip
  56. socketReceive.Bind(ipReceive);
  57. //定义客户端
  58. IPEndPoint senderReceive = new IPEndPoint(IPAddress.Any, 8849);
  59. clientEnds = new List();
  60. //开启一个线程连接,必须的,否则主线程卡死
  61. connectThread = new Thread(new ThreadStart(SocketReceive));
  62. connectThread.Start();
  63. }
  64. ///
  65. /// UDP发送数据基本方法
  66. ///
  67. ///
  68. void SocketSend(string sendStr)
  69. {
  70. //清空发送缓存
  71. sendData = new byte[1024];
  72. //数据类型转换
  73. sendData = Encoding.UTF8.GetBytes(sendStr);
  74. //发送给所有服务端
  75. socketSend.Send(sendData, sendData.Length, ipSend);
  76. }
  77. ///
  78. /// 发送数据
  79. ///
  80. public void ToSendString()
  81. {
  82. if (thisField.text != "")
  83. {
  84. SocketSend(thisField.text);
  85. }
  86. }
  87. //服务器接收
  88. void SocketReceive()
  89. {
  90. //进入接收循环
  91. while (true)
  92. {
  93. //对data清零
  94. recvData = new byte[1024];
  95. //获取客户端,获取客户端数据,用引用给客户端赋值
  96. EndPoint clientEnd = new IPEndPoint(IPAddress.Any, 8849);
  97. recvLen = socketReceive.ReceiveFrom(recvData, ref clientEnd);
  98. clientEnds.Add(clientEnd);
  99. //print("message from: " + clientEnd.ToString()); //打印客户端信息
  100. //输出接收到的数据
  101. recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
  102. string[] recvStrArray = Regex.Split(recvStr, "\s+", RegexOptions.IgnoreCase);
  103. string str_x = recvStrArray[0];
  104. string str_y = recvStrArray[1];
  105. string str_z = recvStrArray[2];
  106. string str_yaw = recvStrArray[3];
  107. string str_rotateX = recvStrArray[4];
  108. string str_rotateZ = recvStrArray[5];
  109. float _x = float.Parse(str_x);
  110. float _y = float.Parse(str_y);
  111. float _z = float.Parse(str_z);
  112. float _yaw = float.Parse(str_yaw);
  113. float _rotateX = float.Parse(str_rotateX);
  114. float _rotateZ = float.Parse(str_rotateZ);
  115. Vector3 _tempPosition = new Vector3(_x, _y, _z); //此处将接收到的位置信息赋予_tempPosition
  116. VehicleTransInfo.currentTime = CurrentMilliseconds;
  117. VehicleTransInfo.currentTargetPosition = _tempPosition;
  118. VehicleTransInfo.rotation_x = _yaw / Mathf.PI * 180f;
  119. VehicleTransInfo.rotation_y = _rotateX / Mathf.PI * 180f;
  120. VehicleTransInfo.rotation_z = _rotateZ / Mathf.PI * 180f;
  121. }
  122. }
  123. //连接关闭
  124. void SocketQuit()
  125. {
  126. //关闭线程
  127. if (connectThread != null)
  128. {
  129. connectThread.Interrupt();
  130. connectThread.Abort();
  131. }
  132. //最后关闭socket
  133. if (socketReceive != null)
  134. socketReceive.Close();
  135. if (socketSend != null)
  136. socketSend.Close();
  137. }
  138. // Use this for initialization
  139. void Start()
  140. {
  141. InitSocket(); //在这里初始化
  142. m_dtime = new Rect(0, 100, 100, 100);
  143. m_style.fontSize = 30;
  144. m_style.normal.textColor = Color.white;
  145. }
  146. void OnApplicationQuit()
  147. {
  148. SocketQuit();
  149. }
  150. void Update()
  151. {
  152. if (Input.GetKey(KeyCode.W))
  153. {
  154. connectThread.Start();
  155. }
  156. }
  157. void OnGUI()
  158. {
  159. GUI.Label(m_dtime, "位置: " + recvStr, m_style);//帧数显示函数
  160. }
  161. public static string MidStrEx_New(string sourse, string startstr, string endstr)
  162. {
  163. Regex rg = new Regex("(?<=(" + startstr + "))[.\s\S]*?(?=(" + endstr + "))", RegexOptions.Multiline | RegexOptions.Singleline);
  164. return rg.Match(sourse).Value;
  165. }
  166. }

文章知识点与官方知识档案匹配,可进一步学习相关知识
网络技能树跨区域网络的通信学习网络层的作用37790 人正在系统学习中
注:本文转载自blog.csdn.net的废柴也能烧的文章"https://blog.csdn.net/huowanli/article/details/122415545"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top