From 66a9965c44ecc32a6696abca876ab9d1cd091584 Mon Sep 17 00:00:00 2001
From: gxc <guoxuecheng@guoxuechengdeMacBook-Pro.local>
Date: 星期五, 28 二月 2020 15:25:13 +0800
Subject: [PATCH] 2020.2.28

---
 ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs |  137 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 111 insertions(+), 26 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs
index 7d98f3d..86ca1f3 100755
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/ZbGateway.cs
@@ -60,6 +60,12 @@
         /// <value><c>true</c> if is remote; otherwise, <c>false</c>.</value>
         public static bool IsRemote;
 
+        /// <summary>
+        /// 鏄惁鎷ユ湁杩滅▼杩炴帴鐨勬潈闄�
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public static bool AllowRemoteCtrl = true;
+
         /// <summary>
         /// 缃戝叧淇濆瓨璺緞
         /// </summary>
@@ -604,7 +610,8 @@
                     var jObject = new JObject { { "Cluster_ID", 0 }, { "Command", 82 } };
                     var data = new JObject { { "HomeId", homeId }, { "AccountId", accountId } };
                     jObject.Add("Data", data);
-                    Send("GwSetHomeId", jObject.ToString());
+                    //浣忓畢ID鐨勮缃�,鍥哄畾浣跨敤灞�鍩熺綉,涓嶅瓨鍦ㄨ繙绋嬬殑璇存硶
+                    SendLocation("GwSetHomeId", System.Text.Encoding.UTF8.GetBytes(jObject.ToString()));
                 }
                 catch { }
 
