//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"))); // relinkCount = 0; // } // catch (Exception ex){ // MainPage.Log ($"udp port bind error : {ex.Message}"); // busSocket = null; // return; // } // asyncBeginReceive(); // MainPage.Log ($"udp port : {port}"); // } // /// // /// 停止Socket // /// // public void Stop() // { // if(busSocket == null) // { // return; // } // if (!IsRunning) // { // return; // } // try // { // busSocket.Close(); // relinkCount = 0; // } // catch { } // busSocket = null; // MainPage.Log("Socket关闭"); // } // /// // /// 当前的Socket是否运行 // /// // public bool IsRunning // { // get // { // return null == busSocket ? false : true; // } // } // /// // /// 开始异步接收数据 // /// // 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}"); // } // } // /// // /// 重连次数 // /// // private int relinkCount = 0; // /// // /// 异步接收数据结束 // /// // /// // 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) // { // 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 { // } // } // } //} 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"))); relinkCount = 0; } catch (Exception ex) { MainPage.Log($"udp port bind error : {ex.Message}"); busSocket = null; return; } asyncBeginReceive(); MainPage.Log($"udp port : {port}"); } /// /// 停止Socket /// public void Stop() { if (busSocket == null) { return; } if (!IsRunning) { return; } try { busSocket.Close(); relinkCount = 0; } catch { } busSocket = null; MainPage.Log("Socket关闭"); } /// /// 当前的Socket是否运行 /// public bool IsRunning { get { return null == busSocket ? false : true; } } byte []receiveBytes = new byte[2000]; /// /// 开始异步接收数据 /// private void asyncBeginReceive() { if (!IsRunning) { return; } if (busSocket == null) { return; } try { int len = busSocket.Receive(receiveBytes, SocketFlags.None); Packet packet = new Packet(len); System.Array.Copy(receiveBytes, packet.Bytes, len); packet.Manager(); } catch (Exception e) { System.Threading.Thread.Sleep(1); Console.WriteLine("asyncBeginReceive " + relinkCount); if (relinkCount == 0) { relinkCount = 1; asyncBeginReceive(); } Console.WriteLine($"asyncBeginReceive {e.Message}"); } } /// /// 重连次数 /// private int relinkCount = 0; /// /// 异步接收数据结束 /// /// 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) { 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 { } } } }