From d6578b10542226650e263815dea75e598a7090f9 Mon Sep 17 00:00:00 2001
From: wxr <464027401@qq.com>
Date: 星期三, 17 八月 2022 13:22:02 +0800
Subject: [PATCH] tcp状态更新,iOS扫描

---
 HDL_ON/DAL/DriverLayer/Control_Tcp.cs                                    |  811 ++++++++++++++++++++++++++
 HDL-ON_Android/Properties/AndroidManifest.xml                            |    2 
 HDL_ON/DAL/DriverLayer/UdpSocket.cs                                      |    1 
 DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll                                    |    0 
 HDL_ON/DAL/DriverLayer/Control_TcpServer.cs                              |    2 
 HDL-ON_Android/Assets/Language.ini                                       |    4 
 HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs          |   10 
 HDL-ON_iOS/HDL-ON_iOS.csproj                                             |    3 
 HDL-ON_Android/Assets/Phone/Public/IotCheckIcon.png                      |    0 
 HDL_ON/HDL_ON.projitems                                                  |    1 
 HDL-ON_Android/Assets/Phone/Public/IotCheckOnIcon.png                    |    0 
 HDL_ON/DAL/DriverLayer/A_Protocol_Common.cs                              |   10 
 HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandListPage.cs          |   19 
 HDL-ON_Android/HDL-ON_Android.csproj                                     |    2 
 HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandFunctionListPage.cs  |  125 +++
 HDL-ON_iOS/Info.plist                                                    |    4 
 HDL-ON_iOS/Resources/Language.ini                                        |   13 
 HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs               |    8 
 HDL_ON/DAL/DriverLayer/Control.cs                                        |  135 +++-
 HDL_ON/UI/MainPage.cs                                                    |   11 
 HDL_ON/Entity/Function/Scene.cs                                          |    5 
 HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_AuthorizedPage.cs         |  114 +++
 HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs                    |   12 
 HDL_ON/Entity/Integratedbrand/IntegratedBrand.cs                         |    2 
 HDL_ON/Common/ImageUtlis.cs                                              |   68 +
 HDL_ON/UI/UI2/4-PersonalCenter/ResetAccountPassword/ResetPasswordPage.cs |   74 +
 HDL-ON_iOS/Scan.cs                                                       |  101 ++-
 HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs                    |    8 
 HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/iot_BindTipPage.cs            |   62 +
 HDL_ON/Common/R.cs                                                       |    4 
 HDL_ON/DAL/Server/HttpServerRequest.cs                                   |   18 
 HDL_ON/DAL/DriverLayer/Control_TcpClient.cs                              |  178 ++++-
 32 files changed, 1,573 insertions(+), 234 deletions(-)

diff --git a/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll b/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll
new file mode 100644
index 0000000..8d81fa4
--- /dev/null
+++ b/DLL/IOS/HDL.Shared.IOS.ScanQRCode.dll
Binary files differ
diff --git a/HDL-ON_Android/Assets/Language.ini b/HDL-ON_Android/Assets/Language.ini
index 3de2aa2..ed2b28e 100644
--- a/HDL-ON_Android/Assets/Language.ini
+++ b/HDL-ON_Android/Assets/Language.ini
@@ -546,6 +546,7 @@
 558=Someone is sitting
 559=Bind a third-party account
 560=Bound
+561=Original password
 
 
 
@@ -1751,6 +1752,7 @@
 558=鏈変汉鍧愮潃
 559=缁戝畾绗笁鏂硅处鍙�
 560=宸茬粦瀹�
+561=鍘熷瘑鐮�
 
  
 
@@ -2935,6 +2937,7 @@
 558=Someone is sitting
 559=Bind a third-party account
 560=Bound
+561=Original password
 
 
 2532=Visitor Invitation Record
@@ -4130,6 +4133,7 @@
 558=Someone is sitting
 559=Bind a third-party account
 560=Bound
+561=Original password
 
 
 2532=Visitor Invitation Record
diff --git a/HDL-ON_Android/Assets/Phone/Public/IotCheckIcon.png b/HDL-ON_Android/Assets/Phone/Public/IotCheckIcon.png
new file mode 100644
index 0000000..0fa6702
--- /dev/null
+++ b/HDL-ON_Android/Assets/Phone/Public/IotCheckIcon.png
Binary files differ
diff --git a/HDL-ON_Android/Assets/Phone/Public/IotCheckOnIcon.png b/HDL-ON_Android/Assets/Phone/Public/IotCheckOnIcon.png
new file mode 100644
index 0000000..0dffe12
--- /dev/null
+++ b/HDL-ON_Android/Assets/Phone/Public/IotCheckOnIcon.png
Binary files differ
diff --git a/HDL-ON_Android/HDL-ON_Android.csproj b/HDL-ON_Android/HDL-ON_Android.csproj
index b8f8906..232a6cb 100644
--- a/HDL-ON_Android/HDL-ON_Android.csproj
+++ b/HDL-ON_Android/HDL-ON_Android.csproj
@@ -260,6 +260,8 @@
     <AndroidAsset Include="Assets\Phone\FunctionIcon\Icon\HomeIcon\sensormegahealth.png" />
     <AndroidAsset Include="Assets\Phone\Public\Iot_agreement_icon.png" />
     <AndroidAsset Include="Assets\Phone\Public\LinkIotIcon.png" />
+    <AndroidAsset Include="Assets\Phone\Public\IotCheckIcon.png" />
+    <AndroidAsset Include="Assets\Phone\Public\IotCheckOnIcon.png" />
   </ItemGroup>
   <ItemGroup>
     <AndroidResource Include="Resources\values\colors.xml" />
diff --git a/HDL-ON_Android/Properties/AndroidManifest.xml b/HDL-ON_Android/Properties/AndroidManifest.xml
index 0729416..f4b6684 100644
--- a/HDL-ON_Android/Properties/AndroidManifest.xml
+++ b/HDL-ON_Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.6.0" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202208031">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionName="1.6.0" package="com.hdl.onpro" xmlns:tools="http://schemas.android.com/tools" android:versionCode="202208151">
 	<uses-sdk android:minSdkVersion="26" android:targetSdkVersion="29" />
 	<!--鍙嬬洘-->
 	<!--<uses-sdk android:minSdkVersion="8"></uses-sdk>-->
diff --git a/HDL-ON_iOS/HDL-ON_iOS.csproj b/HDL-ON_iOS/HDL-ON_iOS.csproj
index f197eec..a1955c5 100644
--- a/HDL-ON_iOS/HDL-ON_iOS.csproj
+++ b/HDL-ON_iOS/HDL-ON_iOS.csproj
@@ -114,6 +114,9 @@
         <Reference Include="Shared.IOS.HDLFVSDK">
           <HintPath>..\DLL\IOS\Shared.IOS.HDLFVSDK.dll</HintPath>
         </Reference>
+        <Reference Include="HDL.Shared.IOS.ScanQRCode">
+          <HintPath>..\DLL\IOS\HDL.Shared.IOS.ScanQRCode.dll</HintPath>
+        </Reference>
     </ItemGroup>
     <ItemGroup>
       <PackageReference Include="Newtonsoft.Json">
diff --git a/HDL-ON_iOS/Info.plist b/HDL-ON_iOS/Info.plist
index 076ab47..0000150 100644
--- a/HDL-ON_iOS/Info.plist
+++ b/HDL-ON_iOS/Info.plist
@@ -100,9 +100,9 @@
 	<key>UIStatusBarStyle</key>
 	<string>UIStatusBarStyleLightContent</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.5.902207251</string>
+	<string>1.6.002208151</string>
 	<key>CFBundleVersion</key>
-	<string>1.5.907251</string>
+	<string>1.6.008151</string>
 	<key>NSLocationWhenInUseUsageDescription</key>
 	<string>Use geographic location to provide services such as weather</string>
 	<key>NSAppleMusicUsageDescription</key>
diff --git a/HDL-ON_iOS/Resources/Language.ini b/HDL-ON_iOS/Resources/Language.ini
index bfc05e6..ed2b28e 100644
--- a/HDL-ON_iOS/Resources/Language.ini
+++ b/HDL-ON_iOS/Resources/Language.ini
@@ -544,6 +544,9 @@
 556=Someone is running
 557=Someone is standing
 558=Someone is sitting
+559=Bind a third-party account
+560=Bound
+561=Original password
 
 
 
@@ -1747,6 +1750,9 @@
 556=鏈変汉鍦ㄨ窇
 557=鏈変汉绔欑潃
 558=鏈変汉鍧愮潃
+559=缁戝畾绗笁鏂硅处鍙�
+560=宸茬粦瀹�
+561=鍘熷瘑鐮�
 
  
 
@@ -2929,6 +2935,9 @@
 556=Someone is running
 557=Someone is standing
 558=Someone is sitting
+559=Bind a third-party account
+560=Bound
+561=Original password
 
 
 2532=Visitor Invitation Record
@@ -4122,6 +4131,10 @@
 556=Someone is running
 557=Someone is standing
 558=Someone is sitting
+559=Bind a third-party account
+560=Bound
+561=Original password
+
 
 2532=Visitor Invitation Record
 2533=Visitor management
diff --git a/HDL-ON_iOS/Scan.cs b/HDL-ON_iOS/Scan.cs
index 9bc60b9..8f159ad 100644
--- a/HDL-ON_iOS/Scan.cs
+++ b/HDL-ON_iOS/Scan.cs
@@ -2,7 +2,7 @@
 using HDL_ON_iOS;
 using Shared;
 using ZXing.Mobile;
-
+using HDL.Shared.IOS.ScanQRCode;
 namespace HDL_ON
 {
     public class Scan
@@ -27,51 +27,78 @@
 
         }
 
-        static MobileBarcodeScanner scanner;
-        public async void OpenScan(Action<string> action)
+        void ScanResult(string result)
         {
-            string cancel = "鍙栨秷";
-            string flashText = "";
-            string titleText = "浜岀淮鐮佹壂鎻�";
-            if (Language.CurrentLanguage != "Chinese")
-            {
-                cancel = "Cancel";
-                flashText = "";
-                titleText = "Scan";
-            }
-
-            if (scanner == null)
-            {
-                var mZXingOverlayView = new ZXingOverlayView(cancel, flashText, titleText);
-                scanner = new MobileBarcodeScanner(AppDelegate.rootViewController) { FlashButtonText = flashText, TopText = titleText, BottomText = "", CancelButtonText = cancel };
-                scanner.UseCustomOverlay = true;
-
-                scanner.CustomOverlay = mZXingOverlayView;
-                var bOn = false;
-                mZXingOverlayView.OnCancel += () =>
-                {
-                    scanner?.Cancel();
-                };
-
-                mZXingOverlayView.OnTorch += () =>
-                {
-                    bOn = !bOn;
-                    scanner?.Torch(bOn);
-                };
-
-            }
-
-            var result = await scanner.Scan();
-
             if (result != null)
             {
-                action?.Invoke(result.Text);
+                action?.Invoke(result);
             }
             else
             {
                 action?.Invoke(null);
                 Console.WriteLine("浜岀淮鐮佽繑鍥炲�间负null");
             }
+
+        }
+
+        static MobileBarcodeScanner scanner;
+
+
+        Action<string> action;
+
+        public void OpenScan(Action<string> action)
+        {
+            this.action = action;
+
+            string cancel = "鍙栨秷";
+            //string flashText = "";
+            string titleText = "浜岀淮鐮佹壂鎻�";
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                cancel = "Cancel";
+                //flashText = "";
+                titleText = "Scan";
+            }
+            var d1 = new HDLQRCodeScanFinish(ScanResult);
+            HDL.Shared.IOS.ScanQRCode.HDLScanQRCodeSDK.SharedInstance().ScanQRCodeWith(cancel, titleText, d1);
+
+
+
+            //if (scanner == null)
+            //{
+            //    var mZXingOverlayView = new ZXingOverlayView(cancel, flashText, titleText);
+            //    scanner = new MobileBarcodeScanner(AppDelegate.rootViewController) { FlashButtonText = flashText, TopText = titleText, BottomText = "", CancelButtonText = cancel };
+            //    scanner.UseCustomOverlay = true;
+
+            //    scanner.CustomOverlay = mZXingOverlayView;
+            //    var bOn = false;
+            //    mZXingOverlayView.OnCancel += () =>
+            //    {
+            //        scanner?.Cancel();
+            //    };
+
+            //    mZXingOverlayView.OnTorch += () =>
+            //    {
+            //        bOn = !bOn;
+            //        scanner?.Torch(bOn);
+            //    };
+
+            //}
+
+            //var result = await scanner.Scan();
+
+            //if (result != null)
+            //{
+            //    action?.Invoke(result.Text);
+            //}
+            //else
+            //{
+            //    action?.Invoke(null);
+            //    Console.WriteLine("浜岀淮鐮佽繑鍥炲�间负null");
+            //}
+
+
+
         }
 
         public static byte[] BytesFromText(string text, int width = 300, int height = 300)
diff --git a/HDL_ON/Common/ImageUtlis.cs b/HDL_ON/Common/ImageUtlis.cs
index b13acd1..54cdb55 100644
--- a/HDL_ON/Common/ImageUtlis.cs
+++ b/HDL_ON/Common/ImageUtlis.cs
@@ -4,6 +4,8 @@
 using System.IO;
 using HDL_ON.Common;
 using System.Collections.Generic;