@@ -3229,6 +3236,11 @@
         /// <returns></returns>
         static async System.Threading.Tasks.Task initGateWayBaseInfomation()
         {
+            if (AllowRemoteCtrl == false)
+            {
+                //娌℃湁杩滅▼杩炴帴鐨勬潈闄�
+                return;
+            }
             string loginToken = Config.Instance.Token;
             if (Config.Instance.Home.IsOthreShare == true)
             {
@@ -3271,11 +3283,13 @@
                     var statuCode = jobject["StateCode"].ToString();
                     if (statuCode != "Success")
                     {
-                        //Log鍑哄姏
-                        Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(-1, "鎺ュ彛璁块棶澶辫触鈽咃細App/GetSingleHomeGatewayPagger " + statuCode);
                         //搴忓垪鍖栧璞�
                         var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(pra2);
-                        Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(-1, "鍙傛暟锛歕r\n" + requestJson);
+                        //Log鍑哄姏
+                        string errorMsg = "鎺ュ彛璁块棶澶辫触鈽咃細App/GetSingleHomeGatewayPagger " + statuCode + "\r\n";
+                        errorMsg += "鍙傛暟锛歕r\n" + requestJson;
+                        Shared.Phone.UserCenter.HdlLogLogic.Current.WriteLog(-1, errorMsg);
+                        return;
                     }
 
                     var responseData = jobject["ResponseData"];
@@ -3323,10 +3337,12 @@
         /// <param name="brokerName">Broker name.</param>
         public static async System.Threading.Tasks.Task StartRemoteMqtt()
         {
-            if (remoteMqttIsConnecting
-                       || !Shared.Common.Config.Instance.IsLogin
-                       || Shared.Common.Config.Instance.HomeId == ""
-                       || remoteIsConnected)
+            //杩藉姞锛氭病鏈夎繙绋嬭繛鎺ョ殑鏉冮檺
+            if (AllowRemoteCtrl == false
+               || remoteMqttIsConnecting
+               || !Shared.Common.Config.Instance.IsLogin
+               || Shared.Common.Config.Instance.HomeId == ""
+               || remoteIsConnected)
             {
                 return;
             }
@@ -3367,6 +3383,18 @@
                             RemoteMqttClient.UseConnectedHandler(async (e) =>
                             {
                                 DebugPrintLog($"杩滅▼杩炴帴鎴愬姛");
+
+                                if (Config.Instance.Home.IsOthreShare == true)
+                                {
+                                    //璁㈤槄涓�涓垚鍛樿鍒犻櫎鐨勪富棰�
+                                    string myGuid = Config.Instance.Guid;
+                                    await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/Deleted");
+                                    //璁㈤槄涓�涓垎浜暟鎹凡缁忓彉鏇寸殑涓婚
+                                    await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + myGuid + "/Push/DeletedShareData");
+                                }
+                                //璁㈤槄涓�涓尋涓嬬嚎鐨勪富棰�
+                                await RemoteMqttClient.SubscribeAsync("/ZigbeeGateWayToClient/" + Config.Instance.ConnEmqClientId + "/Push/NotifySqueeze");
+
                                 await initGateWayBaseInfomation();
                                 Shared.Phone.UserCenter.HdlGatewayLogic.Current.CheckGatewayByConnectChanged(Shared.Phone.UserCenter.GatewayConnectMode.Remote);
                                 //娌℃湁涓荤綉鍏虫椂涓诲姩璇诲彇锛岃幏鍙栦富缃戝叧淇℃伅
@@ -3444,6 +3472,12 @@
                         if (result != null)
                         {
                             var jobject = Newtonsoft.Json.Linq.JObject.Parse(Encoding.UTF8.GetString(result));
+                            if (jobject["StateCode"].ToString() == "NotAllowRemoteCtrl")
+                            {
+                                //娌℃湁杩滅▼杩炴帴鐨勬潈闄�
+                                AllowRemoteCtrl = false;
+                                return;
+                            }
                             var responseData = jobject["ResponseData"];
                             if (responseData != null)
                             {
@@ -3451,6 +3485,8 @@
                                 var connEmqClientId = responseData["ConnEmqClientId"]?.ToString();
                                 var connEmqUserName = responseData["ConnEmqUserName"]?.ToString();
                                 var connEmqPwd = responseData["ConnEmqPwd"]?.ToString();
+                                //璁板綍璧峰綋鍓嶇殑瀹㈡埛绔疘D
+                                Config.Instance.ConnEmqClientId = connEmqClientId;
 
                                 var connEmqDomainPorts = connEmqDomainPort.Replace("//", "").Split(':');
                                 var domain = connEmqDomainPorts[1];
@@ -3496,7 +3532,8 @@
                 {
                     localIsConnected = false;
                     DebugPrintLog($"Local涓诲姩鏂紑_{s}");
-                    await localMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions {  }, CancellationToken.None);
+                    //await localMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions {  }, CancellationToken.None);
+                    await localMqttClient.DisconnectAsync(); 
                 }
             }
             catch (Exception ex)
@@ -3516,7 +3553,8 @@
                 {
                     remoteIsConnected = false;
                     DebugPrintLog($"Remote涓诲姩鏂紑_{s}");
-                    await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
+                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
+                    await RemoteMqttClient.DisconnectAsync();
                 }
             }
             catch(Exception e) {
@@ -3632,6 +3670,7 @@
                             await StartLocalMqtt("ReConnect");
                             if (localIsConnected)
                             {
+                                DebugPrintLog($"灞�鍩熺綉鈥斺�斾簩娆″彂閫佸埌缃戝叧鐨勪富棰�:{topic}_鍙戦�佸埌缃戝叧鐨勬暟鎹�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId} 鏄惁鍔犲瘑:{IsEncry}");
                                 await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain });
                             }
                         }
@@ -3658,8 +3697,58 @@
                 return;
             }
             await Send(topic, System.Text.Encoding.UTF8.GetBytes(message), retain);
