From 488cf7d591dc7400ed5c7f116af7005396c666e2 Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期三, 03 一月 2024 17:12:17 +0800
Subject: [PATCH] Merge branch 'wjc' into Dev-Branch-2024

---
 HDL_ON/DAL/DriverLayer/UdpSocket.cs                               |  326 ++++++++++++++++--
 HDL_ON/Entity/Function/Function.cs                                |    2 
 HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs                          |  453 ++++++++++++++++++++++++++
 HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs    |  139 +++++--
 HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs |   17 
 HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs                  |    2 
 HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs                |   11 
 HDL_ON/DAL/Server/HttpServerRequest.cs                            |    4 
 HDL_ON/DAL/DriverLayer/Packet.cs                                  |   18 
 HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs    |   13 
 10 files changed, 865 insertions(+), 120 deletions(-)

diff --git a/HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs b/HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs
new file mode 100644
index 0000000..097344b
--- /dev/null
+++ b/HDL_ON/DAL/DriverLayer/AsyncUdpServer.cs
@@ -0,0 +1,453 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Net;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading.Tasks;
+ 
+namespace HDL_ON.DAL.DriverLayer
+{
+    //class AsyncUdpServer
+    /// <summary>
+    /// UdpClient 瀹炵幇寮傛UDP鏈嶅姟鍣�
+    /// </summary>
+    public class AsyncUdpServer
+    {
+        #region Fields
+        /// <summary>
+        /// 鏈嶅姟鍣ㄧ▼搴忓厑璁哥殑鏈�澶у鎴风杩炴帴鏁�
+        /// </summary>
+        private int _maxClient;
+
+        /// <summary>
+        /// 褰撳墠鐨勮繛鎺ョ殑瀹㈡埛绔暟
+        /// </summary>
+        //private int _clientCount;
+
+        /// <summary>
+        /// 鏈嶅姟鍣ㄤ娇鐢ㄧ殑寮傛UdpClient
+        /// </summary>
+        private UdpClient _server;
+
+        /// <summary>
+        /// 瀹㈡埛绔細璇濆垪琛�
+        /// </summary>
+        //private List<AsyncUDPState> _clients;
+
+        private bool disposed = false;
+
+        /// <summary>
+        /// 鏁版嵁鎺ュ彈缂撳啿鍖�
+        /// </summary>
+        private byte[] _recvBuffer;
+
+        #endregion
+
+        #region Properties
+
+        /// <summary>
+        /// 鏈嶅姟鍣ㄦ槸鍚︽鍦ㄨ繍琛�
+        /// </summary>
+        public bool IsRunning { get; private set; }
+        /// <summary>
+        /// 鐩戝惉鐨処P鍦板潃
+        /// </summary>
+        public IPAddress Address { get; private set; }
+        /// <summary>
+        /// 鐩戝惉鐨勭鍙�
+        /// </summary>
+        public int Port { get; private set; }
+        /// <summary>
+        /// 閫氫俊浣跨敤鐨勭紪鐮�
+        /// </summary>
+        public Encoding Encoding { get; set; }
+
+        #endregion
+
+        #region 鏋勯�犲嚱鏁�
+
+        /// <summary>
+        /// 寮傛UdpClient UDP鏈嶅姟鍣�
+        /// </summary>
+        /// <param name="listenPort">鐩戝惉鐨勭鍙�</param>
+        public AsyncUdpServer(int listenPort)
+            : this(IPAddress.Any, listenPort, 10240)
+        {
+        }
+
+        /// <summary>
+        /// 寮傛UdpClient UDP鏈嶅姟鍣�
+        /// </summary>
+        /// <param name="localEP">鐩戝惉鐨勭粓缁撶偣</param>
+        public AsyncUdpServer(IPEndPoint localEP)
+            : this(localEP.Address, localEP.Port, 10240)
+        {
+        }
+
+        /// <summary>
+        /// 寮傛UdpClient UDP鏈嶅姟鍣�
+        /// </summary>
+        /// <param name="localIPAddress">鐩戝惉鐨処P鍦板潃</param>
+        /// <param name="listenPort">鐩戝惉鐨勭鍙�</param>
+        /// <param name="maxClient">鏈�澶у鎴风鏁伴噺</param>
+        public AsyncUdpServer(IPAddress localIPAddress, int listenPort, int maxClient)
+        {
+            this.Address = localIPAddress;
+            this.Port = listenPort;
+            this.Encoding = Encoding.Default;
+
+            _maxClient = maxClient;
+            //_clients = new List<AsyncUDPSocketState>();
+            _server = new UdpClient(new IPEndPoint(this.Address, this.Port));
+            uint IOC_IN = 0x80000000;
+            uint IOC_VENDOR = 0x18000000;
+            uint SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12;
+
+            _server.Client.IOControl((int)SIO_UDP_CONNRESET, new byte[] { Convert.ToByte(false) }, null);
+
+            _recvBuffer = new byte[_server.Client.ReceiveBufferSize];
+        }
+
+        #endregion
+
+        #region Method
+        /// <summary>
+        /// 鍚姩鏈嶅姟鍣�
+        /// </summary>
+        /// <returns>寮傛TCP鏈嶅姟鍣�</returns>
+        public void Start()
+        {
+            try
+            {
+                if (!IsRunning)
+                {
+                    IsRunning = true;
+                    _server.EnableBroadcast = true;
+                    _server.BeginReceive(ReceiveDataAsync, null);
+                }
+            }
+            catch (Exception e) { }
+        }
+
+        /// <summary>
+        /// 鍋滄鏈嶅姟鍣�
+        /// </summary>
+        public void Stop()
+        {
+            try
+            {
+                //if (IsRunning)
+                {
+                    IsRunning = false;
+                    _server.Close();
+                    //TODO 鍏抽棴瀵规墍鏈夊鎴风鐨勮繛鎺�
+
+                }
+            }
+            catch (Exception e) { }
+        }
+
+        /// <summary>
+        /// 鎺ユ敹鏁版嵁鐨勬柟娉�
+        /// </summary>
+        /// <param name="ar"></param>
+        private void ReceiveDataAsync(IAsyncResult ar)
+        {
+            bool isReceive = false;
+            try
+            {
+                var udpState = new AsyncUDPState();
+                IPEndPoint remote = null;
+                udpState.buffer = _server.EndReceive(ar, ref remote); ;
+                udpState.remote = remote;
+                udpState.udpClient = _server;
+
+                isReceive = true;
+                receive();
+
+                //瑙﹀彂鏁版嵁鏀跺埌浜嬩欢
+                RaiseDataReceived(udpState);
+            }
+            catch (Exception)
+            {
+                //TODO 澶勭悊寮傚父
+                RaiseOtherException(null);
+            }
+            finally
+            {
+                if (!isReceive)
+                {
+                    receive();
+                }
+            }
+        }
+
+        void receive()
+        {
+            if (IsRunning && _server != null)
+            {
+                int count = 10;
+                while (0 < count--)
+                {
+                    try
+                    {
+                        _server.BeginReceive(ReceiveDataAsync, null);
+                        break;
+                    }
+                    catch (Exception e)
+                    {
+                        System.Threading.Thread.Sleep(100);
+                    }
+                }
+            }
+
+        }
+
+        /// <summary>
+        /// 鍙戦�佹暟鎹�
+        /// </summary>
+        /// <param name="msg"></param>
+        /// <param name="remote"></param>
+        public void Send(byte[] data, IPEndPoint remote)
+        {
+            try
+            {
+                RaisePrepareSend(null);
+                _server.BeginSend(data, data.Length, remote, new AsyncCallback(SendCallback), null);
+            }
+            catch (Exception)
+            {
+                //TODO 寮傚父澶勭悊
+                RaiseOtherException(null);
+            }
+        }
+
+        private void SendCallback(IAsyncResult ar)
+        {
+            //if (ar.IsCompleted)
+            {
+                try
+                {
+                    _server.EndSend(ar);
+                    //娑堟伅鍙戦�佸畬姣曚簨浠�
+                    RaiseCompletedSend(null);
+                }
+                catch (Exception)
+                {
+                    //TODO 鏁版嵁鍙戦�佸け璐ヤ簨浠�
+                    RaiseOtherException(null);
+                }
+            }
+
+        }
+        #endregion
+
+        #region 浜嬩欢
+        /// <summary>
+        /// 鎺ユ敹鍒版暟鎹簨浠�
+        /// </summary>
+        public event EventHandler<AsyncUDPEventArgs> DataReceived;
+
+        private void RaiseDataReceived(AsyncUDPState state)
+        {
+            if (DataReceived != null)
+            {
+                DataReceived(this, new AsyncUDPEventArgs(state));
+            }
+        }
+
+        /// <summary>
+        /// 鍙戦�佹暟鎹墠鐨勪簨浠�
+        /// </summary>
+        public event EventHandler<AsyncUDPEventArgs> PrepareSend;
+
+        /// <summary>
+        /// 瑙﹀彂鍙戦�佹暟鎹墠鐨勪簨浠�
+        /// </summary>
+        /// <param name="state"></param>
+        private void RaisePrepareSend(AsyncUDPState state)
+        {
+            if (PrepareSend != null)
+            {
+                PrepareSend(this, new AsyncUDPEventArgs(state));
+            }
+        }
+
+        /// <summary>
+        /// 鏁版嵁鍙戦�佸畬姣曚簨浠�
+        /// </summary>
+        public event EventHandler<AsyncUDPEventArgs> CompletedSend;
+
+        /// <summary>
+        /// 瑙﹀彂鏁版嵁鍙戦�佸畬姣曠殑浜嬩欢
+        /// </summary>
+        /// <param name="state"></param>
+        private void RaiseCompletedSend(AsyncUDPState state)
+        {
+            if (CompletedSend != null)
+            {
+                CompletedSend(this, new AsyncUDPEventArgs(state));
+            }
+        }
+
+        /// <summary>
+        /// 缃戠粶閿欒浜嬩欢
+        /// </summary>
+        public event EventHandler<AsyncUDPEventArgs> NetError;
+        /// <summary>
+        /// 瑙﹀彂缃戠粶閿欒浜嬩欢
+        /// </summary>
+        /// <param name="state"></param>
+        private void RaiseNetError(AsyncUDPState state)
+        {
+            if (NetError != null)
+            {
+                NetError(this, new AsyncUDPEventArgs(state));
+            }
+        }
+
+        /// <summary>
+        /// 寮傚父浜嬩欢
+        /// </summary>
+        public event EventHandler<AsyncUDPEventArgs> OtherException;
+        /// <summary>
+        /// 瑙﹀彂寮傚父浜嬩欢
+        /// </summary>
+        /// <param name="state"></param>
+        private void RaiseOtherException(AsyncUDPState state, string descrip)
+        {
+            if (OtherException != null)
+            {
+                OtherException(this, new AsyncUDPEventArgs(descrip, state));
+            }
+        }
+        private void RaiseOtherException(AsyncUDPState state)
+        {
+            RaiseOtherException(state, "");
+        }
+        #endregion
+
+        #region Close
+        /// <summary>
+        /// 鍏抽棴涓�涓笌瀹㈡埛绔箣闂寸殑浼氳瘽
+        /// </summary>
+        /// <param name="state">闇�瑕佸叧闂殑瀹㈡埛绔細璇濆璞�</param>
+        public void Close(AsyncUDPState state)
+        {
+            if (state != null)
+            {
+                //_clients.Remove(state);
+                //_clientCount--;
+                //TODO 瑙﹀彂鍏抽棴浜嬩欢
+            }
+        }
+        /// <summary>
+        /// 鍏抽棴鎵�鏈夌殑瀹㈡埛绔細璇�,涓庢墍鏈夌殑瀹㈡埛绔繛鎺ヤ細鏂紑
+        /// </summary>
+        public void CloseAllClient()
+        {
+            //foreach (AsyncUDPSocketState client in _clients)
+            //{
+            //    Close(client);
+            //}
+            //_clientCount = 0;
+            //_clients.Clear();
+        }
+
+        #endregion
+
+        #region 閲婃斁
+        /// <summary>
+        /// Performs application-defined tasks associated with freeing, 
+        /// releasing, or resetting unmanaged resources.
+        /// </summary>
+        public void Dispose()
+        {
+            Dispose(true);
+            GC.SuppressFinalize(this);
+        }
+
+        /// <summary>
+        /// Releases unmanaged and - optionally - managed resources
+        /// </summary>
+        /// <param name="disposing"><c>true</c> to release 
+        /// both managed and unmanaged resources; <c>false</c> 
+        /// to release only unmanaged resources.</param>
+        protected virtual void Dispose(bool disposing)
+        {
+            if (!this.disposed)
+            {
+                if (disposing)
+                {
+                    try
+                    {
+                        Stop();
+                        if (_server != null)
+                        {
+                            _server = null;
+                        }
+                    }
+                    catch (SocketException)
+                    {
+                        //TODO
+                        RaiseOtherException(null);
+                    }
+                }
+                disposed = true;
+            }
+        }
+        #endregion
+    }
+}
+public class AsyncUDPState
+{
+    // Client   socket.
+    public UdpClient udpClient = null;
+    // Size of receive buffer.
+    public const int BufferSize = 1024;
+    // Receive buffer.
+    public byte[] buffer = new byte[BufferSize];
+    // Received data string.
+    public StringBuilder sb = new StringBuilder();
+
+    public IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
+}
+/// <summary>
+/// UdpClient 寮傛UDP鏈嶅姟鍣ㄤ簨浠跺弬鏁扮被
+/// </summary>
+public class AsyncUDPEventArgs : EventArgs
+{
+    /// <summary>
+    /// 鎻愮ず淇℃伅
+    /// </summary>
+    public string _msg;
+
+    /// <summary>
+    /// 瀹㈡埛绔姸鎬佸皝瑁呯被
+    /// </summary>
+    public AsyncUDPState _state;
+
+    /// <summary>
+    /// 鏄惁宸茬粡澶勭悊杩囦簡
+    /// </summary>
+    public bool IsHandled { get; set; }
+
+    public AsyncUDPEventArgs(string msg)
+    {
+        this._msg = msg;
+        IsHandled = false;
+    }
+    public AsyncUDPEventArgs(AsyncUDPState state)
+    {
+        this._state = state;
+        IsHandled = false;
+    }
+    public AsyncUDPEventArgs(string msg, AsyncUDPState state)
+    {
+        this._msg = msg;
+        this._state = state;
+        IsHandled = false;
+    }
+
+}
diff --git a/HDL_ON/DAL/DriverLayer/Packet.cs b/HDL_ON/DAL/DriverLayer/Packet.cs
index 0e8f8dc..99f46b8 100644
--- a/HDL_ON/DAL/DriverLayer/Packet.cs
+++ b/HDL_ON/DAL/DriverLayer/Packet.cs
@@ -12,11 +12,11 @@
     /// </summary>
     public class Packet
     {
-        /// <summary>
-        /// 缂撳啿鍖哄ぇ灏�
-        /// Link鍗忚鐜板湪涓�涓寘鐨勬暟鎹瘮杈冨ぇ锛岀紦鍐插尯澶皬瀛樹笉瀹屽叏閮ㄦ暟鎹� 2023-07-14 16:03:56  wxr
-        /// </summary>
-        public const int Size = 1024 * 10;
+        ///// <summary>
+        ///// 缂撳啿鍖哄ぇ灏�
+        ///// Link鍗忚鐜板湪涓�涓寘鐨勬暟鎹瘮杈冨ぇ锛岀紦鍐插尯澶皬瀛樹笉瀹屽叏閮ㄦ暟鎹� 2023-07-14 16:03:56  wxr
+        ///// </summary>
+        //public const int Size = 2000;
 
         /// <summary>
         /// 鎺ユ敹鍒扮殑鏁版嵁
@@ -28,11 +28,15 @@
         /// </summary>
         public System.Net.EndPoint RemoteEndPoint;
 
-        public Packet()
+        public Packet(int lenght)
         {
-            this.Bytes = new byte[Size];
+            this.Bytes = new byte[lenght];
+           
             RemoteEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any, 0);
         }
