UdpClient.cs 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. using LitJson;
  2. using System.Collections;
  3. //引入库
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. using UnityEngine;
  9. public class UdpClient : MonoBehaviour
  10. {
  11. public delegate void logMessagaeBarScanResultDelegat(string message);
  12. public static logMessagaeBarScanResultDelegat logMBSRD;
  13. public bool isOpen = true;
  14. public string viewpointId = "null";
  15. private static UdpClient instance;
  16. //以下默认都是私有的成员
  17. string AddressIP;//获取ip
  18. Socket socket; //目标socket
  19. EndPoint serverEnd; //服务端
  20. IPEndPoint ipEnd; //服务端端口
  21. IPEndPoint ipSocketEnd;//蓝牙服务端口
  22. IPEndPoint ipSocketPC; //点云服务端口
  23. IPEndPoint ipSocketPCTest;// 测试
  24. string recvStr; //接收的字符串
  25. string sendStr; //发送的字符串
  26. byte[] recvData = new byte[4096]; //接收的数据,必须为字节
  27. byte[] sendData = new byte[4096]; //发送的数据,必须为字节
  28. int recvLen; //接收的数据长度
  29. Thread connectThread; //连接线程
  30. private UdpClient()
  31. {
  32. }
  33. public static UdpClient Instance()
  34. {
  35. if (instance == null)
  36. instance = new UdpClient();
  37. return instance;
  38. }
  39. //初始化
  40. void InitSocket()
  41. {
  42. //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
  43. //ipSocketEnd = new IPEndPoint(IPAddress.Parse("192.168.140.123"), 9981);
  44. ipSocketPC = new IPEndPoint(IPAddress.Parse("192.168.3.66"), 9981);
  45. ipSocketEnd = new IPEndPoint(IPAddress.Parse("192.168.3.66"), 9981);
  46. ipSocketPCTest = new IPEndPoint(IPAddress.Parse("192.168.178.128"), 9981);
  47. ipEnd = new IPEndPoint(IPAddress.Parse(AddressIP), 9981);
  48. // ipEnd = new IPEndPoint(IPAddress.Parse("192.168.220.178"), 9981);
  49. //定义套接字类型,在主线程中定义
  50. socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
  51. socket.Bind(ipEnd);
  52. //定义服务端
  53. IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
  54. serverEnd = (EndPoint)sender;
  55. //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
  56. SocketSend("hello");
  57. //开启一个线程连接,必须的,否则主线程卡死
  58. connectThread = new Thread(new ThreadStart(SocketReceive));
  59. connectThread.Start();
  60. }
  61. void SocketSend(string sendStr)
  62. {
  63. //清空发送缓存
  64. sendData = new byte[4096];
  65. //数据类型转换
  66. sendData = Encoding.ASCII.GetBytes(sendStr);
  67. //发送给指定服务端
  68. socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipSocketEnd);
  69. // socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipSocketEnd);
  70. }
  71. void SocketSendPointCloud(string sendStr)
  72. {
  73. //清空发送缓存
  74. sendData = new byte[4096];
  75. //数据类型转换
  76. sendData = Encoding.ASCII.GetBytes(sendStr);
  77. //发送给指定服务端
  78. //Debug.Log(sendStr);
  79. socket.SendTo(sendData, ipSocketPC);
  80. socket.SendTo(sendData, ipSocketPCTest);
  81. }
  82. //服务器接收
  83. void SocketReceive()
  84. {
  85. //进入接收循环
  86. while (true)
  87. {
  88. //对data清零
  89. recvData = new byte[4096];
  90. //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
  91. recvLen = socket.ReceiveFrom(recvData, ref serverEnd);
  92. //Debug.LogError("message from: " + serverEnd.ToString()); //打印服务端信息
  93. //输出接收到的数据
  94. recvStr = Encoding.ASCII.GetString(recvData, 0, recvLen);
  95. TestJsonManage.result = recvStr.Trim();
  96. // TestUDP.result = recvStr.Trim();
  97. Debug.Log(TestJsonManage.state + " " + " " + logMBSRD);
  98. // 当前连接 只需要传输一次数据 传输完成后关闭
  99. }
  100. }
  101. //连接关闭
  102. void SocketQuit()
  103. {
  104. //关闭线程
  105. if (connectThread != null)
  106. {
  107. connectThread.Interrupt();
  108. connectThread.Abort();
  109. }
  110. //最后关闭socket
  111. if (socket != null)
  112. socket.Close();
  113. }
  114. // Use this for initialization
  115. void Start()
  116. {
  117. if (!isOpen) return;
  118. ///获取本地的IP地址
  119. for (int i = 0; i < Dns.GetHostEntry(Dns.GetHostName()).AddressList.Length; i++)
  120. {
  121. if (Dns.GetHostEntry(Dns.GetHostName()).AddressList[i].AddressFamily.ToString() == "InterNetwork")
  122. {
  123. AddressIP = Dns.GetHostEntry(Dns.GetHostName()).AddressList[i].ToString();
  124. }
  125. }
  126. InitSocket(); //在这里初始化
  127. SendIpToBluetooth();//发送targeId,端口号
  128. InvokeRepeating("SendIpToElectric", 0, 60f);
  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.Instance.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.Instance.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.Instance.SendSerialBy16();
  181. sendNet.viewpointId = pointId;
  182. sendNet.triggerTs = ts;
  183. string jsonData = JsonMapper.ToJson(sendNet);
  184. Debug.Log(jsonData);
  185. SocketSendPointCloud(jsonData);
  186. }
  187. //sn: '3ewqeq2e2qewe',
  188. //cmd: 'answer',
  189. //correct: 2,
  190. //incorrect: 1,
  191. /// <summary>
  192. /// 答题结束后向服务器发送结果信息
  193. /// </summary>
  194. /// <param name="infor"></param>
  195. public void SendIpTOQuestion(SendQuestionInfor infor)
  196. {
  197. if (!isOpen) return;
  198. string jsonData = JsonMapper.ToJson(infor);
  199. //Debug.Log("========================================="+jsonData);
  200. SocketSendPointCloud(jsonData);
  201. }
  202. /* 电量数据结构
  203. * sn: '3ewqeq2e2qewe'
  204. * cmd: 'showElectricity'
  205. * electricity: 20
  206. * status:""
  207. */
  208. /// <summary>
  209. /// 向服务器发送眼镜的剩余电量以及电池状态
  210. /// 在start函数中使用InvokeRepeating60秒调用一次
  211. /// </summary>
  212. public void SendIpToElectric()
  213. {
  214. if (!isOpen) return;
  215. int electricity = (int)((SystemInfo.batteryLevel) * 100f);
  216. BatteryStatus batterystate = SystemInfo.batteryStatus;
  217. string state = "";
  218. switch (batterystate)
  219. {
  220. case BatteryStatus.Unknown:
  221. state = "无法确定设备的电池状态";
  222. break;
  223. case BatteryStatus.Charging:
  224. state = "设备已插入并正在充电";
  225. break;
  226. case BatteryStatus.Discharging:
  227. state = "设备已拔出并放电";
  228. break;
  229. case BatteryStatus.NotCharging:
  230. state = "设备已插入,但无法充电";
  231. break;
  232. case BatteryStatus.Full:
  233. state = "设备已插入并且电池已充满";
  234. break;
  235. default:
  236. state = "无法确定设备的电池状态";
  237. break;
  238. }
  239. SendNetConnectElectricity sendNet = new SendNetConnectElectricity();
  240. sendNet.sn = DeviceSN.Instance.SendSerialBy16();
  241. sendNet.electricity = electricity;
  242. sendNet.status = state;
  243. string jsonData = JsonMapper.ToJson(sendNet);
  244. SocketSendPointCloud(jsonData);
  245. //SocketSend(jsonData);
  246. // Debug.Log("SendIpToElectric");
  247. }
  248. void OnApplicationQuit()
  249. {
  250. SocketQuit();
  251. }
  252. }