+using System.Text;
+using System.Security.Cryptography;
 
 namespace HDL_ON
 {
@@ -179,19 +181,26 @@
         /// </summary>
         public byte[] GetImageDownloadUrl(string imageKey)
         {
-            var requestJson = HttpUtil.GetSignRequestJson(new GetImageUrlObj()
+            if (imageKey.StartsWith("https:"))
             {
-                imageKey = imageKey,
-            });
-            var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_GetImageUrl, requestJson);
-            if (revertObj.Code == StateCode.SUCCESS)
+                return HttpUtil.HttpsDownload(imageKey);
+            }
+            else
             {
-                if (revertObj.Data != null)
+                var requestJson = HttpUtil.GetSignRequestJson(new GetImageUrlObj()
                 {
-                    if (!string.IsNullOrEmpty(revertObj.Data.ToString()))
+                    imageKey = imageKey,
+                });
+                var revertObj = HttpUtil.RequestHttpsPostFroHome(NewAPI.API_POST_GetImageUrl, requestJson);
+                if (revertObj.Code == StateCode.SUCCESS)
+                {
+                    if (revertObj.Data != null)
                     {
-                        var url = revertObj.Data.ToString();
-                        return HttpUtil.HttpsDownload(url);
+                        if (!string.IsNullOrEmpty(revertObj.Data.ToString()))
+                        {
+                            var url = revertObj.Data.ToString();
+                            return HttpUtil.HttpsDownload(url);
+                        }
                     }
                 }
             }
@@ -294,6 +303,34 @@
             }
         }
 
+
+        string strKey = "abcdefgh";//娉ㄦ剰锛氳繖閲岀殑瀵嗛挜sKey蹇呴』鑳借浆涓�8涓猙yte锛屽嵆杈撳叆瀵嗛挜涓�8鍗婅涓瓧绗︽垨鑰�4涓叏瑙掑瓧绗︽垨鑰�4涓眽瀛楃殑瀛楃涓�
+        string strIV = "ijklmnop";
+
+        // 鍔犲瘑
+        private string Encrypt(string _strQ)
+        {
+            byte[] buffer = Encoding.UTF8.GetBytes(_strQ);
+            MemoryStream ms = new MemoryStream();
+            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
+            CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
+            encStream.Write(buffer, 0, buffer.Length);
+            encStream.FlushFinalBlock();
+            return Convert.ToBase64String(ms.ToArray());
+        }
+
+        // 瑙e瘑
+        private string Decrypt(string _strQ)
+        {
+            byte[] buffer = Convert.FromBase64String(_strQ);
+            MemoryStream ms = new MemoryStream();
+            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
+            CryptoStream encStream = new CryptoStream(ms, des.CreateDecryptor(Encoding.UTF8.GetBytes(strKey), Encoding.UTF8.GetBytes(strIV)), CryptoStreamMode.Write);
+            encStream.Write(buffer, 0, buffer.Length);
+            encStream.FlushFinalBlock();
+            return Encoding.UTF8.GetString(ms.ToArray());
+        }
+
         /// <summary>
         /// 2020-12-03
         /// 妫�娴嬪姞杞藉浘鐗�
@@ -306,6 +343,13 @@
         {
             try
             {
+                var imageUrl = imageKey;
+
+                if (imageUrl.StartsWith("http"))
+                {
+                    imageKey = Encrypt(imageKey);
+                }
+
                 //1.鏈湴榛樿鍥惧簱鍥剧墖锛岀洿鎺ュ姞杞芥湰鍦�
                 if (imageKey.Contains("Classification/Room/Roombg") || imageKey.Contains("Intelligence/Gallery/scenebg"))
                 {
@@ -333,7 +377,7 @@
                         //2.2 鏈湴娌$紦瀛橈紝寮�鍚嚎绋嬩簯绔笅杞界劧鍚庣紦瀛�
                         System.Threading.Tasks.Task.Run(() =>
                         {
-                            byte[] imageBytes = GetImageDownloadUrl(imageKey);
+                            byte[] imageBytes = GetImageDownloadUrl(imageUrl);
                             if (imageBytes != null)
                             {
                                 WriteFileByBytes(imageKey, imageBytes);
@@ -343,14 +387,14 @@
                                     if (frameLayout != null)
                                     {
                                         frameLayout.BackgroundImagePath = imageKey;
-                                        //Utlis.WriteLine("imageKey 鍔犺浇浜戠涓嬭浇鍥剧墖鎴愬姛");
+                                        Utlis.WriteLine("imageKey 鍔犺浇浜戠涓嬭浇鍥剧墖鎴愬姛");
                                     }
                                 });
                             }
                             else
                             {
                                 //2.4 涓嬭浇鏄惁锛屾槸鍚︿娇鐢ㄩ粯璁ゅ浘鐗�
-                                //Utlis.WriteLine("imageKey 鍔犺浇浜戠鍥剧墖澶辫触");
+                                Utlis.WriteLine("imageKey 鍔犺浇浜戠鍥剧墖澶辫触");
                             }
                         });
                     }
diff --git a/HDL_ON/Common/R.cs b/HDL_ON/Common/R.cs
index 9cf7833..c1c0dbf 100644
--- a/HDL_ON/Common/R.cs
+++ b/HDL_ON/Common/R.cs
@@ -5,6 +5,10 @@
     public static class StringId
     {
         /// <summary>
+        /// 鍘熷瘑鐮�
+        /// </summary>
+        public const int OriginalPassword = 561;
+        /// <summary>
         /// 宸茬粦瀹�
         /// </summary>
         public const int Bound = 560;
diff --git a/HDL_ON/DAL/DriverLayer/A_Protocol_Common.cs b/HDL_ON/DAL/DriverLayer/A_Protocol_Common.cs
index 66599af..98e640b 100644
--- a/HDL_ON/DAL/DriverLayer/A_Protocol_Common.cs
+++ b/HDL_ON/DAL/DriverLayer/A_Protocol_Common.cs
@@ -196,6 +196,16 @@
                 return $"/user/{Control.Ins.GatewayId}/custom/security/list/get";
             }
         }
+        /// <summary>
+        /// 蹇冭烦鍖�
+        /// </summary>
+        public string HeartBeat
+        {
+            get
+            {
+                return $"/user/{Control.Ins.GatewayId}/custom/gateway/heartbeat";
+            }
+        }
 
         #region 闂ㄩ攣
         public string OneKeyUnlock
diff --git a/HDL_ON/DAL/DriverLayer/Control.cs b/HDL_ON/DAL/DriverLayer/Control.cs
index 2b0623c..ab30fc6 100644
--- a/HDL_ON/DAL/DriverLayer/Control.cs
+++ b/HDL_ON/DAL/DriverLayer/Control.cs
@@ -4,26 +4,12 @@
 using HDL_ON.DAL.Server;
 using HDL_ON.Entity;
 using HDL_ON.UI;
+using Newtonsoft.Json;
+using Newtonsoft.Json.Linq;
 using Shared;
 
 namespace HDL_ON.DriverLayer
 {
-    /// <summary>
-    /// 閫氳鏂瑰紡
-    /// </summary>
-    public enum CommunicationMode
-    {
-        none,
-        /// <summary>
-        /// 鏈湴udp
-        /// </summary>
-        local_BusUdp,
-        /// <summary>
-        /// 鏈湴tcp瀹㈡埛绔�
-        /// </summary>
-        tcp_local_client,
-    }
-
     public class Control
     {
 
@@ -43,6 +29,11 @@
         /// 璁板綍鎺ユ敹鍒扮殑娑堟伅锛屾柟渚縵b鐨勫伐绋嬪笀璋冭瘯浠栦滑鐨勮澶�
         /// </summary>
         public List<string> MsgInfoList = new List<string>();
+        /// <summary>
+        /// 鏈湴tcp瀹㈡埛绔繛鎺ユ槸鍚︽垚鍔�
+        /// 鏄惁鐧诲綍缃戝叧鎴愬姛
+        /// </summary>
+        public bool LocalTcpClientLogin = false;
 
         int _msg_id = 1;
         /// <summary>
@@ -200,11 +191,6 @@
         public Control_Udp myUdp1 = null;
 
         /// <summary>
-        /// 閫氳鏂瑰紡
-        /// </summary>
-        public CommunicationMode communicationMode;
-
-        /// <summary>
         /// 鎵撳紑tcp鏈嶅姟绔�
         /// </summary>
         public void OpenTcpServer()
@@ -297,6 +283,38 @@
             }
         }
 
+
+        private System.Threading.Thread loginGatewayThread;
+
+        /// <summary>
+        /// 鐧诲綍缃戝叧
+        /// </summary>
+        public void LoginGateway()
+        {
+            if(loginGatewayThread== null)
+            {
+                loginGatewayThread = new System.Threading.Thread(() => {
+                    while (true)
+                    {
+                        if (Ins.GatewayOnline_Local && myTcpClient.isConnected && LocalTcpClientLogin)
+                        {
+                            var sendData = new { clientType = "app", version = "1.0" };
+                            var sendJob = new { id = Control.Ins.msg_id.ToString(), time_stamp = Utlis.GetTimestamp(), objects = sendData };
+
+                            var bodyString = JsonConvert.SerializeObject(sendJob);
+
+                            var sendBytes = ConvertSendBodyData($"/user/{GatewayId}/custom/gateway/login", bodyString);
+
+                            Ins.myTcpClient.SendMessage(sendBytes);
+                        }
+                        System.Threading.Thread.Sleep(2000);
+                    }
+
+                });
+            }
+        }
+
+
         /// <summary>
         /// 鍦烘櫙鎺у埗鍏ュ彛
         /// </summary>
@@ -342,15 +360,6 @@
                 }
             }
         }
-        /// <summary>
-        /// 瀹夐槻鎺у埗
-        /// </summary>
-        public void ControlArm()
-        {
-            DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest();
-            //var pack = httpServer.GetSecurityAlarmLogList
-        }
-
 
         /// <summary>
         /// 鍙戦�佸懡浠�
@@ -903,6 +912,12 @@
                 //}
                 receiveObj.BodyDataString = res[1];
 
+                if(receiveObj.Topic == CommunicationTopic.ct.HeartBeat)
+                {
+
+                    return null;
+                }
+
                 //2021-09-23 杩囨护涓嶉渶瑕佽В瀵嗙殑涓婚 鐩墠鎼滅储缃戝叧涓婚涓嶅姞瀵�
                 if (receiveObj.Topic != CommunicationTopic.SearchLoaclGatewayReply)
                 {
@@ -943,6 +958,21 @@
                     }
                 }
 
+                try
+                {
+                    var idMsg = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]);
+                    var hasProcess = hasItBeenProcessed(idMsg.id);
+                    if (hasProcess)
+                    {
+                        return null;
+                    }
+                    MainPage.Log($"澶勭悊灞�鍩熺綉鏁版嵁id:{idMsg.id}");
+
+                }
+                catch (Exception ex)
+                {
+                    MainPage.Log($"瑙f瀽灞�鍩熺綉鏁版嵁寮傚父{ex.Message}");
+                }
 
                 if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast)
                 {
@@ -975,17 +1005,22 @@
                         //2021-09-23 鏂板鑾峰彇褰撳墠缃戝叧鏄惁鏈湴鍔犲瘑
                         Ins.IsLocalEncrypt = device.isLocalEncrypt;
                         //MainPage.Log("缃戝叧鏈湴鍔犲瘑鐘舵�侊細" + device.local_encrypt.ToString());
+
+                        OpenTcpClent();
+
+                        LoginGateway();
+
                     }
                 }
                 else if (receiveObj.Topic == CommunicationTopic.ct.ReadStatus + "_reply" ||
                     receiveObj.Topic == CommunicationTopic.ct.ControlFunctionTopic + "_reply" ||
                     receiveObj.Topic == CommunicationTopic.ct.GatewayUpStatus ||
-                    receiveObj.Topic.Contains( CommunicationTopic.ct.GatewayUpSortTopic))
+                    receiveObj.Topic.Contains(CommunicationTopic.ct.GatewayUpSortTopic))
                 {
                     //TODO 鏆傛椂涓嶄紶姝g‘鐨勬暟鎹笂鍘伙紝濡傛灉鍚庨潰瑕佷紭鍖栧墠闈㈣繖浜涗唬鐮�
                     UpdataFunctionStatus(receiveObj.BodyDataString, null);
                 }
