wxr
2024-12-02 ea0b1e8e5f43c5fd0a7d479e25ede3b8cbea464a
HDL_ON/DAL/DriverLayer/UdpSocket.cs
@@ -1,34 +1,36 @@
using 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>
      /// 当前的Socket是否运行
      /// </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>
        /// 当前的Socket是否运行
        /// </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
            {
            }
        }
    }
}