+        }
+
+        /// <summary>
+        /// 寮哄埗鎸囧畾浣跨敤鏈湴灞�鍩熺綉鍙戦�佹秷鎭埌鏈嶅姟鍣�
+        /// </summary>
+        /// <returns></returns>
+        /// <param name="topic"></param>
+        /// <param name="message"></param>
+        /// <param name="retain"></param>
+        public async Task SendLocation(string topic, byte[] message, bool retain = false)
+        {
+            try
+            {
+                if (Shared.Common.Config.Instance.HomeId == "")
+                {
+                    return;
+                }
+
+                DebugPrintLog($"灞�鍩熺綉鈥斺�斿彂閫佸埌缃戝叧鐨勪富棰�:{topic}_鍙戦�佸埌缃戝叧鐨勬暟鎹�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId} 鏄惁鍔犲瘑:{IsEncry}");
+
+                if (IsEncry)
+                {
+                    //鏂囦欢娴佷笉鐢ㄥ姞瀵�
+                    if (topic != "FileTransfer/SendFile")
+                    {
+                        message = SecuritySet.AesEncryptBytes(message, password);
+                    }
+                }
+                if (localIsConnected)
+                {
+                    try
+                    {
+                        await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain });
+                    }
+                    catch (Exception e)
+                    {
+                        DebugPrintLog($"Local涓诲姩鏂紑_{e.Message}");
+                        await DisConnectLocalMqttClient(e.Message);
+                        await StartLocalMqtt("ReConnect");
+                        if (localIsConnected)
+                        {
+                            DebugPrintLog($"灞�鍩熺綉鈥斺�斾簩娆″彂閫佸埌缃戝叧鐨勪富棰�:{topic}_鍙戦�佸埌缃戝叧鐨勬暟鎹�:{System.Text.Encoding.UTF8.GetString(message)}_褰撳墠缃戝叧{CurrentGateWayId} 鏄惁鍔犲瘑:{IsEncry}");
+                            await localMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topic, Payload = message, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Retain = retain });
+                        }
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                DebugPrintLog($"Send:{ex.Message}");
+            }
         }
-
 
         [Serializable]
         public class CloudTimeResponse
@@ -3800,7 +3889,10 @@
                     epoint = topic.Split('/')[3];
                     cluID = topic.Split('/')[4];
                     attrId = topic.Split('/')[5];
-                }
+                }
+
+                //鍏ㄥ眬鎺ユ敹缃戝叧鎺ㄩ�佺殑鐨勯�昏緫(涓轰簡鎵ц閫熷害,灏藉彲鑳界殑鍒姞鑰楁椂鐨勬搷浣�)
+                Shared.Phone.UserCenter.HdlGatewayReceiveLogic.Current.GatewayOverallMsgReceive(gatewayID, topic, reportStatus, message);
 
                 var gwa = GateWayList.Find(obj => obj.getGatewayBaseInfo.gwID == gatewayID);
                 if (gwa == null)
@@ -3832,9 +3924,6 @@
                 {
                     jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                 }
-
-                //鍏ㄥ眬鎺ユ敹缃戝叧鎺ㄩ�佺殑鐨勯�昏緫(涓轰簡鎵ц閫熷害,灏藉彲鑳界殑鍒姞鑰楁椂鐨勬搷浣�)
-                Shared.Phone.UserCenter.HdlGatewayReceiveLogic.Current.GatewayOverallMsgReceive(gatewayID, topic, reportStatus, jobject);
 
                 #region 杩滅▼,涓荤綉鍏充笂鎶ラ�氱煡
                 if (IsRemote)
@@ -4278,22 +4367,18 @@
                 #region 璁惧璇锋眰APP鑾峰彇鍗囩骇鏁版嵁
                 else if (topic == gatewayID + "/" + "ZbDataPassthrough")
                 {
-                    var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
-                    gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
-                    if (gatewayTemp.clientDataPassthroughResponseData == null)
-                    {
-                        return;
-                    }
-
                     //涓婃姤绫诲瀷閫氱煡
                     if (gwa.ReportAction != null)
-                    {
-                        DebugPrintLog("DeviceRequestAcUpdateData");
-                        gwa.ReportAction("DeviceRequestAcUpdateData", gatewayTemp.clientDataPassthroughResponseData);
+                    {
+                        var clientDataPassthrough = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
+                        if (clientDataPassthrough != null)
+                        {
+                            DebugPrintLog("DeviceRequestAcUpdateData");
+                            gwa.ReportAction("DeviceRequestAcUpdateData", clientDataPassthrough);
+                        }
                     }
                 }
                 #endregion
-                DebugPrintLog("缃戝叧杩斿洖鏁版嵁閫氱煡");
             }
             catch (Exception ex)
             {

--
Gitblit v1.8.0