-                else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity +"_reply"
+                else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity + "_reply"
                     || receiveObj.Topic == CommunicationTopic.ct.ReadSecurityStatus + "_reply"
                     || receiveObj.Topic == CommunicationTopic.ct.SecurityStatusUp)
                 {
@@ -993,7 +1028,8 @@
                     {
                         MainPage.Log($"灞�鍩熺綉瀹夐槻淇℃伅: {receiveObj.Topic}  : 鍐呭: {res[1]}");
                         var tt = "";
-                        lock (tt) {
+                        lock (tt)
+                        {
                             var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityStatusObj>(receiveObj.BodyDataString);
                             if (temp != null)
                             {
@@ -1012,8 +1048,16 @@
                             }
                         }
                     }
-                    catch (Exception ex){
+                    catch (Exception ex)
+                    {
                         MainPage.Log($"瀹夐槻灞�鍩熺綉寮傚父锛歿ex.Message}");
+                    }
+                }
+                else if (receiveObj.Topic == $"/user/{GatewayId}/custom/gateway/login_reply") {
+                    var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<JObject>(receiveObj.BodyDataString);
+                    if (temp.GetValue("objects").ToString().Contains("success"))
+                    {
+                        LocalTcpClientLogin = true;
                     }
                 }
                 else
@@ -1025,6 +1069,29 @@
             return receiveObj;
         }
 
+
+        private List<string> processedDataList = new List<string>();
+        /// <summary>
+        /// 鏄惁宸茬粡澶勭悊杩囨暟鎹�
+        /// </summary>
+        /// <returns></returns>
+        private bool hasItBeenProcessed(string msgId)
+        {
+            if (processedDataList.Contains(msgId))
+            {
+                return true;
+            }
+            else
+            {
+                if(processedDataList.Count> 50)
+                {
+                    processedDataList.RemoveAt(0);
+                }
+                return false;
+            }
+
+        }
+
         /// <summary>
         /// 鏇存柊璁惧鐘舵��
         /// A鍗忚鏁版嵁
diff --git a/HDL_ON/DAL/DriverLayer/Control_Tcp.cs b/HDL_ON/DAL/DriverLayer/Control_Tcp.cs
new file mode 100644
index 0000000..481c997
--- /dev/null
+++ b/HDL_ON/DAL/DriverLayer/Control_Tcp.cs
@@ -0,0 +1,811 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Net.Sockets;
+using System.Text;
+using System.Threading;
+using System.Timers;
+using HDL_ON;
+using HDL_ON.Entity;
+using HDL_ON.UI;
+
+namespace HDL_ON.DriverLayer
+{
+    /// <summary>
+    /// link缃戝叧鏈湴閾炬帴閫昏緫
+    /// </summary>
+    public class Control_Tcp
+    {
+        #region 鈻� 鍙橀噺澹版槑___________________________
+
+        /// <summary>
+        /// link缃戝叧閾炬帴閫昏緫
+        /// </summary>
+        private static Control_Tcp m_Current = null;
+        /// <summary>
+        /// link缃戝叧閾炬帴閫昏緫
+        /// </summary>
+        public static Control_Tcp Current
+        {
+            get
+            {
+                if (m_Current == null)
+                {
+                    m_Current = new Control_Tcp();
+                }
+                return m_Current;
+            }
+        }
+        /// <summary>
+        /// Link缃戝叧tcp鎺ユ敹鍥炶皟,鐞嗚涓婂畠涓嶄細澶勭悊zigbee鐨勪笂鎶�(绗竴涓弬鏁版槸缃戝叧鐨刴ac,绗簩涓弬鏁版槸鎺ユ敹鐨勬暟鎹�)
+        /// </summary>
+        private Action<string, string, string> tcpReceiveEvent = null;
+        /// <summary>
+        /// Tcp瀹㈡埛绔繛鎺ユ睜
+        /// </summary>
+        private List<TcpConnectData> listTcpClient = new List<TcpConnectData>();
+        /// <summary>
+        /// 鏄惁鎼滅储缃戝叧
+        /// </summary>
+        private bool isSearchGateway = false;
+
+        #endregion
+
+        #region 鈻� 鎼滅储Link缃戝叧_______________________
+
+//        /// <summary>
+//        /// 鎼滅储Link缃戝叧
+//        /// </summary>
+//        /// <param name="resultEvent">鎼滅储鍒扮綉鍏崇殑鍥炶皟鍑芥暟,-1:寮傚父浜� 1:鏀跺埌涓�涓狝缃戝叧</param>
+//        /// <param name="searchTime">鎼滅储鏃堕棿(绉�)</param>
+//        /// <param name="connectLocalOnly">褰撴悳绱㈠埌缃戝叧鏃�,鏄惁鍙繛鎺ユ湰鍦扮殑(涓嶈兘鐬庤繛鍏朵粬鐨勭綉鍏�,浣嗘槸缃戝叧鎼滅储鐣岄潰鐗规畩)</param>
+//        public void SearchLinkGateway(Action<int, AGatewayInfo> resultEvent, int searchTime, bool connectLocalOnly)
+//        {
+//            this.isSearchGateway = true;
+//            //绠椾簡,鍦ㄨ繖閲屽惎鍔ㄨ繙绋嬭繛鎺ュ惂,鍙嶆涔熷氨鎵ц涓�娆�
+//            HdlLinkCloudConnectLogic.Current.StartCloudMqttConnection();
+
+//            var listGateway = HdlLinkGatewayLogic.Current.GetAllLocalGateway();
+//            var dicGateway = new Dictionary<string, ZigBee.Device.LinkGateway>();
+//            foreach (var gw in listGateway)
+//            {
+//                //鑾峰彇鏈湴鍏ㄩ儴鐨凙缃戝叧鐨刴ac
+//                dicGateway[gw.GwMac] = gw;
+//            }
+//            //閲嶅妫�娴�
+//            var listCheck = new HashSet<string>();
+
+//            var sendData = "Topic:/user/all/custom/gateway/search\r\n";
+
+//            var dic = new Dictionary<string, string>();
+//            dic["id"] = HdlGatewayResourse.AGatewayLinkFlage;
+//            dic["time_stamp"] = HdlHttpLogic.Current.GetTimestamp().PadRight(13, '0');
+//            var bodyData = Newtonsoft.Json.JsonConvert.SerializeObject(dic);
+//            sendData += "Length:" + bodyData.Length + "\r\n\r\n";
+//            sendData += bodyData;
+
+//            //鍒濆鍖杣dp
+//            var udpLogic = new HdlUdpLogic();
+//            if (udpLogic.InitUdp("239.0.168.188", 8585) == false)
+//            {
+//                //鍏抽棴udp
+//                udpLogic.CloseUdp();
+
+//                resultEvent?.Invoke(-1, null);
+//                return;
+//            }
+
+//            HDL_ON.DriverLayer.Control.Ins.OpenUdp(8585);
+
+//            //鎺ユ敹浜嬩欢
+//            Action<System.Net.IPEndPoint, string> actionEvent = (ipPoint, result) =>
+//            {
+//                //澶勭悊鎼滅储A缃戝叧鏃�,缃戝叧鍥炲鐨勬暟鎹�
+//                try
+//                {
+//                    /////
+//                    System.Net.IPAddress s = ipPoint.Address;
+//                    MainPage.Log("TcpClient->SearchLinkGateway", $"{s}==缃戝叧鎼滅储鏈湴鍥炲,鏁版嵁鍐呭{result}");
+
+//                    //妫�楠孉鍗忚缃戝叧涓婚(濡傛灉妫�楠屾槸鎸囧畾涓婚,鍒欒繑鍥炶礋杞芥暟鎹�,鍚﹀垯杩斿洖null)
+//                    var resultData = HdlLinkGatewaySendLogic.Current.CheckLinkGatewayTopic("/user/all/custom/gateway/search_reply", result);
+//                    if (resultData == null) { return; }
+//                    //璋冪敤鍥炶皟鍑芥暟
+//                    var info = Newtonsoft.Json.JsonConvert.DeserializeObject<AGatewayInfo>(resultData);
+//                    if (info == null)
+//                    {
+//                        //鏁版嵁寮傚父锛岄��鍑�
+//                        return;
+//                    }
+//                    if (!(string.IsNullOrEmpty(info.HomeId) == true || info.HomeId == Common.Config.Instance.HomeId))
+//                    {
+//                        //缃戝叧宸茬粡缁戝畾鍏朵粬浣忓畢锛岄��鍑�
+//                        return;
+//                    }
+//                    ///tcp杩炴帴鐩爣璁惧鐨刬p
+//                    info.Ip_address = ipPoint.Address.ToString();
+//                    //鎼滅储鍒扮殑杩欎釜缃戝叧,鏄惁鏄瓨鍦ㄥ湪鏈湴浜嗙殑
+//                    if (dicGateway.ContainsKey(info.Device_mac) == true)
+//                    {
+//                        var gateWay = dicGateway[info.Device_mac];
+//                        //濡傛灉鎼滅储寰楀埌鏈湴瀛樺湪鐨勭綉鍏�,鍒欎娇鐢ㄦ湰鍦伴�氫俊
+//                        gateWay.OnlineStatu = 1;
+//                        gateWay.isLocalEncrypt = info.isLocalEncrypt;
+//                        gateWay.Master = info.Master;
+//                        //gateWay.Slaver_list1 = info.Slaver_list1;
+//                        gateWay.Oid = info.Oid;
+//                        gateWay.InGatewayHomeId = info.HomeId;
+//                        info.IsBindGateway = true;
+
+//                        Common.Config.Instance.Home.NowHomeOnlineStatu = "1";
+//                    }
+//                    //鎼滅储鍒扮殑缃戝叧,寤虹珛閾炬帴
+//                    if (connectLocalOnly == false || info.IsBindGateway == true)
+//                    {
+//                        this.ConnectLocalLinkGateway(info.Device_mac, info.Ip_address, info.GatewayId, info.isLocalEncrypt);
+//                    }
+//                    else
+//                    {
+//                        //鑾峰彇杩炴帴瀵硅薄
+//                        var connectObj = this.GetConnectObject(info.Device_mac, false);
+//                        if (connectObj != null)
+//                        {
+//                            //濡傛灉鏈夎繖涓璞�, 鍒欐浛鎹竴涓嬪畠鐨勭綉鍏砳d
+//                            connectObj.GatewayId = info.GatewayId;
+//                            connectObj.localEncrypt = info.isLocalEncrypt;
+//                            return;
+//                        }
+//                    }
+//                    if (listCheck.Contains(info.Device_mac) == true)
+//                    {
+//                        //宸茬粡澶勭悊杩囦簡
+//                        return;
+//                    }
+//                    listCheck.Add(info.Device_mac);
+
+
+//#if DEBUG
+//                    Console.WriteLine($"鎼滅储缃戝叧鎹曟姄鍒扮綉鍏�:{info.Device_mac}");
+//#endif
+//                    //info
+
+//                    //鍥炶皟鍑芥暟
+//                    resultEvent?.Invoke(1, info);
+//                }
+//                catch (Exception e)
+//                {
+//                    string str = e.Message;
+//                }
+//            };
+//            udpLogic.ReceviceEvent += actionEvent;
+//            var dateTime = System.DateTime.Now.AddSeconds(searchTime);
+//            while (this.isSearchGateway && System.DateTime.Now < dateTime)
+//            {
+//                udpLogic.SendData(sendData, "239.0.168.188", 8585);
+//                udpLogic.SendData(sendData, "255.255.255.255", 8585);
+//                System.Threading.Thread.Sleep(1000);
+//            }
+//            udpLogic.ReceviceEvent -= actionEvent;
+//            //鍒叧閭d箞蹇�
+//            System.Threading.Thread.Sleep(300);
+//            this.isSearchGateway = false;
+//            //鍏抽棴udp
+//            udpLogic.CloseUdp();
+
+//        }
+
+//        /// <summary>
+//        /// 鍋滄鎼滅储Link缃戝叧
+//        /// </summary>
+//        public void StopSearchLinkGateway()
+//        {
+//            this.isSearchGateway = false;
+//        }
+
+        #endregion
+
+        #region 鈻� 閾炬帴鏈湴Link缃戝叧___________________
+
+        /// <summary>
+        /// 閾炬帴Link缃戝叧
+        /// </summary>
+        /// <param name="i_mac">缃戝叧mac</param>
+        /// <param name="i_ipAdrr">缃戝叧ip</param>
+        /// <param name="i_gwId">缃戝叧Id</param>
+        /// <param name="isBinded">璇cp鎵�鎸囧悜鐨勭綉鍏�,鏄惁鏄綋鍓嶄綇瀹呮墍缁戝畾鐨�</param>
+        /// <returns></returns>
+        public void ConnectLocalLinkGateway(string i_mac, string i_ipAdrr, string i_gwId, bool localEncrypt)
+        {
+            if (i_mac == string.Empty || i_ipAdrr == string.Empty)
+            {
+                return;
+            }
+            var connectData = new TcpConnectData();
+            connectData.GatewayId = i_gwId;
+            connectData.GatewayIp = i_ipAdrr;
+            connectData.GatewayMac = i_mac;
+            connectData.localEncrypt = localEncrypt;
+            lock (this.listTcpClient)
+            {
+                //鎵惧埌褰撳墠缃戝叧鐨勮繛鎺�
+                if (this.listTcpClient.Find((v) => v.GatewayMac == i_mac) != null)
+                {
+                    return;
+                }
+                this.listTcpClient.Add(connectData);
+            }
+
+            try
+            {
+                //TCP杩炴帴
+                connectData.tcpClient = new Communication.TcpClient(i_ipAdrr, 8586);
+                connectData.tcpClient.Connect();
+                connectData.tcpClient.ReadFormSocket();
+                connectData.tcpClient.ExitEvent += (s, e) =>
+                {
+                    StopConnectLinkGateway(connectData);
+                };
+                connectData.tcpClient.ReceiveBytesAction += (topic, bytes, socket) =>
+                {
+                    managerLinkGatewayData(topic, bytes, socket);
+                };
+
+
+            }
+            catch
+            {
+#if DEBUG
+                //HdlMessageLogic.Current.ShowMassage(ShowMsgType.Tip, i_ipAdrr + "Tcp閾炬帴涓嶄簡");
+#endif
+                StopConnectLinkGateway(connectData);
+            }
+        }
+
+        public TcpConnectData GetConnectObjectBySocket(Socket socket)
+        {
+            lock (listTcpClient)
+            {
+                var tcpConnectData = listTcpClient.Find(tcd => tcd.tcpClient._socket == socket);
+                return tcpConnectData;
+            }
+        }
+
+        /// <summary>
+        /// 鏂紑鍏ㄩ儴鐨凩ink缃戝叧杩炴帴
+        /// </summary>
+        public void StopAllConnectLinkGateway()
+        {
+            var listTemp = new List<TcpConnectData>();
+            for (int i = 0; i < this.listTcpClient.Count; i++)
+            {
+                //鍒涘彟澶栦竴涓璞″嚭鏉�,鏄湁浣滅敤鐨�
+                listTemp.Add(this.listTcpClient[i]);
+            }
+            foreach (var data in listTemp)
+            {
+                //鏂紑鎸囧畾鐨刲ink缃戝叧杩炴帴
+                this.StopConnectLinkGateway(data);
+            }
+            //娓呯┖缂撳瓨
+            this.listTcpClient.Clear();
+        }
+
+        /// <summary>
+        /// 鏂紑鎸囧畾鐨刲ink缃戝叧杩炴帴
+        /// </summary>
+        /// <param name="mac">闇�瑕佹柇寮�杩炴帴鐨勭綉鍏砿ac</param>
+        public void StopConnectLinkGateway(string mac)
+        {
+            var tempGateway = listTcpClient.Find((v) => v.GatewayMac == mac);
+            if (tempGateway != null)
+            {
+                //鏂紑鎸囧畾鐨刲ink缃戝叧杩炴帴
+                this.StopConnectLinkGateway(tempGateway);
+            }
+        }
+
+        /// <summary>
+        /// 鏂紑鎸囧畾鐨刲ink缃戝叧杩炴帴
+        /// </summary>
+        /// <param name="connectData">杩炴帴鏁版嵁</param>
+        private void StopConnectLinkGateway(TcpConnectData connectData)
+        {
+            lock (listTcpClient)
+            {
+                this.listTcpClient.Remove(connectData);
+                connectData.tcpClient.Dispose();
+            }
+        }
+
+        #endregion
+
+        #region 鈻� 鍙戦�佹暟鎹埌Link缃戝叧_________________
+        /// <summary>
+        /// 鍙戦�佹暟鎹埌鏈湴Link缃戝叧
+        /// </summary>
+        /// <param name="connectData">閾炬帴淇℃伅</param>
+        /// <param name="sendData">鍙戦�佺殑鏁版嵁</param>
+        /// <returns></returns>
+        private void DoSendDataToLinkGateway(TcpConnectData connectData, string sendData)
+        {
+#if DEBUG
+            MainPage.Log(DateTime.Now + ":TcpClient->DoSendDataToLinkGateway", $"鏈湴鍙戦�佹暟鎹紝Data:{sendData}");
+#endif
+            byte[] byteData;
+            //44bytes 鍔犲瘑鏁版嵁 AES鍔犲瘑 base64瀵嗘枃
+            ////鐩墠榛樿閮芥槸鍔犲瘑杞借嵎
+            //byteData = this.AesEncryptPayload(byteData, Config.Instance.Home.localSecret);
+            //瑙e瘑璐熻浇鏁版嵁(鍥犱负鍐欏瘑閽ョ粰缃戝叧涓�瀹氭槑鏂囷紝鍥犱负閭f椂缃戝叧杩樻病鏈夊瘑閽�)
+            if (connectData.localEncrypt)
+            {
+                var headerAndBody = sendData.Split("\r\n\r\n");
+                string topic = headerAndBody[0].Split("\r\n")[0];
+                //鍔犲瘑杞借嵎
+                var byteBody = this.AesEncryptPayload(System.Text.Encoding.UTF8.GetBytes(headerAndBody[1]), DB_ResidenceData.Instance.CurrentRegion.localSecret);
+                var header = System.Text.Encoding.UTF8.GetBytes($"{topic}\r\nLength:{byteBody.Length}\r\n" + "\r\n");
+
+                byteData = new byte[header.Length + byteBody.Length];
+                System.Array.Copy(header, 0, byteData, 0, header.Length);
+                ///鍙傛暟锛堟簮鏂囦欢锛屽彇婧愭枃浠剁储寮曞�硷紝瀛樺偍鍣紝瀛樻斁浣嶇疆锛屾簮鏂囦欢闀垮害锛�
+                System.Array.Copy(byteBody, 0, byteData, header.Length, byteBody.Length);
+
+            }
+            else
+            {
+                byteData = Encoding.UTF8.GetBytes(sendData);
+            }
+
+            //byteData = Encoding.UTF8.GetBytes(sendData);
+            //灏嗘暟鎹啓鍏ョ綉缁滄祦
+            connectData.tcpClient?.CommSend(byteData, byteData.Length);
+        }
+
+        #endregion
+
+        #region 鈻� 澶勭悊Link缃戝叧鐨勬暟鎹甠________________
+
+        /// <summary>
+        /// 澶勭悊鎺ユ敹鏈湴Link缃戝叧鐨勬暟鎹�(杩斿洖鍊� 0:杩樹笉瀛樺湪瀹屾垚鐨勬暟鎹�  1:宸茬粡瀛樺湪瀹屾垚鐨勬暟鎹�)
+        /// </summary>
+        /// <param name="listByte">鏁版嵁</param>
+        private void managerLinkGatewayData(string topic, byte[] bytes, Socket socket)
+        {
+            try
+            {
+                var arryTopic = topic.Split(new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries);
+                if (arryTopic.Length < 2)
+                {
+                    //闈炴瑙勪富棰�
+                    return;
+                }
+           
+
+                var connectData = this.GetConnectObjectBySocket(socket);
+                if (connectData == null)
+                {
+                    return;
+                }
+                string gatewayMac = connectData.GatewayMac;
+                string gatewayId = connectData.GatewayId;
+                ///瑙e瘑璐熻浇鏁版嵁
+                if (connectData.localEncrypt == true)
+                {
+                    var tempBytes = bytes;
+                    bytes = this.AesDecryptPayload(bytes, DB_ResidenceData.Instance.CurrentRegion.localSecret);
+                    if (bytes == null)
+                    {
+                        bytes = tempBytes;
+                    }
+                }
+                /////鐩墠缃戝叧榛樿閮芥槸鍔犲瘑鐨�
+                //bytes = this.AesDecryptPayload(bytes, Config.Instance.Home.localSecret);
+                var bodyData = System.Text.Encoding.UTF8.GetString(bytes);
+
+                MainPage.Log(DateTime.Now + ":Control_Tcp->鏈湴鎺ユ敹鏁版嵁", $"Topic:{topic}\r\nData:{bodyData}");
+               
+                if (topic.Contains("thing/property/up") == true)
+                {
+                    //杩欎釜鏄疞ink璁惧鐨勭姸鎬佷笂鎶�,鍒暣,鍙zigbee鐨�
+                    var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(bodyData);
+
+                    return;
+                }
+
+            }
+            catch (Exception e)
+            {
+            }
+        }
+
+
+        #endregion
+
+        #region 鈻� 缁撴瀯浣揰____________________________
+
+
+        /// <summary>
+        /// Tcp杩炴帴淇℃伅
+        /// </summary>
+        public class TcpConnectData
+        {
+            /// <summary>
+            /// 缃戝叧鐨刴ac(涓婚敭浣跨敤)
+            /// </summary>
+            public string GatewayMac = string.Empty;
+            /// <summary>
+            /// 缃戝叧ip
+            /// </summary>
+            public string GatewayIp = string.Empty;
+            /// <summary>
+            /// 缃戝叧Id(涓嶆槸浜戠鐨勯偅涓�)
+            /// </summary>
+            public string GatewayId = string.Empty;
+
+            //
+            public Communication.TcpClient tcpClient;
+
+            /// <summary>
+            /// 鏈湴鏄惁鍔犲瘑
+            /// </summary>
+            public bool localEncrypt;
+        }
+        #endregion
+
+        #region 鈻� 鍔犲瘑浠ュ強瑙e瘑_______________________
+
+        /// <summary>
+        /// 鍔犲瘑璐熻浇涓轰簩杩涘埗娴�(Link涓撶敤)
+        /// </summary>
+        /// <param name="toEncryptArray"></param>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        private byte[] AesEncryptPayload(byte[] toEncryptArray, string key)
+        {
+            //鍔犲瘑瀵嗛挜涓虹┖
+            if (key == string.Empty)
+            {
+                return toEncryptArray;
+            }
+            try
+            {
+                if (string.IsNullOrEmpty(key)) return toEncryptArray;
+                //閰嶇疆AES鍔犲瘑Key(瀵嗛挜銆佸悜閲忋�佹ā寮忋�佸~鍏�)
+                var rm = new System.Security.Cryptography.RijndaelManaged
+                {
+                    Key = Encoding.UTF8.GetBytes(key),
+                    IV = Encoding.UTF8.GetBytes(key),
+                    Mode = System.Security.Cryptography.CipherMode.CBC,
+                    Padding = System.Security.Cryptography.PaddingMode.PKCS7
+                };
+
+                //鍒涘缓AES鍔犲瘑鍣ㄥ璞�
+                var cTransform = rm.CreateEncryptor();
+                //浣跨敤AES灏嗘槑鏂囨祦杞垚瀵嗘枃瀛楄妭鏁扮粍
+                return cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+        /// <summary>
+        /// 閲囩敤Aes瑙e瘑璐熻浇鏁版嵁(Link涓撶敤)
+        /// </summary>
+        /// <param name="toEncryptArray"></param>
+        /// <param name="key"></param>
+        /// <returns></returns>
+        private byte[] AesDecryptPayload(byte[] toEncryptArray, string key)
+        {
+            //瑙e瘑瀵嗛挜涓虹┖
+            if (key == string.Empty)
+            {
+                return toEncryptArray;
+            }
+
+            try
+            {
+                //閰嶇疆AES鍔犲瘑Key(瀵嗛挜銆佸悜閲忋�佹ā寮忋�佸~鍏�)
+                var rm = new System.Security.Cryptography.RijndaelManaged
+                {
+                    Key = Encoding.UTF8.GetBytes(key),
+                    IV = Encoding.UTF8.GetBytes(key),
+                    Mode = System.Security.Cryptography.CipherMode.CBC,
+                    Padding = System.Security.Cryptography.PaddingMode.PKCS7
+                };
+
+                //鍒涘缓AES瑙e瘑鍣ㄥ璞�
+                var cTransform = rm.CreateDecryptor();
+
+                //浣跨敤AES灏嗗瘑鏂囨祦杞垚鏄庢枃鐨勫瓧鑺傛暟缁�
+                return cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
+            }
+            catch
+            {
+                return null;
+            }
+        }
+
+        #endregion
+
+    }
+}
+namespace Communication
+{
+    //TCP瀹㈡埛绔疄鐜�
+    public class TcpClient
+    {
+        private const int MAX_RECONNECT_TIMES = 3;  //鏂嚎閲嶈繛灏濊瘯娆℃暟
+
+        //soket瀵硅薄鍙婂弬鏁�
+        public Socket _socket;
+        private string host;
+        private int port;
+        private bool reconnect;
+        private bool run = true;
+        private int ConnecteFailedCount { get; set; }
+        public int ReconnectStatistics { get; private set; }
+
+        private static uint _keepAliveTime = 5000;      //鏃犳暟鎹氦浜掓寔缁椂闂�(ms)
+        private static uint _keepAliveInterval = 500;   //鍙戦�佹帰娴嬪寘闂撮殧(ms)
+
+        //閲嶈繛澶辫触浜嬩欢
+        public event EventHandler ExitEvent;
+        public Action<string, byte[], Socket> ReceiveBytesAction;
+
+        //鏋勯�犲嚱鏁�
+        public TcpClient(string host, int port)
+        {
+            this.host = host;
+            this.port = port;
+            reconnect = false;
+            ConnecteFailedCount = 0;
+        }
+
+        //杩炴帴
+        public void Connect()
+        {
+            byteList = new List<byte>(1024 * 5);
+            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
+                ProtocolType.Tcp);
+            _socket.Connect(host, port);
+            MainPage.Log("TcpClient->Reconnect", $"杩炴帴鎴愬姛锛孖P:{host}");
+            ConnecteFailedCount = MAX_RECONNECT_TIMES;
+
+            //璁剧疆KeepAlive
+            _socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
+            byte[] optionValue = new byte[12];
+            BitConverter.GetBytes(1).CopyTo(optionValue, 0);
+            BitConverter.GetBytes(_keepAliveTime).CopyTo(optionValue, 4);
+            BitConverter.GetBytes(_keepAliveInterval).CopyTo(optionValue, 8);
+            _socket.IOControl(IOControlCode.KeepAliveValues, optionValue, null);
+        }
+
+        //閲嶈繛
+        public bool Reconnect()
+        {
+            ReconnectStatistics++;
+            reconnect = false;
+            close();
+            try
+            {
+                MainPage.Log("TcpClient->Reconnect", $"閲嶆柊寮�濮嬭繛鎺ワ紝IP:{host}");
+                Connect();
+            }
+            catch (Exception e)
+            {
+                ConnecteFailedCount--;
+                if (ConnecteFailedCount > 0)
+                {
+                    //Console.WriteLine("閲嶈瘯娆℃暟鍓╀綑{0}",ConnecteFailedCount);
+                    reconnect = true;
+                    return true;
+                }
+                else
+                {
+                    //閲嶈繛澶辫触浜嬩欢
+                    return false;
+                }
+            }
+            return true;
+        }
+
+        /// <summary>
+        /// 鍏抽棴
+        /// </summary>
+        private void close()
+        {
+            try
+            {
+                MainPage.Log("TcpClient->Close", $"Socket 鍏抽棴锛孖P:{host}");
+                _socket.Close();
+            }
+            catch { }
+        }
+
+
+        /// <summary>
+        /// 閲婃斁璧勬簮
+        /// </summary>
+        public void Dispose()
+        {
+            run = false;
+            close();
+        }
+
+
+        //鍙戦�佹暟鎹帴鏀跺疄鐜�,鏂嚎閲嶈繛
+        public int CommSend(byte[] buffer, int size)
+        {
+            int sendSize = 0;
+            try
+            {
+                if (_socket.Connected)
+                {
+                    sendSize = _socket.Send(buffer, size, SocketFlags.None);
+                }
+            }
+            catch (Exception e)
+            {
+                MainPage.Log("TcpClient->CommSend", $"鍙戦�佸け璐ワ紝Data:{System.Text.Encoding.UTF8.GetString(buffer)} Exception:{e.Message}");
+                ReconnectStatistics++;
+                reconnect = true;
+            }
+            return sendSize;
+        }
+
+        List<byte> byteList = new List<byte>();
+        //鎺ユ敹鏁版嵁绾跨▼,浣跨敤闃诲鏂瑰紡鎺ユ敹鏁版嵁
+        public void ReadFormSocket()
+        {
+            new System.Threading.Thread(() =>
+            {
+                int count;
+                byte[] byteBuffer = new byte[2048];
+
+                while (run)
+                {
+                    try
+                    {
+                        try
+                        {
+                            count = _socket.Receive(byteBuffer, SocketFlags.None);
+                            for (int i = 0; i < count; i++)
+                            {
+                                byteList.Add(byteBuffer[i]);
+                            }
+                        }
+                        catch (Exception e)
+                        {
+                            count = 0;
+                        }
+
+                        //缃戠粶鏂紑Receive杩斿洖0
+                        if (count == 0 || reconnect == true)
+                        {
+                            if (run)
+                            {
+                                //閲嶈繛娆℃暟鐢ㄥ敖,閫�鍑�
+                                if (Reconnect() == false)
+                                {
+                                    //閫氱煡鍏跺畠鍔熻兘閲婃斁鍙婂垹闄ゅ綋鍓嶅璞�
+                                    ExitEvent?.Invoke(null, new EventArgs());
+                                    break;
+                                }
+                            }
+                            else
+                            {
+                                ExitEvent?.Invoke(null, new EventArgs());
+                            }
+                        }
+                        else
+                        {
+
+                            while (true)
+                            {
+                                var bytes = byteList.ToArray();
+                                var topMsgs = System.Text.Encoding.UTF8.GetString(bytes).Split("\r\n");
+
+                                var lenght = getLenght(topMsgs);
+
+                                if (lenght <= 0)
+                                {
+                                    //澶撮儴鏁版嵁杩樻病鏈夋帴鏀跺畬鎴�
+                                    break;
+                                }
+                                //鏄惁宸茬粡鑾峰彇瀹屾暣鎵�鏈夌殑鏁版嵁
+                                var data = new byte[lenght];
+                                int index = getDataIndex(byteList);
+                                if (byteList.Count < index + lenght)
+                                {
+                                    //褰撳墠鏁版嵁杩樻病鏈夋帴鏀跺畬鎴�
+                                    break;
+                                }
+                                //澶嶅埗鍑篵ody鏁版嵁
+                                System.Array.Copy(bytes, index, data, 0, data.Length);
+
+                                //淇濈暀鍓╀綑鐨勬暟鎹紝浠ユ鐢�
+                                byteList.Clear();
+                                for (int i = index + lenght; i < bytes.Length; i++)
+                                {
+                                    byteList.Add(bytes[i]);
+                                }
+                                var topic = getTopic(topMsgs);
+
+                                ReceiveBytesAction?.Invoke(topic, data, _socket);
+                            }
+                        }
+                    }
+                    catch (Exception e)
+                    {
+                        MainPage.Log("TcpClient->ReadFormSocket", $"Exception:{e.Message}");
+                    }
+                }
+            })
+            {
+                IsBackground = true
+            }.Start();
+
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍐呭闀垮害
+        /// </summary>
+        /// <param name="topMsgs"></param>
+        /// <returns></returns>
+        int getLenght(string[] topMsgs)
+        {
+            for (int i = 0; i < topMsgs.Length; i++)
+            {
+                string topMsg = topMsgs[i].Trim();
+                if (topMsg.StartsWith("Length:"))
+                {
+                    return int.Parse(topMsg.Replace("Length:", ""));
+                }
+            }
+            //鎵句笉鍒伴暱搴�
+            return -1;
+        }
+
+        /// <summary>
+        /// 鑾峰彇涓婚
+        /// </summary>
+        /// <param name="topMsgs"></param>
+        /// <returns></returns>
+        private string getTopic(string[] topMsgs)
+        {
+            for (int i = 0; i < topMsgs.Length; i++)
+            {
+                var topMsg = topMsgs[i].Trim();
+                if (topMsg.StartsWith("Topic:"))
+                {
+                    return topMsg.Replace("Topic:", "");
+                }
+            }
+            //鎵句笉鍒颁富棰�
+            return null;
+        }
+
+        /**
+         * 鑾峰彇鏁版嵁鐨勫紑濮嬩綅缃�
+         * @param arrayList 鎺ユ敹鍒扮殑鎵�鏈夋暟鎹�
+         * @return 鏁版嵁浣嶇殑寮�濮嬬储寮�
+         */
+        int getDataIndex(List<byte> arrayList)
+        {
+            var r = (byte)'\r';
+            var n = (byte)'\n';
+            for (int i = 0; i < arrayList.Count; i++)
+            {
+                //鎵惧嚭鏁版嵁鍐呭鍓嶉潰鐨勪袱涓崲琛�
+                if (3 <= i && arrayList[i - 3] == r && arrayList[i - 2] == n && arrayList[i - 1] == r && arrayList[i] == n)
+                {
+                    //鍓╀綑鐨勬暟鎹�
+                    return i + 1;
+                }
+            }
+            return -1;
+        }
+
+
+    }
+}
diff --git a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
index aa8aeff..d6f61f1 100644
--- a/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
+++ b/HDL_ON/DAL/DriverLayer/Control_TcpClient.cs
@@ -1,7 +1,11 @@
 锘縰sing System;
+using System.Collections.Generic;
 using System.Net;
 using System.Net.Sockets;
+using System.Threading;
 using System.Threading.Tasks;
+using HDL_ON.Entity;
+using Newtonsoft.Json;
 
 namespace HDL_ON.DriverLayer
 {
@@ -18,6 +22,16 @@
         public Action<string> ReceiveEvent;
 
         /// <summary>
+        /// 杩炴帴娆℃暟
+        /// </summary>
+        private int reconnectIndex = 0;
+        /// <summary>
+        /// 鏄惁杩炴帴鎴愬姛
+        /// </summary>
+        public bool isConnected = false;
+
+
+        /// <summary>
         /// 鏋勯�犲嚱鏁�
         /// </summary>
         public Control_TcpClient(string serverIp)
@@ -26,18 +40,22 @@
         }
 
         //TCP杩炴帴
-        public bool Connect(int _port = 8586)
+        private bool ConnectToTcp( )
         {
-            if (string.IsNullOrEmpty(_ip) || _port == 0)
+            if (string.IsNullOrEmpty(_ip) )
             {
                 return false;
             }
-            _tcpClient = new TcpClient();
+            if (_tcpClient == null)
+            {
+                _tcpClient = new TcpClient();
+            }
             try
             {
-                _tcpClient.Connect(IPAddress.Parse(_ip), _port);
+                _tcpClient.Connect(IPAddress.Parse(_ip), 8586);
                 Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅
-                MainPage.Log($"鎵撳紑tcp client{_ip}:{_port}");
+                MainPage.Log($"鎵撳紑tcp client{_ip}:8586");
+                isConnected = true;
             }
             catch (Exception e)
             {
@@ -46,6 +64,53 @@
             }
             return true;//杩斿洖杩炴帴鐘舵��
         }
+        /// <summary>
+        /// 杩炴帴tcp绾跨▼
+        /// </summary>
+        private Thread connectThread;
+
+        /// <summary>
+        /// 杩炴帴绾跨▼
+        /// </summary>
+        public void Connect()
+        {
+            if(connectThread == null)
+            {
+                connectThread = new Thread(() => {
+                    while (Control.Ins.GatewayOnline_Local)
+                    {
+                        if (_tcpClient == null)
+                        {
+                            ConnectToTcp();
+                        }
+                        else
+                        {
+                            if (!_tcpClient.Connected)
+                            {
+                                try
+                                {
+                                    //_tcpClient.ReceiveTimeout = 
+                                    _tcpClient.Connect(IPAddress.Parse(_ip), 8586);
+                                    Task.Run(new Action(ReceiveMessage));//寮�鍚嚎绋嬶紝涓嶅仠鎺ユ敹娑堟伅
+                                }
+                                catch (Exception ex)
+                                {
+                                    MainPage.Log($"tcp閲嶈繛寮傚父:{ex.Message}");
+                                    _tcpClient.Close();
+                                    _tcpClient = null;
+                                }
+                            }
+                        }
+                        Thread.Sleep(1000);
+
+
+                    }
+                });
+                connectThread.Start();
+            }
+        }
+
+
         /// <summary>
         /// 鍏抽棴杩炴帴
         /// </summary>
@@ -65,67 +130,76 @@
         /// <param name="bytes">闇�瑕佸彂閫佺殑瀛楄妭</param>
         public void SendMessage(byte[] bytes)
         {
-            NetworkStream networkStream = _tcpClient.GetStream();
-            if (networkStream.CanWrite)
+            if (_tcpClient.GetStream().CanWrite)
             {
-                networkStream.Write(bytes, 0, bytes.Length);
+                _tcpClient.GetStream().Write(bytes, 0, bytes.Length);
             }
-            //networkStream.Close();
         }
-
         /// <summary>
-        /// 鑾峰彇鍒楄〃鏁版嵁鍥炶皟鏂规硶
+        /// 蹇冭烦鍖呯嚎绋�
         /// </summary>
-        public Action<string> GetListResponseAction;
+        private Thread heartBeatThread;
+        private DateTime heartBeatTime;
+        public void HeartBeat()
+        {
+            if(heartBeatThread == null)
+            {
+                heartBeatThread = new Thread(() => {
+                    if(_tcpClient.Connected&&10 *1000 <(System.DateTime.Now - heartBeatTime).TotalMilliseconds)
+                    {
+                        var sendBytes = Control.Ins.ConvertSendBodyData(CommunicationTopic.ct.HeartBeat, "");
+                        SendMessage(sendBytes);
+                    }
+                    Thread.Sleep(100);
+                });
+                heartBeatThread.Start();
+            }
+        }
+        /// <summary>
+        /// 鎺ユ敹鏁版嵁绾跨▼
+        /// </summary>
+        private Thread receiveThread;
+
         //鎺ユ敹娑堟伅
         public void ReceiveMessage()
         {
-            NetworkStream networkStream = _tcpClient.GetStream();
-            while (true)
+            if(receiveThread == null)
             {
-                // 瀹氫箟涓�涓�2M鐨勭紦瀛樺尯锛�
-                byte[] arrMsgRec = new byte[1024 * 1024 * 2];
-                int size = networkStream.Read(arrMsgRec, 0, arrMsgRec.Length);
-                var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length);
-                if (!string.IsNullOrEmpty(tcpDataString))
-                {
-                    ReceiveEvent?.Invoke(tcpDataString);
-                }
+                receiveThread = new Thread(() => {
+                    while (true)
+                    {
+                        if(_tcpClient == null)
+                        {
+                            receiveThread.Abort();
+                            receiveThread = null;
+                            return;
+                        }
+                        if (!_tcpClient.Connected)
+                        {
+                            MainPage.Log("tcp瀹㈡埛绔柇寮�浜嗚繛鎺�...");
+                            receiveThread.Abort();
+                            receiveThread = null;
+                            isConnected = false;
+                            return;
+                        }
 
-                //// 灏嗘帴鍙楀埌鐨勬暟鎹瓨鍏ュ埌杈撳叆  arrMsgRec涓紱
-                //int length = -1;
-                //try
-                //{
-                //    length = socketClient.Receive(arrMsgRec); // 鎺ユ敹鏁版嵁锛屽苟杩斿洖鏁版嵁鐨勯暱搴︼紱
-                //}
-                //catch (Exception ex)
-                //{
-                //    MainPage.Log($"tcpListener  error 1 :  {ex.Message}");
+                        // 瀹氫箟涓�涓�2M鐨勭紦瀛樺尯锛�
+                        byte[] arrMsgRec = new byte[1024 * 1024 * 2];
+                        int size = _tcpClient.GetStream().Read(arrMsgRec, 0, arrMsgRec.Length);
+                        var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, arrMsgRec.Length);
 
-                //    Flag_Receive = false;
-                //    // 浠庨�氫俊绾跨▼闆嗗悎涓垹闄よ涓柇杩炴帴鐨勯�氫俊绾跨▼瀵硅薄锛�
-                //    string keystr = socketClient.RemoteEndPoint.ToString();
-                //    dic_ClientSocket.Remove(keystr);//鍒犻櫎瀹㈡埛绔瓧鍏镐腑璇ocket
-                //    dic_ClientThread[keystr].Abort();//鍏抽棴绾跨▼
-                //    dic_ClientThread.Remove(keystr);//鍒犻櫎瀛楀吀涓绾跨▼
 
-                //    tcpClient = null;
-                //    socketClient = null;
-                //    break;
-                //}
-                //byte[] buf = new byte[length];
-                //Array.Copy(arrMsgRec, buf, length);
-                //lock (tcpClient.m_Buffer)
-                //{
-                //    var tcpDataString = System.Text.Encoding.UTF8.GetString(arrMsgRec, 0, length);
-                //    if (!string.IsNullOrEmpty(tcpDataString))
-                //    {
-                //        ReceiveEvent?.Invoke(tcpDataString);
-                //    }
+                        if (!string.IsNullOrEmpty(tcpDataString))
+                        {
+                            MainPage.Log($"灞�鍩熺綉tcp鏁版嵁鎺ユ敹");
+                            Control.Ins.ConvertReceiveData(arrMsgRec, null);
 
-                //    MainPage.Log($"鎺ユ敹鏈嶅姟绔暟鎹�:{tcpDataString}");
-                //}
+                        }
+                    }
 
+                });
+                //receiveThread.IsBackground = true;
+                receiveThread.Start();
             }
         }
 
diff --git a/HDL_ON/DAL/DriverLayer/Control_TcpServer.cs b/HDL_ON/DAL/DriverLayer/Control_TcpServer.cs
index 295098b..1c4daa9 100644
--- a/HDL_ON/DAL/DriverLayer/Control_TcpServer.cs
+++ b/HDL_ON/DAL/DriverLayer/Control_TcpServer.cs
@@ -183,7 +183,7 @@
         {
             MainPage.Log($"0001 tcpDataString:\r\n {tcpBodyDataString}");
             var tcpDataObj = Control.Ins.AnalysisReceiveData(tcpBodyDataString, null);
-            if (tcpDataObj.BodyDataString == null)
+            if (tcpDataObj==null || tcpDataObj.BodyDataString == null)
             {
                 return;
             }
diff --git a/HDL_ON/DAL/DriverLayer/UdpSocket.cs b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
index e358428..f0893ff 100644
--- a/HDL_ON/DAL/DriverLayer/UdpSocket.cs
+++ b/HDL_ON/DAL/DriverLayer/UdpSocket.cs
@@ -138,6 +138,7 @@
 				//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绔彛鐨勬暟鎹�
diff --git a/HDL_ON/DAL/Server/HttpServerRequest.cs b/HDL_ON/DAL/Server/HttpServerRequest.cs
index 3a6d450..a01cdae 100644
--- a/HDL_ON/DAL/Server/HttpServerRequest.cs
+++ b/HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -340,6 +340,20 @@
             var requestJson = HttpUtil.GetSignRequestJson(requestObj);
             return HttpUtil.RequestHttpsPost(NewAPI.API_POST_Member_ForgetPwd, requestJson);
         }
+        /// <summary>
+        /// 淇敼瀵嗙爜
+        /// </summary>
+        /// <param name="loginPwd"></param>
+        /// <param name="loginNewPwd"></param>
+        /// <returns></returns>
+        public ResponsePackNew UpdataPassword(string loginPwd,string loginNewPwd)
+        {
+            Dictionary<string, object> d = new Dictionary<string, object>();
+            d.Add("loginPwd", loginPwd);
+            d.Add("loginNewPwd", loginNewPwd);
+            var requestJson = HttpUtil.GetSignRequestJson(d);
+            return HttpUtil.RequestHttpsPost(NewAPI.API_POST_Update_Pwd, requestJson);
+        }
 
         /// <summary>
         /// 楠岃瘉楠岃瘉鐮�
@@ -2682,10 +2696,10 @@
         /// 璁剧疆绗笁鏂硅澶囩粦瀹氱殑浣忓畢
         /// </summary>
         /// <returns></returns>
-        public ResponsePackNew Set3tyIotFunctionToHouse(string deviceId,string homeId, string companyId)
+        public ResponsePackNew Set3tyIotFunctionToHouse(List<string> deviceIds,string homeId, string companyId)
         {
             Dictionary<string, object> d = new Dictionary<string, object>();
-            d.Add("deviceId", deviceId);
+            d.Add("deviceIds", deviceIds);
             d.Add("homeId", homeId);
             d.Add("companyId", companyId);
             var requestJson = HttpUtil.GetSignRequestJson(d);
diff --git a/HDL_ON/Entity/Function/Scene.cs b/HDL_ON/Entity/Function/Scene.cs
index a7ac909..fadf04f 100644
--- a/HDL_ON/Entity/Function/Scene.cs
+++ b/HDL_ON/Entity/Function/Scene.cs
@@ -124,10 +124,7 @@
                     {
                         return sceneImageInfo.defaultIconName;
                     }
-                    else
-                    {
-                        return "Intelligence/Gallery/scenebg1.png";
-                    }
+                    return image;
                 }
             }
             set
