From 43b0d5870d528f23ecd6aeceb6cfd4325188b46f Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期四, 01 七月 2021 15:50:43 +0800 Subject: [PATCH] Revert "1" --- HDL_ON/DAL/DriverLayer/UdpSocket.cs | 190 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 190 insertions(+), 0 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/UdpSocket.cs b/HDL_ON/DAL/DriverLayer/UdpSocket.cs new file mode 100644 index 0000000..4946986 --- /dev/null +++ b/HDL_ON/DAL/DriverLayer/UdpSocket.cs @@ -0,0 +1,190 @@ +锘縰sing System; +using System.Net.Sockets; +using System.Net; + +namespace HDL_ON.DriverLayer +{ + public class UdpSocket + { + static UdpSocket _busSocket; + public static UdpSocket _BusSocket + { + get + { + if(_busSocket == null) + { + _busSocket = new UdpSocket(); + } + return _busSocket; + } + } + + //鏈湴Socket + private Socket busSocket; + public int Port = 0; + /// <summary> + /// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳� + /// </summary> + public void Start (int port = 0) + { + if (IsRunning) + { + if (port == Port) + { + return; + } + else + { + busSocket.Close(); + } + } + 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)); + + busSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(IPAddress.Parse("239.0.168.188"))); + } + catch{ + 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 + { + 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) + { + Control.Ins.ConvertReceiveData(bytes); + } + 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