using 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; /// /// 启动Socket接收和发送功能 /// 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}"); } /// /// 停止Socket /// public void Stop() { if (!IsRunning) { return; } try { busSocket.Close(); } catch { } busSocket = null; MainPage.Log("Socket关闭"); } /// /// 当前的Socket是否运行 /// public bool IsRunning { get { return null == busSocket ? false : true; } } /// /// 开始异步接收数据 /// 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}"); } } /// /// 异步接收数据结束 /// /// 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, ((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}"); } } /// /// 异步发送数据 /// /// 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}"); } } /// /// 异步发送数据结束 /// /// private void asyncEndSend(IAsyncResult iar) { Packet tempUDPPacketBuffer = (Packet)iar.AsyncState; try { int bytesSent = busSocket.EndSendTo(iar); } catch { } } } }