diff --git a/HDL_ON/Entity/Integratedbrand/IntegratedBrand.cs b/HDL_ON/Entity/Integratedbrand/IntegratedBrand.cs
index 7ba544a..1df2dab 100644
--- a/HDL_ON/Entity/Integratedbrand/IntegratedBrand.cs
+++ b/HDL_ON/Entity/Integratedbrand/IntegratedBrand.cs
@@ -74,7 +74,7 @@
         /// <summary>
         /// 鍥剧墖url
         /// </summary>
-        public string authrBandIconUrl;
+        public string authBrandIconUrl; 
         /// <summary>
         /// 璁よ瘉鎺堟潈鍦板潃
         /// </summary>
diff --git a/HDL_ON/HDL_ON.projitems b/HDL_ON/HDL_ON.projitems
index 6002a93..b5c2981 100644
--- a/HDL_ON/HDL_ON.projitems
+++ b/HDL_ON/HDL_ON.projitems
@@ -512,6 +512,7 @@
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\Iot_BrandFunctionListPage.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\Iot_AuthorizedPage.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\AddFunction\Iot_SupportSpkListPage.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)DAL\DriverLayer\Control_Tcp.cs" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="$(MSBuildThisFileDirectory)Entity\Device\" />
diff --git a/HDL_ON/UI/MainPage.cs b/HDL_ON/UI/MainPage.cs
index 573664e..0b32010 100644
--- a/HDL_ON/UI/MainPage.cs
+++ b/HDL_ON/UI/MainPage.cs
@@ -465,6 +465,17 @@
         }
 
 
