JLChen
2020-12-09 e87985ec1dcb69beedaf9f95e8e7aba14b7c08d6
HDL_ON/DAL/DriverLayer/UdpSocket.cs
New file
@@ -0,0 +1,191 @@
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;
      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, 6000));
                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>
      /// 当前的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
         {
            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 {
            }
      }
   }
}