+
+
+
         public Packet(byte[] data, System.Net.EndPoint remoteEndPoint)
         {
             this.Bytes = data;
diff --git a/HDL_ON/DAL/DriverLayer/UdpSocket.cs b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
index df9662a..50ceeac 100644
--- a/HDL_ON/DAL/DriverLayer/UdpSocket.cs
+++ b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
@@ -1,4 +1,222 @@
-锘縰sing System;
+锘�//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;
+//		/// <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, 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}");
+//        }
+
+//		/// <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);
+
+//				//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}");
+//			}
+//		}
+
+//		/// <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 {
+
+//            }
+//		}
+//	}
+//}
+
+using System;
 using System.Net.Sockets;
 using System.Net;
 
@@ -8,16 +226,16 @@
 	{
 		static UdpSocket _busSocket;
 		public static UdpSocket _BusSocket
-        {
-            get
-            {
-				if(_busSocket == null)
-                {
+		{
+			get
+			{
+				if (_busSocket == null)
+				{
 					_busSocket = new UdpSocket();
-                }
+				}
 				return _busSocket;
-            }
-        }
+			}
+		}
 
 		//鏈湴Socket
 		private Socket busSocket;
@@ -25,53 +243,55 @@
 		/// <summary>
 		/// 鍚姩Socket鎺ユ敹鍜屽彂閫佸姛鑳�
 		/// </summary>
-		public void Start (int port = 0)
-        {
+		public void Start(int port = 0)
+		{
 			if (IsRunning)
 			{
 				if (port == Port)
-                {
-                    return;
+				{
+					return;
 				}
-                else
-                {
-                    busSocket.Close();
+				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 = 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}");
+			catch (Exception ex)
+			{
+				MainPage.Log($"udp port bind error : {ex.Message}");
 
 				busSocket = null;
-                return;
-            }
+				return;
+			}
 
-            asyncBeginReceive();
+			asyncBeginReceive();
 
-            MainPage.Log ($"udp port : {port}");
-        }
+			MainPage.Log($"udp port : {port}");
+		}
 
 		/// <summary>
 		/// 鍋滄Socket
 		/// </summary>
 		public void Stop()
 		{
-			if(busSocket == null)
-            {
+			if (busSocket == null)
+			{
 				return;
-            }
+			}
 			if (!IsRunning)
 			{
 				return;
@@ -97,6 +317,8 @@
 			}
 		}
 
+		byte []receiveBytes = new byte[2000];
+
 		/// <summary>
 		/// 寮�濮嬪紓姝ユ帴鏀舵暟鎹�
 		/// </summary>
@@ -106,29 +328,35 @@
 			{
 				return;
 			}
-			if(busSocket == null)
-            {
+			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	);
+			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}");
-            } 
+				Console.WriteLine($"asyncBeginReceive {e.Message}");
+			}
 		}
 		/// <summary>