+        /// <summary>
+        /// 鑷畾涔夋棩蹇楄緭鍑�
+        /// </summary>
+        public static void Log(string tag,string msg)
+        {
+#if DEBUG
+            Console.WriteLine($"{tag}-->{msg}");
+#endif
+        }
+
+
     }
 
 }
\ No newline at end of file
diff --git a/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs b/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
index 1af093e..04c68ec 100644
--- a/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
+++ b/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
@@ -17,14 +17,14 @@
         /// <param name="updataFunction"></param>
         public void UpdataStates(Function updataFunction, FrameLayout view, VerticalScrolViewLayout scrolView, Room room = null)
         {
+            if (view == null || scrolView == null || updataFunction == null)
+            {
+                return;
+            }
             Application.RunOnMainThread((() =>
             {
                 try
                 {
-                    if (view == null || scrolView == null || updataFunction == null)
-                    {
-                        return;
-                    }
                     if (!scrolView.ScrollEnabled)
                     {
                         return;
diff --git a/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs b/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
index 2dfc170..232684e 100644
--- a/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
+++ b/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
@@ -185,7 +185,7 @@
             {
                 var btnHumidityIcon = new Button()
                 {
-                    X = Application.GetRealWidth(51),
+                    X = Application.GetRealWidth(110),
                     Y = Application.GetRealHeight(66),
                     Width = Application.GetMinRealAverage(16),
                     Height = Application.GetMinRealAverage(16),
@@ -194,7 +194,7 @@
                 bodyDiv.AddChidren(btnHumidityIcon);
                 var btnHumidityValues = new TextButton()
                 {
-                    X = Application.GetRealWidth(70),
+                    X = Application.GetRealWidth(130),
                     Y = Application.GetRealHeight(64),
                     Height = Application.GetRealHeight(18),
                     TextColor = 0xFF161616,
@@ -208,7 +208,7 @@
 
                 Button btnTempIcon = new Button()
                 {
-                    X = Application.GetRealWidth(110),
+                    X = Application.GetRealWidth(51),
                     Y = Application.GetRealHeight(66),
                     Width = Application.GetMinRealAverage(17),
                     Height = Application.GetMinRealAverage(17),
@@ -218,7 +218,7 @@
 
                 var btnTempValues = new TextButton()
                 {
-                    X = Application.GetRealWidth(130),
+                    X = Application.GetRealWidth(70),
                     Y = Application.GetRealHeight(64),
                     Height = Application.GetRealHeight(18),
                     TextColor = 0xFF161616,
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_AuthorizedPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_AuthorizedPage.cs
index e3c0244..809444b 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_AuthorizedPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_AuthorizedPage.cs
@@ -2,6 +2,7 @@
 using Shared;
 using HDL_ON.Entity;
 using HDL_ON.DAL.Server;
+using HDL_ON.UI.CSS;
 
 namespace HDL_ON.UI
 {
@@ -32,9 +33,99 @@
                 UnsubscribeAsync3tyIotbind();
                 Application.RunOnMainThread(() =>
                 {
-                    http.Search3tyIotDevice(brand_Iot.companyId);
+                    //http.Search3tyIotDevice(brand_Iot.companyId);
                     boudedAction?.Invoke();
                     dd.Close();
+
+
+
+                    {
+                        Dialog dialog = new Dialog()
+                        {
+                            BackgroundColor = CSS_Color.DialogTransparentColor1,
+                        };
+
+                        FrameLayout contentView = new FrameLayout()
+                        {
+                            Gravity = Gravity.Center,
+                            Width = Application.GetRealWidth(305),
+                            Height = Application.GetRealHeight(180),
+                            BackgroundColor = CSS.CSS_Color.MainBackgroundColor,
+                            BorderColor = 0x00000000,
+                            BorderWidth = 0,
+                            Radius = (uint)Application.GetMinRealAverage(10),
+                        };
+                        dialog.AddChidren(contentView);
+
+                        Button btnTitle = new Button()
+                        {
+                            Gravity = Gravity.CenterHorizontal,
+                            Y = Application.GetRealHeight(10),
+                            Height = Application.GetRealHeight(38),
+                            TextAlignment = TextAlignment.Center,
+                            IsBold = true,
+                            TextColor = 0xFF222222,
+                            TextSize = CSS_FontSize.SubheadingFontSize,
+                            TextID = StringId.Tip
+                        };
+                        contentView.AddChidren(btnTitle);
+
+                        Button btnMsg = new Button()
+                        {
+                            Gravity = Gravity.CenterHorizontal,
+                            Height = Application.GetRealHeight(70),
+                            Y = Application.GetRealHeight(55),
+                            TextAlignment = TextAlignment.TopCenter,
+                            TextColor = CSS_Color.FirstLevelTitleColor,
+                            TextSize = CSS_FontSize.SubheadingFontSize,
+                            Padding = new Padding(0, Application.GetRealWidth(16), 0, Application.GetRealWidth(16)),
+                            Text = "璐︽埛缁戝畾鎴愬姛锛屾偍鍙互缁х画瀹屾垚璁惧鍏宠仈鎿嶄綔",
+                            IsMoreLines = true,
+                        };
+                        contentView.AddChidren(btnMsg);
+                        if(Language.CurrentLanguage != "Chinese")
+                        {
+                            btnMsg.Text = "Account binding is successful.You can continue to complete the device association operation";
+                        }
+
+                        Button btnLine = new Button()
+                        {
+                            Y = Application.GetRealHeight(125),
+                            Height = Application.GetRealHeight(1),
+                            BackgroundColor = CSS.CSS_Color.DividingLineColor,
+                        };
+                        contentView.AddChidren(btnLine);
+
+                        Button btnConfirm = new Button()
+                        {
+                            Y = btnLine.Bottom,
+                            Height = Application.GetRealHeight(55),
+                            TextAlignment = TextAlignment.Center,
+                            TextColor = CSS_Color.MainColor,
+                            TextSize = CSS_FontSize.SubheadingFontSize,
+                            SelectedTextColor = CSS_Color.MainBackgroundColor,
+                            SelectedBackgroundColor = CSS_Color.MainColor,
+                            TextID = StringId.Confirm,
+                        };
+                        btnConfirm.SetCornerWithSameRadius(Application.GetMinRealAverage(10), HDLUtils.RectCornerBottomLeft);
+                        btnConfirm.SetCornerWithSameRadius(Application.GetMinRealAverage(10), HDLUtils.RectCornerBottomRight);
+                        contentView.AddChidren(btnConfirm);
+
+                        dialog.Show();
+
+                        btnConfirm.MouseDownEventHandler += (sender, e) =>
+                        {
+                            btnConfirm.IsSelected = true;
+                        };
+                        btnConfirm.MouseUpEventHandler += (sender, e) =>
+                        {
+                            dialog.Close();
+                        };
+
+                    }
+
+
+
                 });
             };
             SubscribeAsync3tyIotbind();
@@ -79,17 +170,16 @@
             })
             { IsBackground = true }.Start();
         }
-        /// <summary>
-        /// 鎼滅储绗笁鏂硅澶�
-        /// </summary>
-        private void SearchDevice()
-        {
-            var pack = http.Search3tyIotDevice(brand_Iot.companyId);
-            if(pack!= null)
-            {
-
-            }
-        }
+        ///// <summary>
+        ///// 鎼滅储绗笁鏂硅澶�
+        ///// </summary>
+        //private void SearchDevice()
+        //{
+        //    var pack = http.Search3tyIotDevice(brand_Iot.companyId);
+        //    if(pack!= null)
+        //    {
+        //    }
+        //}
 
         /// <summary>
         /// 鑾峰彇绗笁鏂瑰姛鑳藉垪琛�
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandFunctionListPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandFunctionListPage.cs
index 56c39d1..ea61167 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandFunctionListPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandFunctionListPage.cs
@@ -12,6 +12,7 @@
 
         FrameLayout contentView;
 
+        FrameLayout optionView;
 
 
         IntegratedBrand_Iot brand_Iot;
@@ -61,11 +62,15 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 Padding = new Padding(12,  Application.GetRealWidth(16), 12, Application.GetRealWidth(16)),
                 TextSize = CSS_FontSize.TextFontSize,
-                Text = "榛樿灏嗙涓夋柟鍝佺墝鐨勮澶囧叏閮ㄥ叧鑱斿埌On Pro涓�,鎮ㄤ篃鍙互閫氳繃涓嬫柟鐨勫紑鍏虫寜閿紝杩涜閫夋嫨鎬у叧鑱斻��",
+                Text = "*鎮ㄥ彲浠ュ皢绗笁鏂瑰搧鐗岀殑璁惧鍏宠仈鍒癘n Pro鎮ㄥ綋鍓嶇殑浣忓畢涓娿��",
                 IsMoreLines = true,
                 TextAlignment = TextAlignment.CenterLeft,
             };
             bodyView.AddChidren(btnTipText);
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                btnTipText.Text = "*You can associate third-party branded devices with on Pro's current home.";
+            }
 
             contentView = new FrameLayout()
             {
@@ -82,6 +87,11 @@
             {
                 try
                 {
+                    var pack0 = http.Search3tyIotDevice(brand_Iot.companyId);
+                    if(pack0 != null)
+                    {
+
+                    }
                     var pack = http.Get3tyIotDeviceFunctionList(brand_Iot.companyId);
                     if (pack != null)
                     {
@@ -104,6 +114,54 @@
                     });
                 }
             }) { IsBackground = true }.Start();
+
+
+            optionView = new FrameLayout()
+            {
+                Y = Application.GetRealHeight(667 - 80),
+                Height = Application.GetRealHeight(90),
+                Radius = (uint)Application.GetRealWidth(22),
+                Visible = false,
+            };
+            bodyView.AddChidren(optionView);
+
+
+            var btnComfirm = new Button()
+            {
+                Gravity = Gravity.CenterHorizontal,
+                Y = Application.GetRealHeight(14),
+                Width = Application.GetRealWidth(164),
+                Height = Application.GetRealHeight(44),
+                TextAlignment = TextAlignment.Center,
+                BackgroundColor = CSS_Color.MainColor,
+                TextColor = CSS_Color.MainBackgroundColor,
+                TextSize = CSS_FontSize.SubheadingFontSize,
+                TextID = StringId.Confirm,
+                Radius = (uint)Application.GetRealHeight(22)
+            };
+            optionView.AddChidren(btnComfirm);
+            btnComfirm.MouseUpEventHandler = (sender, e) => {
+
+                var pack = http.Set3tyIotFunctionToHouse(optionList, DB_ResidenceData.Instance.CurrentRegion.id, brand_Iot.companyId);
+                if (pack != null)
+                {
+                    if (pack.Code == StateCode.SUCCESS)
+                    {
+                        btnComfirm.Visible = false;
+                    }
+                }
+                //var pack = http.Set3tyIotFunctionToHouse(function.deviceId, "0", brand_Iot.companyId);
+                //if (pack != null)
+                //{
+                //    if (pack.Code == StateCode.SUCCESS)
+                //    {
+                //        btnName.IsSelected = btnIcon.IsSelected = btnCheckIcon.IsSelected = false;
+                //    }
+                //}
+
+            };
+
+
 
         }
 
@@ -163,11 +221,11 @@
                     var btnbg = new Button()
                     {
                         UnSelectedImagePath = "Collection/Functionbg.png",
-                        SelectedImagePath = "Collection/FunctionOnbg.png",
+                        SelectedImagePath = "Collection/Functionbg.png",
                         Tag = function.sid
                     };
                     functionView.AddChidren(btnbg);
-                    LoadDeviceFunctionDiv(functionView, function,btnbg);
+                    LoadDeviceFunctionDiv(functionView, function);
                     index++;
 
                 
@@ -188,6 +246,10 @@
                         Text = "娌℃湁浠讳綍璁惧"
                     };
                     view.AddChidren(btnNoCollectionTip);
+                    if (Language.CurrentLanguage != "Chinese")
+                    {
+                        btnNoCollectionTip.Text = "No equipment";
+                    }
                 }
             }
             catch (Exception ex)
@@ -196,16 +258,34 @@
             deviceFunctionView.AddChidren(new Button { Height = Application.GetRealHeight(30) });
             #endregion
 
+
+            deviceFunctionView.AddChidren(new Button {
+                Height = Application.GetRealHeight(90),
+            });
+
         }
 
 
         /// <summary>
         /// 鍔犺浇鍔熻兘鎺у埗鍗$墖
         /// </summary>
