From ea0b1e8e5f43c5fd0a7d479e25ede3b8cbea464a Mon Sep 17 00:00:00 2001 From: wxr <wxr@hdlchina.com.cn> Date: 星期一, 02 十二月 2024 17:17:19 +0800 Subject: [PATCH] tcp;可视对讲; --- HDL_ON/DAL/DriverLayer/UdpSocket.cs | 368 +++++++++++++++++++++++++++++---------------------- 1 files changed, 208 insertions(+), 160 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/UdpSocket.cs b/HDL_ON/DAL/DriverLayer/UdpSocket.cs index f0893ff..6b1178d 100644 --- a/HDL_ON/DAL/DriverLayer/UdpSocket.cs +++ b/HDL_ON/DAL/DriverLayer/UdpSocket.cs @@ -1,34 +1,36 @@ 锘縰sing System; using System.Net.Sockets; using System.Net; +using Newtonsoft.Json; +using System.Text; namespace HDL_ON.DriverLayer { - public class UdpSocket - { - static UdpSocket _busSocket; - public static UdpSocket _BusSocket + public class UdpSocket + { + static UdpSocket _busSocket; + public static UdpSocket _BusSocket { get { - if(_busSocket == null) + if (_busSocket == null) { - _busSocket = new UdpSocket(); + _busSocket = new UdpSocket(); } - return _busSocket; + return _busSocket; } } - //鏈湴Socket - private Socket busSocket; - public int Port = 0; - /// <summary> - /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳� - /// </summary> - public void Start (int port = 0) + //鏈湴Socket + private Socket busSocket; + public int Port = 0; + /// <summary> + /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳� + /// </summary> + public void Start(int port = 0) { - if (IsRunning) - { + if (IsRunning) + { if (port == Port) { return; @@ -38,158 +40,204 @@ busSocket.Close(); } } - if (port != 0) - Port = port; - if (Port == 0) - return; + if (port != 0) + Port = port; + if (Port == 0) + return; - busSocket = new Socket (AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); - busSocket.EnableBroadcast = true; - try { - busSocket.Bind(new IPEndPoint(IPAddress.Any, Port)); + try + { + busSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); + busSocket.EnableBroadcast = true; + } + catch (Exception ex) + { + MainPage.Log("Socket 寮傚父 : " + ex.Message); + } + try + { + busSocket.Bind(new IPEndPoint(IPAddress.Any, Port)); - busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.0.168.188"))); - } - catch{ + busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.0.168.188"))); + relinkCount = 0; + } + catch (Exception ex) + { + MainPage.Log($"udp port bind error : {ex.Message}"); + busSocket = null; return; } asyncBeginReceive(); - - MainPage.Log ($"udp port : {port}"); } - /// <summary> - /// 鍋滄Socket - /// </summary> - public void Stop() - { - if (!IsRunning) - { - return; - } - try - { - busSocket.Close(); - } - catch { } - busSocket = null; - MainPage.Log("Socket鍏抽棴"); - } - - /// <summary> - /// 褰撳墠鐨凷ocket鏄惁杩愯 - /// </summary> - public bool IsRunning - { - get - { - return null == busSocket ? false : true; - } - } - - /// <summary> - /// 寮�濮嬪紓姝ユ帴鏀舵暟鎹� - /// </summary> - private void asyncBeginReceive() - { - if (!IsRunning) - { - return; - } - - try { - Packet packet = new Packet (); - busSocket.BeginReceiveFrom (packet.Bytes, 0, packet.Bytes.Length, SocketFlags.None, ref packet.RemoteEndPoint, new AsyncCallback (asyncEndReceive), packet); - } - catch (Exception e) { - System.Threading.Thread.Sleep (1); - asyncBeginReceive (); - Console.WriteLine($"asyncBeginReceive {e.Message}"); - } - } - - /// <summary> - /// 寮傛鎺ユ敹鏁版嵁缁撴潫 - /// </summary> - /// <param name="iar"></param> - private void asyncEndReceive(IAsyncResult iar) - { - if (!IsRunning) - { - return; - } - try - { - if (busSocket == null) - { - return; - } - asyncBeginReceive(); - Packet packet = (Packet)iar.AsyncState; - int len = busSocket.EndReceiveFrom(iar, ref packet.RemoteEndPoint); - - byte[] bytes = packet.Bytes; - packet.Bytes = new byte[len]; - Array.Copy(bytes, 0, packet.Bytes, 0, packet.Bytes.Length); - - //MainPage.Log($"鎺ユ敹{packet.RemoteEndPoint}鏁版嵁"); - //mqtt杩炴帴鏁版嵁璇诲彇 A鍗忚缃戠粶璁惧淇℃伅璇诲彇鍥炲 澶勭悊 - if (((IPEndPoint)packet.RemoteEndPoint).Port == 8585) - { - MainPage.Log($"灞�鍩熺綉udp淇℃伅"); - Control.Ins.ConvertReceiveData(bytes, ((IPEndPoint)packet.RemoteEndPoint).Address.ToString()); - } - else if (((IPEndPoint)packet.RemoteEndPoint).Port == 6000)//澶勭悊bus 6000绔彛鐨勬暟鎹� - { - packet.Manager(); - } - - } - catch (Exception ex) - { - MainPage.Log($"寮傛鎺ユ敹鏁版嵁缁撴潫 {ex.Message},{((Packet)iar.AsyncState).Bytes}"); - } - } - - /// <summary> - /// 寮傛鍙戦�佹暟鎹� - /// </summary> - /// <param name="tempPacket"></param> - public void AsyncBeginSend(Packet tempPacket) - { - try - { - if (!IsRunning) - { - tempPacket.HaveSendCount++; - return; - } - tempPacket.FlagDateTime = System.DateTime.Now; - tempPacket.HaveSendCount++; - busSocket.BeginSendTo(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndSend), tempPacket); - } - catch (Exception ex) - { - MainPage.Log($"AsyncBeginSend error {ex.Message}"); - } - } - - /// <summary> - /// 寮傛鍙戦�佹暟鎹粨鏉� - /// </summary> - /// <param name="iar"></param> - private void asyncEndSend(IAsyncResult iar) - { - Packet tempUDPPacketBuffer = (Packet)iar.AsyncState; - try - { - int bytesSent = busSocket.EndSendTo(iar); - } - catch { - + /// <summary> + /// 鍋滄Socket + /// </summary> + public void Stop() + { + if (busSocket == null) + { + return; } - } - } + if (!IsRunning) + { + return; + } + try + { + busSocket.Close(); + relinkCount = 0; + } + catch { } + busSocket = null; + MainPage.Log("Socket鍏抽棴"); + } + + /// <summary> + /// 褰撳墠鐨凷ocket鏄惁杩愯 + /// </summary> + public bool IsRunning + { + get + { + return null == busSocket ? false : true; + } + } + + /// <summary> + /// 寮�濮嬪紓姝ユ帴鏀舵暟鎹� + /// </summary> + private void asyncBeginReceive() + { + if (!IsRunning) + { + return; + } + if (busSocket == null) + { + return; + } + + try + { + Packet packet = new Packet(); + busSocket.BeginReceiveFrom(packet.Bytes, 0, packet.Bytes.Length, SocketFlags.None, ref packet.RemoteEndPoint, new AsyncCallback(asyncEndReceive), packet); + } + catch (Exception e) + { + System.Threading.Thread.Sleep(1); + Console.WriteLine("asyncBeginReceive " + relinkCount); + if (relinkCount == 0) + { + relinkCount = 1; + asyncBeginReceive(); + } + Console.WriteLine($"asyncBeginReceive {e.Message}"); + } + } + /// <summary> + /// 閲嶈繛娆℃暟 + /// </summary> + private int relinkCount = 0; + + /// <summary> + /// 寮傛鎺ユ敹鏁版嵁缁撴潫 + /// </summary> + /// <param name="iar"></param> + private void asyncEndReceive(IAsyncResult iar) + { + if (!IsRunning) + { + return; + } + try + { + if (busSocket == null) + { + return; + } + asyncBeginReceive(); + Packet packet = (Packet)iar.AsyncState; + int len = busSocket.EndReceiveFrom(iar, ref packet.RemoteEndPoint); + + byte[] bytes = packet.Bytes; + packet.Bytes = new byte[len]; + Array.Copy(bytes, 0, packet.Bytes, 0, packet.Bytes.Length); + + //mqtt杩炴帴鏁版嵁璇诲彇 A鍗忚缃戠粶璁惧淇℃伅璇诲彇鍥炲 澶勭悊 + if (((IPEndPoint)packet.RemoteEndPoint).Port == 8585) + { + var receiveString = Encoding.UTF8.GetString(bytes); + var res = receiveString.Split("\r\n\r\n"); + string topic = ""; + if (res.Length == 2) + { + var topics = res[0].Split("\r\n"); + //MainPage.Log(res[1]); + foreach (var ts in topics) + { + var key = ts.Split(":"); + switch (key[0]) + { + case "Topic": + topic = key[1]; + break; + } + } + Control.Ins.ConvertReceiveData(bytes, ((IPEndPoint)packet.RemoteEndPoint).Address.ToString()); + } + else if (((IPEndPoint)packet.RemoteEndPoint).Port == 6000)//澶勭悊bus 6000绔彛鐨勬暟鎹� + { + packet.Manager(); + } + } + } + catch (Exception ex) + { + MainPage.Log($"寮傛鎺ユ敹鏁版嵁缁撴潫 {ex.Message},{((Packet)iar.AsyncState).Bytes}"); + } + } + + /// <summary> + /// 寮傛鍙戦�佹暟鎹� + /// </summary> + /// <param name="tempPacket"></param> + public void AsyncBeginSend(Packet tempPacket) + { + try + { + if (!IsRunning) + { + tempPacket.HaveSendCount++; + return; + } + tempPacket.FlagDateTime = System.DateTime.Now; + tempPacket.HaveSendCount++; + busSocket.BeginSendTo(tempPacket.Bytes, 0, tempPacket.Bytes.Length, SocketFlags.None, tempPacket.RemoteEndPoint, new AsyncCallback(asyncEndSend), tempPacket); + } + catch (Exception ex) + { + MainPage.Log($"AsyncBeginSend error {ex.Message}"); + } + } + + /// <summary> + /// 寮傛鍙戦�佹暟鎹粨鏉� + /// </summary> + /// <param name="iar"></param> + private void asyncEndSend(IAsyncResult iar) + { + Packet tempUDPPacketBuffer = (Packet)iar.AsyncState; + try + { + int bytesSent = busSocket.EndSendTo(iar); + } + catch + { + + } + } + } } \ No newline at end of file -- Gitblit v1.8.0