-        /// 閲嶈繛娆℃暟
-        /// </summary>
+		/// 閲嶈繛娆℃暟
+		/// </summary>
 		private int relinkCount = 0;
 
 
@@ -209,9 +437,11 @@
 			{
 				int bytesSent = busSocket.EndSendTo(iar);
 			}
-			catch {
-            
-            }
+			catch
+			{
+
+			}
 		}
 	}
-}
\ No newline at end of file
+}
+
diff --git a/HDL_ON/DAL/Server/HttpServerRequest.cs b/HDL_ON/DAL/Server/HttpServerRequest.cs
index 3b78fb1..e8e9e59 100644
--- a/HDL_ON/DAL/Server/HttpServerRequest.cs
+++ b/HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -710,7 +710,7 @@
                             if (mHomeGatewayRes.Count > 0)
                             {
                                 DB_ResidenceData.Instance.HomeGateway = mHomeGatewayRes[0];//缃戝叧鐘舵��
-                                DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes[0].gatewayStatus;
+                                HDL_ON.DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes[0].gatewayStatus;
                                 DB_ResidenceData.Instance.SaveResidenceData();
                                 return revertObj.Code;
                             }
@@ -776,7 +776,7 @@
                 var mHomeGatewayRes = Newtonsoft.Json.JsonConvert.DeserializeObject<HomeGatewayInfo>(revertObj.Data.ToString());
                 if (mHomeGatewayRes != null)
                 {
-                    DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes.gatewayStatus;
+                    HDL_ON.DriverLayer.Control.Ins.GatewayOnline_Cloud = mHomeGatewayRes.gatewayStatus;
                 }
             }
             return revertObj.Code;