-        void LoadDeviceFunctionDiv(FrameLayout view, Function function,Button btnBg)
+        void LoadDeviceFunctionDiv(FrameLayout view, Function function)
         {
             try
             {
+
+
+                var btnCheckIcon = new Button()
+                {
+                    X = Application.GetRealWidth(22),
+                    Y = Application.GetRealHeight(16),
+                    Width = Application.GetRealWidth(21),
+                    Height = Application.GetRealWidth(21),
+                    UnSelectedImagePath = "Public/IotCheckIcon.png",
+                    SelectedImagePath = "Public/IotCheckOnIcon.png",
+                };
+                view.AddChidren(btnCheckIcon);
+
                 Button btnIcon;
                 btnIcon = new Button()
                 {
@@ -237,39 +317,32 @@
                 Button btnClick = new Button();
                 view.AddChidren(btnClick);
                 btnClick.MouseUpEventHandler = (sender, e) => {
-                    function.collect = !function.collect;
-                    if (function.collect)
+                    btnCheckIcon.IsSelected = function.collect = !function.collect;
+                    if (optionList.Contains(function.deviceId))
                     {
-                        var pack = http.Set3tyIotFunctionToHouse(function.deviceId, DB_ResidenceData.Instance.CurrentRegion.id,brand_Iot.companyId);
-                        if (pack != null)
-                        {
-                            if(pack.Code == StateCode.SUCCESS)
-                            {
-                                btnName.IsSelected = btnIcon.IsSelected = btnBg.IsSelected = true;
-                            }
-                        }
+                        optionList.Remove(function.deviceId);
                     }
                     else
                     {
-                        btnName.IsSelected = btnIcon.IsSelected = btnBg.IsSelected = false;
-                        var pack = http.Set3tyIotFunctionToHouse(function.deviceId, "0", brand_Iot.companyId);
-                        if (pack != null)
-                        {
-                            if (pack.Code == StateCode.SUCCESS)
-                            {
-                                btnName.IsSelected = btnIcon.IsSelected = btnBg.IsSelected = false;
-                            }
-                        }
+                        optionList.Add(function.deviceId);
                     }
-
+                    optionView.Visible = true;
                 };
-
+                if (function.homeId == DB_ResidenceData.Instance.CurrentRegion.id )
+                {
+                    btnCheckIcon.IsSelected = true;
+                    optionList.Add(function.deviceId);
+                }
             }
             catch (Exception ex)
             {
                 MainPage.Log("homepage LoadControlView error : " + ex.Message);
             }
         }
+        /// <summary>
+        /// 璁板綍闇�瑕佹搷浣滅殑鍒楄〃
+        /// </summary>
+        private List<string> optionList = new List<string>();
 
 
         void NotListTipView()
@@ -312,7 +385,7 @@
                 BorderWidth = 0,
                 Text = "鏌ョ湅璁惧鏀寔鑼冨洿"
             };
