From ea0b1e8e5f43c5fd0a7d479e25ede3b8cbea464a Mon Sep 17 00:00:00 2001
From: wxr <wxr@hdlchina.com.cn>
Date: 星期一, 02 十二月 2024 17:17:19 +0800
Subject: [PATCH] tcp;可视对讲;

---
 HDL_ON/DAL/DriverLayer/UdpSocket.cs |  368 +++++++++++++++++++++++++++++----------------------
 1 files changed, 208 insertions(+), 160 deletions(-)

diff --git a/HDL_ON/DAL/DriverLayer/UdpSocket.cs b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
index f0893ff..6b1178d 100644
--- a/HDL_ON/DAL/DriverLayer/UdpSocket.cs
+++ b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
@@ -1,34 +1,36 @@
 锘縰sing 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>
-		/// 褰撳墠鐨凷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
-			{
-				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>
+        /// 褰撳墠鐨凷ocket鏄惁杩愯
+        /// </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
+            {
+
+            }
+        }
+    }
 }
\ No newline at end of file

--
Gitblit v1.8.0