diff --git a/HDL_ON/Entity/Function/Function.cs b/HDL_ON/Entity/Function/Function.cs
index 417b27e..7bcc154 100644
--- a/HDL_ON/Entity/Function/Function.cs
+++ b/HDL_ON/Entity/Function/Function.cs
@@ -2306,7 +2306,7 @@
         /// <summary>
         /// 绾㈠鐑按鍣�
         /// </summary>
-        public const string HeaterIr = " ir.water_heater";
+        public const string HeaterIr = "ir.water_heater";
         /// <summary>
         /// 绾㈠椋庢墖
         /// </summary>
diff --git a/HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs b/HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs
index 1957662..7d2996e 100644
--- a/HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs
+++ b/HDL_ON/UI/UI2/3-Intelligence/Automation/ConditionDeviceFunList.cs
@@ -1311,27 +1311,30 @@
                          if (indexeList.Count > 0)
                          {
                              dicSateteList.Clear();
-                             string s = string.Empty;
+                             string userNameStr = string.Empty;
+                             string seleUsrIdStr = string.Empty;  
                              string tag = string.Empty;
-                             //鏁版嵁灏佽
+                             string[] arrayUserIds = new string[indexeList.Count];
+                             //寮�闂ㄧ被鍨�
                              AddDictionary("open_type", "1", "integer");
                              for (int i = 0; i < indexeList.Count; i++)
                              {
-
                                  if (i > faceIdList.Count)
                                  {
                                      continue;
                                  }
                                  var indexe = indexeList[i];
                                  var face = faceIdList[indexe];
-                                 AddDictionary("user_id", face.userId, "string");
-                                 s += face.userName;
-                                 s += ",";
                                  tag += face.userId;
                                  tag += "_";
+                                 userNameStr += face.userName;
+                                 userNameStr += ",";
+                                 arrayUserIds[i] = face.userId;
                              }
+                             seleUsrIdStr = Newtonsoft.Json.JsonConvert.SerializeObject(arrayUserIds);
+                             AddDictionary("user_id", seleUsrIdStr, "string", "[]");
                              //鐣岄潰鏄剧ず閫変腑鍊�
-                             btnState.Text = s;
+                             btnState.Text = InpOrOutLogicMethod.Current.RemoveLastStr(userNameStr);
                              btnState.Tag = tag;
                          }
 