-            contentView.AddChidren(btnAdd);
+            //contentView.AddChidren(btnAdd);
             btnAdd.MouseUpEventHandler = (sender, e) =>
             {
                 //var page = new AddThirdPartyBrandListpage(brandList);
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandListPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandListPage.cs
index 32531d7..6ac1e9a 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandListPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/Iot_BrandListPage.cs
@@ -55,7 +55,12 @@
                 TextAlignment = TextAlignment.CenterLeft,
             };
             bodyView.AddChidren(btnTipText);
-             
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                btnTipText.Text = "Synchronize your devices on the third-party platform to on Pro for control by binding the third-party platform account to the cloud connection";
+            }
+
+
             contentView = new VerticalScrolViewLayout()
             {
                 Y = Application.GetRealHeight(150),
@@ -76,7 +81,7 @@
 
         }
         /// <summary>
-        /// 鑾峰彇缁戝畾鍒楄〃
+        /// 鑾峰彇鍒楄〃
         /// </summary>
         void GetBindList()
         {
@@ -197,9 +202,8 @@
                 };
                 row.AddChidren(btnName);
                 //涓嬭浇绗笁鏂瑰搧鐗宨con
-                ImageUtlis.Current.Load3tyBrandIconImages(brand.brandName, brand.authrBandIconUrl, btnIcon);
-
-                btnName.MouseUpEventHandler = (sender, e) => {
+                ImageUtlis.Current.Load3tyBrandIconImages(brand.brandName, brand.authBrandIconUrl, btnIcon);
+                EventHandler<MouseEventArgs> eventHandler =  (sender, e) => {
                     if (brand.hasAuthorization)
                     {
                         Action unboundAction = () =>
@@ -231,6 +235,11 @@
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                     }
                 };
+
+                btnRight.MouseUpEventHandler = eventHandler;
+                row.MouseUpEventHandler = eventHandler;
+                btnName.MouseUpEventHandler = eventHandler;
+                btnBindTip.MouseUpEventHandler = eventHandler;
             }
 
         }
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/iot_BindTipPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/iot_BindTipPage.cs
index 601da76..dc0bd62 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/iot_BindTipPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/AddFunction/iot_BindTipPage.cs
@@ -27,8 +27,7 @@
         public void LoadPage(IntegratedBrand_Iot brand_Iot)
         {
 
-
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Bind3thIotAccount)).LoadTopView(CSS_Color.MainBackgroundColor);
+            new TopViewDiv(bodyView, brand_Iot.brandName).LoadTopView(CSS_Color.MainBackgroundColor);
 
             bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
 
@@ -63,6 +62,10 @@
                 Text = "鍏充簬璐﹀彿缁戝畾鐨勫0鏄�"
             };
             contentView.AddChidren(btnTipTitle);
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                btnTipTitle.Text = "Statement on account binding";
+            }
 
             var btnTipText = new Button()
             {
@@ -87,6 +90,16 @@
 "濡傞渶缁堟浠ヤ笂淇℃伅鐨勬敹闆嗕笌澶勭悊锛屾偍鍙互鍦ㄢ�滄垜鐨勨��> 鈥滅粦瀹氱涓夋柟璐︽埛鈥�>鈥滆В闄も��"
             };
             contentView.AddChidren(btnTipText);
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                btnTipText.Text = $"account binding brand: {brand_Iot.brandName} (hereinafter referred to as the third party brand)" + "\r\n" + "\r\n" +
+"After you bind the account of the third-party brand, you will authorize 'on Pro' to use your account of the third-party to jointly manage the device. On Pro will also automatically synchronize the device you added in the third-party brand." + "\r\n" + "\r\n" +
+"To realize the device control function, this application will obtain the following data from a third party:" + "\r\n" + "\r\n" +
+"1. List of some devices added on the third-party brand for intelligent control in on Pro;" + "\r\n" + "\r\n" +
+"2. Equipment and network information, including equipment identifier, MAC address and equipment serial number, is used to identify the currently working equipment and perform equipment control functions." + "\r\n" + "\r\n" +
+"If you do not agree with our collection of the above information, you will not be able to manage third-party branded devices." + "\r\n" + "\r\n" +
+"To terminate the collection and processing of the above information, you can click my > bind third party account > cancel";
+            }
 
 
             var optionView = new FrameLayout()
