UdpClient.cs 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. using LitJson;
  2. //引入库
  3. using System.Net;
  4. using System.Net.Sockets;
  5. using System.Text;
  6. using System.Threading;
  7. using UnityEngine;
  8. public class UdpClient : MonoBehaviour
  9. {
  10. public delegate void logMessagaeBarScanResultDelegat(string message);
  11. public static logMessagaeBarScanResultDelegat logMBSRD;
  12. public bool isOpen = true;
  13. public string viewpointId = "null";
  14. private static UdpClient instance;
  15. private UdpClient()
  16. {
  17. }
  18. public static UdpClient Instance()
  19. {
  20. if (instance == null)
  21. instance = new UdpClient();
  22. return instance;
  23. }
  24. //以下默认都是私有的成员
  25. string AddressIP;//获取ip
  26. Socket socket; //目标socket
  27. EndPoint serverEnd; //服务端
  28. IPEndPoint ipEnd; //服务端端口
  29. IPEndPoint ipSocketEnd;//蓝牙服务端口
  30. IPEndPoint ipSocketPC; //点云服务端口
  31. IPEndPoint ipSocketPCTest;// 测试
  32. string recvStr; //接收的字符串
  33. string sendStr; //发送的字符串
  34. byte[] recvData = new byte[4096]; //接收的数据,必须为字节
  35. byte[] sendData = new byte[4096]; //发送的数据,必须为字节
  36. int recvLen; //接收的数据长度
  37. Thread connectThread; //连接线程
  38. //初始化
  39. void InitSocket()
  40. {
  41. //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
  42. // ipSocketEnd = new IPEndPoint(IPAddress.Parse("192.168.140.123"), 9981);
  43. ipSocketPC = new IPEndPoint(IPAddress.Parse("192.168.3.66"), 9981);
  44. ipSocketEnd = new IPEndPoint(IPAddress.Parse("192.168.3.66"), 9981);
  45. ipSocketPCTest = new IPEndPoint(IPAddress.Parse("192.168.140.123"), 9981);
  46. ipEnd = new IPEndPoint(IPAddress.Parse(AddressIP), 9981);
  47. // ipEnd = new IPEndPoint(IPAddress.Parse("192.168.220.178"), 9981);
  48. //定义套接字类型,在主线程中定义
  49. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  50. socket.Bind(ipEnd);
  51. //定义服务端
  52. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
  53. serverEnd = (EndPoint)sender;
  54. //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
  55. SocketSend("hello");
  56. //开启一个线程连接,必须的,否则主线程卡死
  57. connectThread = new Thread(new ThreadStart(SocketReceive));
  58. connectThread.Start();
  59. }
  60. void SocketSend(string sendStr)
  61. {
  62. //清空发送缓存
  63. sendData = new byte[4096];
  64. //数据类型转换
  65. sendData = Encoding.ASCII.GetBytes(sendStr);
  66. //发送给指定服务端
  67. socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipSocketEnd);
  68. }
  69. void SocketSendPointCloud(string sendStr)
  70. {
  71. //清空发送缓存
  72. sendData = new byte[4096];
  73. //数据类型转换
  74. sendData = Encoding.ASCII.GetBytes(sendStr);
  75. //发送给指定服务端
  76. socket.SendTo(sendData , ipSocketPC);
  77. socket.SendTo(sendData, ipSocketPCTest);
  78. }
  79. //服务器接收
  80. void SocketReceive()
  81. {
  82. //进入接收循环
  83. while (true)
  84. {
  85. //对data清零
  86. recvData = new byte[4096];
  87. // Debug.Log("1111111111111");
  88. //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
  89. recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
  90. // Debug.Log("22222222222222" + recvLen);
  91. //Debug.LogError("message from: " + serverEnd.ToString()); //打印服务端信息
  92. //输出接收到的数据
  93. recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
  94. //print(recvStr+"消息");
  95. // Debug.Log(recvStr + "Idear");
  96. // TestJsonManage.state = true;
  97. TestJsonManage.result = recvStr.Trim();
  98. Debug.Log(TestJsonManage.state + " " +" "+ logMBSRD);
  99. // 当前连接 只需要传输一次数据 传输完成后关闭
  100. }
  101. }
  102. //连接关闭
  103. void SocketQuit()
  104. {
  105. //关闭线程
  106. if (connectThread != null)
  107. {
  108. connectThread.Interrupt();
  109. connectThread.Abort();
  110. }
  111. //最后关闭socket
  112. if (socket != null)
  113. socket.Close();
  114. }
  115. // Use this for initialization
  116. void Start()
  117. {
  118. if (!isOpen) return;
  119. ///获取本地的IP地址
  120. for (int i = 0; i < Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length; i++)
  121. {
  122. if (Dns.GetHostEntry(Dns.GetHostName()).AddressList[i].AddressFamily.ToString() == "InterNetwork")
  123. {
  124. AddressIP = Dns.GetHostEntry(Dns.GetHostName()).AddressList[i].ToString();
  125. }
  126. }
  127. InitSocket(); //在这里初始化
  128. SendIpToBluetooth();//发送targeId,端口号
  129. }
  130. // Update is called once per frame
  131. void Update()
  132. {
  133. }
  134. public void SendIpToBluetooth()
  135. {
  136. SendNetConnectProtocol sendNet = new SendNetConnectProtocol();
  137. sendNet.Tagid = DeviceSN.GetInstance().SendSerialBy16();
  138. sendNet.Port = 9981;
  139. string jsonData = JsonMapper.ToJson(sendNet);
  140. Debug.Log(jsonData);
  141. SocketSend(jsonData);
  142. }
  143. //reporter: '606bee3edfda85745b71348d',
  144. //sn: '3ewqeq2e2qewe',
  145. //cmd: 'insertPositionRecord',
  146. //positionTs: '1617690133',
  147. //project: '6067d03db492a38dfe6e2265',
  148. //position: '{"x":1.3,"y":3.3,"z":1.2}',
  149. //positionType: 'PointCloud',
  150. public void SendIpToPointCloud(Vector3 pos, string PointionTs)
  151. {
  152. if (!isOpen) return;
  153. SendNetConnectPointCloud sendNet = new SendNetConnectPointCloud();
  154. sendNet.reporter = "606bee3edfda85745b71348d";
  155. sendNet.sn = DeviceSN.GetInstance().SendSerialBy16();
  156. sendNet.cmd = "insertPositionRecord";
  157. sendNet.positionTs = PointionTs;
  158. sendNet.project = "6067d03db492a38dfe6e2265";
  159. sendNet.position.x = pos.x;
  160. sendNet.position.y = pos.y;
  161. sendNet.position.z = pos.z;
  162. sendNet.positionType = "PointCloud";
  163. //sendNet.viewpointId = viewpointId;
  164. //viewpointId = "null";
  165. string jsonData = JsonMapper.ToJson(sendNet);
  166. // Debug.Log(jsonData);
  167. SocketSendPointCloud(jsonData);
  168. }
  169. //projectId:"<uuid>",
  170. //sn:"<string>",
  171. //cmdType:"increasePointTrigger",
  172. //viewpointId:"<uuid>",
  173. //triggerTs:<int64>
  174. //
  175. public void SendIpToPointTrigger( string pointId , long ts)
  176. {
  177. if (!isOpen) return;
  178. SendNetConnectPointTrigger sendNet = new SendNetConnectPointTrigger();
  179. sendNet.projectId = "606bee3edfda85745b71348d";
  180. sendNet.sn = DeviceSN.GetInstance().SendSerialBy16();
  181. sendNet.viewpointId = pointId;
  182. sendNet.triggerTs = ts;
  183. string jsonData = JsonMapper.ToJson(sendNet);
  184. Debug.Log(jsonData);
  185. SocketSendPointCloud(jsonData);
  186. }
  187. void OnApplicationQuit()
  188. {
  189. SocketQuit();
  190. }
  191. }