diff --git a/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs b/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
index c5fbf03..d1fc564 100644
--- a/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
+++ b/HDL_ON/UI/UI2/3-Intelligence/Automation/InpOrOutLogicMethod.cs
@@ -436,30 +436,43 @@
                                     break;
                                 case SPK.doorgate:
                                     {
-                                        string s = string.Empty;
-                                        if (inputCondition.identifier == "door_call_cloud_event")
-                                        {
-                                            s = Language.StringByID(StringId.shipintonghuahujiao);
-                                        }
-                                        else
-                                        {
-                                            for (int b = 0; b < dicList.Count; b++)
-                                            {
-                                                var dic = dicList[b];
-                                                var key = dic["key"].ToString();
-                                                if (key != "user_id")
-                                                {
-                                                    continue;
-                                                }
-                                                var userId = dic["value"].ToString();
-                                                var FaceItem = this.GetFaceItem(userId, device.deviceId);
-                                                s += FaceItem.userName;
-                                                s += ",";
 
+                                        string s = string.Empty;
+                                        try
+                                        {
+                                            if (inputCondition.identifier == "door_call_cloud_event")
+                                            {
+                                                s = Language.StringByID(StringId.shipintonghuahujiao);
+                                            }
+                                            else
+                                            {
+                                                for (int b = 0; b < dicList.Count; b++)
+                                                {
+                                                    var dic = dicList[b];
+                                                    var key = dic["key"].ToString();
+                                                    if (key != "user_id")
+                                                    {
+                                                        continue;
+                                                    }
+                                                    var value = dic["value"].ToString();
+                                                    if (!string.IsNullOrEmpty(value))
+                                                    {
+                                                        var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(value);
+                                                        for (int a = 0; a < list.Count; a++)
+                                                        {
+
+                                                            var FaceItem = this.GetFaceItem(list[a], device.deviceId);
+                                                            s += FaceItem.userName;
+                                                            s += ",";
+
+                                                        }
+                                                    }
+
+                                                }
 
                                             }
-
                                         }
+                                        catch { }
                                         inputView.btnState.Text = s;
                                     }
                                     break;
@@ -1506,17 +1519,32 @@
                                 case SPK.MusicStandard:
                                 case SPK.AvMusic:
                                     {
+                                        string on_off = GetKeyValue("on_off", dicList);
                                         string song_name = GetKeyValue("song_name", dicList);
                                         string volume = GetKeyValue("volume", dicList);
-                                        stateStr = song_name + ";" + Language.StringByID(StringId.volumeMusic) + volume;
-                                        if (stateStr.StartsWith(";"))
+
+                                        if (!string.IsNullOrEmpty(on_off))
                                         {
-                                            stateStr = stateStr.Substring(1, stateStr.Length - 1);
+                                            if (on_off == "on")
+                                            {
+                                                stateStr = Language.StringByID(StringId.onLogic);
+                                            }
+                                            else
+                                            {
+                                                stateStr = Language.StringByID(StringId.offLogic);
+                                            }
                                         }
-                                        else if (stateStr.EndsWith(Language.StringByID(StringId.volumeMusic)))
+
+                                        if (!string.IsNullOrEmpty(song_name))
                                         {
-                                            stateStr = stateStr.Substring(0, stateStr.Length - 3);
+                                            stateStr += "," + song_name;
                                         }
+
+                                        if (!string.IsNullOrEmpty(volume))
+                                        {
+                                            stateStr += "," + volume;
+                                        }
+
                                     }
                                     break;
                                 case SPK.ElectricalTvHisense:
@@ -2303,7 +2331,7 @@
                         foreach (var dic in dicList)
                         {
                             string value = dic["value"];
-                            if (value == "on"|| value == "open")
+                            if (value == "on" || value == "open")
                             {
                                 button1.Text = Language.StringByID(StringId.onLogic);
                             }
@@ -2494,38 +2522,61 @@
                     {
                         foreach (var dic in dicList)
                         {
-                            if (dic["key"] == "song_name")
+                            if (dic["key"] == "on_off")
                             {
-                                button1.Text = dic["value"]?.ToString();
+                                if (dic["value"] == "on")
+                                {
+                                    button1.Text = Language.StringByID(StringId.onLogic);
+                                }
+                                else
+                                {
+                                    button1.Text = Language.StringByID(StringId.offLogic);
+                                }
+                            }
+                            else if (dic["key"] == "song_name")
+                            {
+                                button2.Text = dic["value"]?.ToString();
                             }
                             else if (dic["key"] == "volume")
                             {
-                                button2.Text = dic["value"]?.ToString();
+                                button3.Text = dic["value"]?.ToString();
                             }
                         }
                     }
                     break;
                 case SPK.doorgate:
                     {
-                        string s = string.Empty;
-                        string tag = string.Empty;
-                        for (int b = 0; b < dicList.Count; b++)
+                        try
                         {
-                            var dic = dicList[b];
-                            var key = dic["key"].ToString();
-                            if (key != "user_id")
+                            string userNameStr = string.Empty; 
+                            string tag = string.Empty;
+                            for (int b = 0; b < dicList.Count; b++)
                             {
-                                continue;
+                                var dic = dicList[b];
+                                var key = dic["key"].ToString();
+                                if (key != "user_id")
+                                {
+                                    continue;
+                                }
+                                var value = dic["value"].ToString();
+                                if (!string.IsNullOrEmpty(value))
+                                {
+                                    var list = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>(value);
+                                    for (int i = 0; i < list.Count; i++)
+                                    {
+
+                                        var FaceItem = this.GetFaceItem(list[i], device.deviceId);
+                                        userNameStr += FaceItem.userName;
+                                        userNameStr += ",";
+                                        tag += FaceItem.userId;
+                                        tag += "_";
+                                    }
+                                }
                             }
-                            var userId = dic["value"].ToString();
-                            var FaceItem = this.GetFaceItem(userId, device.deviceId);
-                            s += FaceItem.userName;
-                            s += ",";
-                            tag += FaceItem.userId;
-                            tag += "_";
+                            button2.Text = RemoveLastStr(userNameStr);
+                            button2.Tag = tag;
                         }
-                        button2.Text = s;
-                        button2.Tag = tag;
+                        catch { }
                     }
                     break;
                 case SPK.ElectricalTvHisense:
diff --git a/HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs b/HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs
index 807103c..89cd452 100644
--- a/HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs
+++ b/HDL_ON/UI/UI2/3-Intelligence/Automation/Logic.cs
@@ -109,7 +109,7 @@
         /// <summary>
         /// 妫�娴嬬被鍨� 閰嶅悎condition_type=3鏃朵娇鐢�,娌℃湁璇ュ瓧娈点�佽鍊兼垨0: 鐘舵�佹娴�(姣忔鏀跺埌鐘舵�佸氨鎴愮珛),1:鍔ㄤ綔妫�娴�(闇�瑕佸垏鎹㈢姸鎬佹墠鎴愮珛);
         /// </summary>
-        public string detect_type = "0"; 
+        public string detect_type = "1"; 
         /// <summary>
         /// 浜轰綋绉诲姩浼犳劅鍣紙甯︽寔缁椂闂达級
         /// </summary>
diff --git a/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs b/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs
index 1bdd1b3..e8b86db 100644
--- a/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs
+++ b/HDL_ON/UI/UI2/3-Intelligence/Automation/TargetDeviceFunList.cs
@@ -736,8 +736,13 @@
                 case SPK.AvMusic:
                     {
                         #region 鐣岄潰
+                        ///寮�鍏�
+                        LogicView.FunTypeView switchVie = new LogicView.FunTypeView();
+                        switchVie.btnText.TextID = StringId.switchLogic;
+                        fLayout.AddChidren(switchVie.FLayoutView());
                         //鎻愮ず璇煶
                         LogicView.FunTypeView funTypeView = new LogicView.FunTypeView();
+                        funTypeView.frameLayout.Y = switchVie.frameLayout.Bottom;
                         funTypeView.btnText.TextID = StringId.tishiyin;
                         fLayout.AddChidren(funTypeView.FLayoutView());
                         ///闊抽噺
@@ -757,6 +762,12 @@
                         DelayView(fLayout, volView.frameLayout.Bottom);
                         #endregion
                         #region 鐐瑰嚮浜嬩欢
+                        ///寮�鍏崇偣鍑讳簨浠�
+                        switchVie.btnClick.MouseUpEventHandler += (sender, e) =>
+                        {
+
+                            SwitchViewMethod(device, switchVie.btnState, 2);
+                        };
                         ///鎻愮ず璇煶鐐瑰嚮浜嬩欢
                         funTypeView.btnClick.MouseUpEventHandler += (sender, e) =>
                         {
@@ -820,7 +831,7 @@
                         if (edit)
                         {
                             //鏄剧ず缂栬緫涔嬪墠鐨勮澶囩姸鎬�
-                            GetEditDeviceState(device, index, funTypeView.btnState, volView.btnState, null, null);
+                            GetEditDeviceState(device, index, switchVie.btnState, funTypeView.btnState, volView.btnState, null);
                         }
 
                         #endregion
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs
index 1228ec0..85a2377 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPage.cs
@@ -242,7 +242,7 @@
 
             if (MainPage.Increase)
             {
-                bodyScrolView.Height = Application.GetRealHeight(541);
+                bodyScrolView.Height = Application.GetRealHeight(541-10);
             }
 
             headPortraitView = new FrameLayout()
@@ -858,16 +858,9 @@
 
             #endregion
 
-            bodyView.AddChidren(new Button()
-            {
-                Y = Application.GetRealHeight(622),
-                Height = 1,
-                BackgroundColor = CSS_Color.DividingLineColor,
-            });
-
             btnLogout = new Button()
             {
-                Y = Application.GetRealHeight(623),
+                Y = Application.GetRealHeight(624),
                 Height = Application.GetRealHeight(50),
                 TextAlignment = TextAlignment.Center,
                 TextSize = CSS_FontSize.SubheadingFontSize,

--
Gitblit v1.8.0