@@ -110,7 +123,7 @@
                 TextAlignment = TextAlignment.Center,
                 TextColor = CSS_Color.MainColor,
                 TextSize = CSS_FontSize.SubheadingFontSize,
-                Text = "杩斿洖",
+                TextID= StringId.fanhui,
                 Radius = (uint)Application.GetRealHeight(22)
             };
             optionView.AddChidren(btnCannel);
@@ -133,6 +146,10 @@
                 Radius = (uint)Application.GetRealHeight(22)
             };
             optionView.AddChidren(btnComfirm);
+            if (Language.CurrentLanguage != "Chinese")
+            {
+                btnComfirm.Text = "Consent authorization";
+            }
 
 
             if (!brand_Iot.hasAuthorization)
@@ -151,8 +168,8 @@
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                     };
 
-                    var page = new Iot_AuthorizedPage(brand_Iot,action);
-                    page.LoadView();
+                    var page2 = new Iot_AuthorizedPage(brand_Iot,action);
+                    page2.LoadView();
 
 
 
@@ -161,6 +178,10 @@
             else
             {
                 btnComfirm.Text = "瑙i櫎鎺堟潈";
+                if (Language.CurrentLanguage != "Chinese")
+                {
+                    btnComfirm.Text = "Cancel authorization";
+                }
                 btnComfirm.MouseUpEventHandler = (sender, e) =>
                 {
                     Dialog dialog = new Dialog()
@@ -168,7 +189,7 @@
                         BackgroundColor = CSS_Color.DialogTransparentColor1,
                     };
 
-                    FrameLayout contentView = new FrameLayout()
+                    FrameLayout contentView2 = new FrameLayout()
                     {
                         Gravity = Gravity.Center,
                         Width = Application.GetRealWidth(305),
@@ -178,7 +199,7 @@
                         BorderWidth = 0,
                         Radius = (uint)Application.GetMinRealAverage(10),
                     };
-                    dialog.AddChidren(contentView);
+                    dialog.AddChidren(contentView2);
 
                     Button btnMsg = new Button()
                     {
@@ -192,7 +213,11 @@
                         Text = "鎾ら攢鎺堟潈鍚庯紝璇ュ搧鐗屽叧鑱斿湪On Pro涓殑璁惧灏嗗叏閮ㄨ瑙g粦锛岀浉鍏充娇鐢ㄤ俊鎭悎璁惧鍊间篃灏嗗け鏁�",
                         IsMoreLines = true,
                     };
-                    contentView.AddChidren(btnMsg);
+                    contentView2.AddChidren(btnMsg);
+                    if (Language.CurrentLanguage != "Chinese")
+                    {
+                        btnMsg.Text = "After the authorization is revoked, all the devices associated with the brand in on Pro will be unbound, and the relevant use information and device value will also become invalid";
+                    }
 
                     Button btnLine = new Button()
                     {
@@ -200,7 +225,7 @@
                         Height = Application.GetRealHeight(1),
                         BackgroundColor = CSS.CSS_Color.DividingLineColor,
                     };
-                    contentView.AddChidren(btnLine);
+                    contentView2.AddChidren(btnLine);
 
                     Button btnConfirm = new Button()
                     {
@@ -213,17 +238,21 @@
                         SelectedBackgroundColor = CSS_Color.MainColor,
                         Text = "纭畾鎾ゅ洖鎺堟潈",
                     };
+                    if (Language.CurrentLanguage != "Chinese")
+                    {
+                        btnConfirm.Text = "Confirm to withdraw authorization";
+                    }
                     btnConfirm.SetCornerWithSameRadius(Application.GetMinRealAverage(10), HDLUtils.RectCornerBottomLeft);
                     btnConfirm.SetCornerWithSameRadius(Application.GetMinRealAverage(10), HDLUtils.RectCornerBottomRight);
-                    contentView.AddChidren(btnConfirm);
+                    contentView2.AddChidren(btnConfirm);
 
                     dialog.Show();
 
-                    btnConfirm.MouseDownEventHandler += (sender, e) =>
+                    btnConfirm.MouseDownEventHandler += (sender2, e2) =>
                     {
                         btnConfirm.IsSelected = true;
                     };
-                    btnConfirm.MouseUpEventHandler += (sender, e) =>
+                    btnConfirm.MouseUpEventHandler += (sender2, e2) =>
                     {
                         var http = new HttpServerRequest();
                         var waitPage = new Loading();
@@ -251,7 +280,14 @@
                                 else
                                 {
                                     dialog.Close();
-                                    new Alert("", "鎿嶄綔澶辫触", "").Show();
+                                    if (Language.CurrentLanguage != "Chinese")
+                                    {
+                                        new Alert("", "Operation failed", "").Show();
+                                    }
+                                    else
+                                    {
+                                        new Alert("", "鎿嶄綔澶辫触", "").Show();
+                                    }
                                 }
                             }
                             catch { }
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs
index a13120e..ce10df7 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/PersonalDataPageBLL.cs
@@ -544,10 +544,16 @@
         {
             EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
             {
-                var page = new ResetPasswordOptionPage();
-                MainPage.BasePageView.AddChidren(page);
-                page.LoadPage();
+                //var page = new ResetPasswordOptionPage();
+                //MainPage.BasePageView.AddChidren(page);
+                //page.LoadPage();
+                //MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
+
+                var vcp = new ResetPasswordPage();
+                MainPage.BasePageView.AddChidren(vcp);
+                vcp.LoadPage();
                 MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
+
             };
             btnResetPasswordRight.MouseUpEventHandler = eventHandler;
             btnResetPasswordText.MouseUpEventHandler = eventHandler;
diff --git a/HDL_ON/UI/UI2/4-PersonalCenter/ResetAccountPassword/ResetPasswordPage.cs b/HDL_ON/UI/UI2/4-PersonalCenter/ResetAccountPassword/ResetPasswordPage.cs
index 61fff82..7b49246 100644
--- a/HDL_ON/UI/UI2/4-PersonalCenter/ResetAccountPassword/ResetPasswordPage.cs
+++ b/HDL_ON/UI/UI2/4-PersonalCenter/ResetAccountPassword/ResetPasswordPage.cs
@@ -23,6 +23,11 @@
 
         #region 鎺т欢View
         /// <summary>
+        /// 鍘熷瘑鐮佹枃鏈
+        /// </summary>
+        EditText etOldPwd;
+
+        /// <summary>
         /// 瀵嗙爜鏂囨湰妗�
         /// </summary>
         EditText etPassword;
@@ -64,10 +69,45 @@
 
             new TopViewDiv(bodyView, Language.StringByID(StringId.ModifyPassword)).LoadTopView(backAction);
 
+
+            #region 鍘熷瘑鐮�
+            FrameLayout oldPwdView = new FrameLayout()
+            {
+                Y = Application.GetRealHeight(64),
+                Height = Application.GetRealHeight(50),
+                BackgroundColor = CSS_Color.MainBackgroundColor,
+            };
+            bodyView.AddChidren(oldPwdView);
+
+            Button btnOldPwdTitle = new Button()
+            {
+                X = Application.GetRealWidth(16),
+                Width = Application.GetRealWidth(180),
+                TextColor = CSS_Color.FirstLevelTitleColor,
+                TextSize = CSS_FontSize.SubheadingFontSize,
+                TextAlignment = TextAlignment.CenterLeft,
+                Text = Language.StringByID(StringId.OriginalPassword) + ":"
+            };
+            oldPwdView.AddChidren(btnOldPwdTitle);
+
+            etOldPwd = new EditText()
+            {
+                Width = Application.GetRealWidth(359),
+                TextColor = CSS_Color.PromptingColor1,
+                TextSize = CSS_FontSize.TextFontSize,
+                SecureTextEntry = true,
+                TextAlignment = TextAlignment.CenterRight,
+                Foucs = true
+            };
+            oldPwdView.AddChidren(etOldPwd);
+            oldPwdView.AddChidren(new LineView(oldPwdView.Height));
+            #endregion
+
+
             #region 鏂板瘑鐮�
             FrameLayout rowView = new FrameLayout()
             {
-                Y = Application.GetRealHeight(64),
+                Y = oldPwdView.Bottom ,
                 Height = Application.GetRealHeight(50),
                 BackgroundColor = CSS_Color.MainBackgroundColor,
             };
@@ -156,24 +196,24 @@
     public partial class ResetPasswordPage
     {
 
-        /// <summary>
-        /// 鎸囧畾鍏抽棴椤甸潰涓暟
-        /// </summary>
-        /// <param name="countPage"></param>
-        void ClosePageWithCount(int countPage)
-        {
-            //鍏抽棴澶氬皯涓〉闈�
-            for (int i = 0; i < countPage; i++)
-            {
-                MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1).RemoveFromParent();
-            }
-        }
+        ///// <summary>
+        ///// 鎸囧畾鍏抽棴椤甸潰涓暟
+        ///// </summary>
+        ///// <param name="countPage"></param>
+        //void ClosePageWithCount(int countPage)
+        //{
+        //    //鍏抽棴澶氬皯涓〉闈�
+        //    for (int i = 0; i < countPage; i++)
+        //    {
+        //        MainPage.BasePageView.GetChildren(MainPage.BasePageView.ChildrenCount - 1).RemoveFromParent();
+        //    }
+        //}
 
         /// <summary>
         /// 
         /// </summary>
         /// <param name="password"></param>
-        void ResetPassword(string password)
+        void ResetPassword(string oldPwd, string password)
         {
 
             //鏍¢獙瀵嗙爜鏄惁绗﹀悎瑕佹眰
@@ -211,13 +251,13 @@
                 try
                 {
                     // 蹇樿瀵嗙爜
-                    var resultObj = new HttpServerRequest().ForgetPassword(account, password, verCode, isPhone);
+                    var resultObj = new HttpServerRequest().UpdataPassword(oldPwd, password);
                     if (resultObj.Code == StateCode.SUCCESS)
                     {
                         Application.RunOnMainThread(() =>
                         {
                             Utlis.ShowTip(Language.StringByID(StringId.PasswordChangeSuccessfully));
-                            ClosePageWithCount(2);
+                            this.RemoveFromParent();
                         });
                     }
                     else
@@ -252,7 +292,7 @@
             {
                 if (btnReset.IsSelected)
                 {
-                    ResetPassword(etPassword.Text.ToString());
+                    ResetPassword(etOldPwd.Text.Trim().ToString(), etPassword.Text.ToString());
                 }
             };
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs b/HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs
index bf223e0..a46b9a4 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/1ContorlPage/CacControlPage.cs
@@ -102,6 +102,7 @@
             this.RefreshNowDeviceStatuMemory(this.device);
             //鍒锋柊鐣岄潰鐘舵��
             this.RefreshFormStatu();
+            controlTime = DateTime.Now;
             //璇诲彇鐘舵��
             new System.Threading.Thread(() =>
             {
@@ -109,7 +110,7 @@
                 {
                     if (controlTime == DateTime.MinValue)
                     {
-
+                        
                     }
                     else if (controlTime.AddSeconds(2) < DateTime.Now)
                     {
@@ -176,7 +177,6 @@
             temp = (int)Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", "."));
             if (temp <= 0)
             {
-                //榛樿鍊兼敼鎴�16,2022骞�06鏈�10鏃�10:03:19 鎴愮敨瑕佹眰鐨�
                 temp = 16;
                 device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
             }
@@ -683,10 +683,12 @@
                 {
                     //btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.RoomTemp).Replace(",", "."))) + "掳C"
                     //                    + Language.StringByID(StringId.Humidity) + Convert.ToInt32(Convert.ToDouble(device.GetAttrState("room_humidity").Replace(", ", "."))) + "%";
-                    btnTempValues.Text = Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.RoomTemp).Replace(",", "."))) + "掳C";
-                    btnHumidityValues.Text = Convert.ToInt32(Convert.ToDouble(device.GetAttrState("room_humidity").Replace(", ", "."))) + "%";
+                    btnTempValues.Text = Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.RoomTemp).Replace(",", ".")) + "掳C";
+                    btnHumidityValues.Text = Convert.ToDouble(device.GetAttrState("room_humidity").Replace(", ", ".")) + "%";
 
                     btnMode.UnSelectedImagePath = acFunction.GetModeIconPath(device.GetAttrState(FunctionAttributeKey.Mode));
+                    btnModeText.Text = acFunction.GetModeAttrText(device.GetAttrState(FunctionAttributeKey.Mode));
+
                     temp = Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp).Replace(",", ".")));
                   
 

--
Gitblit v1.8.0