From e71c57108e6dd407c2c6f0361f68150f2ff9aed5 Mon Sep 17 00:00:00 2001 From: wxr <464027401@qq.com> Date: 星期三, 15 十二月 2021 13:41:16 +0800 Subject: [PATCH] 版本备份 --- HDL_ON/DAL/DriverLayer/Control.cs | 1132 +++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 1,045 insertions(+), 87 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/Control.cs b/HDL_ON/DAL/DriverLayer/Control.cs index 743e402..4a6ad64 100644 --- a/HDL_ON/DAL/DriverLayer/Control.cs +++ b/HDL_ON/DAL/DriverLayer/Control.cs @@ -1,15 +1,18 @@ -using System; +锘縰sing System; using System.Collections.Generic; +using System.Text; using HDL_ON.Entity; +using HDL_ON.UI; +using Shared; namespace HDL_ON.DriverLayer { - /// <summary> /// 閫氳鏂瑰紡 /// </summary> public enum CommunicationMode { + none, /// <summary> /// 鏈湴udp /// </summary> @@ -20,12 +23,11 @@ tcp_local_client, } - - public class Control { + static Control _control; - public static Control ins + public static Control Ins { get { @@ -37,9 +39,148 @@ } } /// <summary> - /// 缃戝叧鏄惁鍦ㄧ嚎 + /// 璁板綍鎺ユ敹鍒扮殑娑堟伅锛屾柟渚縵b鐨勫伐绋嬪笀璋冭瘯浠栦滑鐨勮澶� /// </summary> - public bool gatewayOnline = false; + public List<string> MsgInfoList = new List<string>(); + + int _msg_id = 1; + /// <summary> + /// 閫氳ID + /// </summary> + public int msg_id + { + get + { + return _msg_id++; + } + } + ///// <summary> + ///// 鑾峰彇13浣嶆椂闂存埑 + ///// </summary> + ///// <returns></returns> + //public string Get_TimeStamp() + //{ + // long t = DateTime.Now.Ticks / 10000; + // return t.ToString(); + //} + + /// <summary> + /// 鏄惁鎼滅储鏈湴缃戝叧鎴愬姛 + /// </summary> + public bool IsSearchLocalGatewaySuccessful = false; + /// <summary> + /// 鏄惁鏈湴鍔犲瘑锛岀洰鍓嶅彧瀵笰缃戝叧鏈夌敤 + /// </summary> + public bool IsLocalEncrypt; + /// <summary> + /// 鍒ゆ柇鏄惁鏈湴鍔犲瘑骞朵笖鍔犲瘑key涓嶄负绌� + /// </summary> + public bool IsLocalEncryptAndGetAesKey { + get { + return IsLocalEncrypt && (!string.IsNullOrEmpty(DB_ResidenceData.Instance.CurrentRegion.localSecret)); + } + } + + bool _GatewayOnline_Local = false; + /// <summary> + /// 缃戝叧鍦ㄧ嚎-灞�鍩熺綉 + /// </summary> + public bool GatewayOnline_Local + { + get + { + return _GatewayOnline_Local; + } + set + { + if (_GatewayOnline_Local != value) + { + _GatewayOnline_Local = value; + if (value) + { + //淇敼涓婚〉杩炴帴鐘舵�� + HomePage.LoadEvent_CheckLinkStatus(); + MainPage.Log($"缃戝叧灞�鍩熺綉鍦ㄧ嚎锛屽埛鏂拌澶囩姸鎬�"); + new System.Threading.Thread(() => + { + System.Threading.Thread.Sleep(1000); + FunctionList.List.ReadAllFunctionStatus(); + }) + { IsBackground = true, Priority = System.Threading.ThreadPriority.AboveNormal }.Start(); + } + else + { + //淇敼涓婚〉杩炴帴鐘舵�� + HomePage.LoadEvent_CheckLinkStatus(); + } + } + } + } + bool _GatewayOnline_Cloud = false; + /// <summary> + /// 缃戝叧鍦ㄧ嚎-浜戠 + /// </summary> + public bool GatewayOnline_Cloud + { + get + { + return _GatewayOnline_Cloud; + } + set + { + if (_GatewayOnline_Cloud != value) + { + _GatewayOnline_Cloud = value; + if(GatewayOnline_Local) + { + return; + } + if (value) + { + if (DB_ResidenceData.Instance.HomeGateway == null) + { + return; + } + if (!DB_ResidenceData.Instance.HomeGateway.gatewayStatus)//杩滅▼鎯呭喌涓嬶紝缃戝叧鏈摼鎺ユ湇鍔″櫒涓嶈兘淇敼涓婚〉缃戝叧鐘舵�� + { + new System.Threading.Thread(() => + { + System.Threading.Thread.Sleep(3000); + var pm = new DAL.Server.HttpServerRequest(); + pm.GetGatewayInfo(); + }) + { IsBackground = true }.Start(); + return; + } + //淇敼涓婚〉杩炴帴鐘舵�� + HomePage.LoadEvent_CheckLinkStatus(); + MainPage.Log($"缃戝叧浜戠鍦ㄧ嚎锛屽埛鏂拌澶囩姸鎬�"); + new System.Threading.Thread(() => + { + System.Threading.Thread.Sleep(1000); + FunctionList.List.ReadAllFunctionStatus(); + }) + { IsBackground = true, Priority = System.Threading.ThreadPriority.AboveNormal }.Start(); + } + else + { + //淇敼涓婚〉杩炴帴鐘舵�� + HomePage.LoadEvent_CheckLinkStatus(); + } + } + } + } + + + /// <summary> + /// 缃戝叧閫氳ID + /// </summary> + public string GatewayId = ""; + + /// <summary> + /// 鏄惁涓鸿繙绋嬭繛鎺� + /// </summary> + //public bool IsRemote = false; /// <summary> /// 閫氳鍦板潃IP /// </summary> @@ -55,7 +196,7 @@ /// <summary> /// 鏈湴udp /// </summary> - public Control_Udp_Bus myUdp = null; + public Control_Udp myUdp1 = null; /// <summary> /// 閫氳鏂瑰紡 @@ -72,44 +213,29 @@ } /// <summary> - /// 鏀瑰彉閫氳鏂瑰紡 + /// 鎵撳紑Udp /// </summary> - public void ChangeCommunicationMode(CommunicationMode communicationMode) + public void OpenUdp(int port) { - if (this.communicationMode == communicationMode) + UdpSocket._BusSocket.Start(port); + } + /// <summary> + /// 鍏抽棴udp + /// </summary> + public void CloseUdp() + { + UdpSocket._BusSocket.Stop(); + } + + /// <summary> + /// 鎵撳紑tcp瀹㈡湇绔� + /// </summary> + public void OpenTcpClent() + { + if (myTcpClient == null) { - return; - } - - this.communicationMode = communicationMode; - - - switch (this.communicationMode) - { - case CommunicationMode.local_BusUdp: - if (myUdp == null) - { - myUdp = new Control_Udp_Bus(); - } - UdpSocket._BusSocket.Start(); - if (myTcpClient != null) - { - myTcpClient.Close(); - myTcpClient = null; - } - break; - case CommunicationMode.tcp_local_client: - if (myTcpClient == null) - { - myTcpClient = new Control_TcpClient(reportIp); - myTcpClient.Connect(); - } - if (myUdp != null) - { - UdpSocket._BusSocket.Stop(); - myUdp = null; - } - break; + myTcpClient = new Control_TcpClient(reportIp); + myTcpClient.Connect(); } } @@ -118,18 +244,54 @@ /// </summary> public void SearchLoaclGateway() { - ChangeCommunicationMode(CommunicationMode.local_BusUdp); - if (DB_ResidenceData.residenceData.GatewayType == 0) + //2021-01-15 : 浣忓畢娌℃湁缁戝畾缃戝叧鐨勬椂鍊欎笉鐢ㄦ悳绱紝骞朵笖涓嶈兘閾炬帴mqtt + if(DB_ResidenceData.Instance.HomeGateway == null || string.IsNullOrEmpty(DB_ResidenceData.Instance.HomeGateway.gatewayId)) { - myUdp.ControlBytesSend(Command.ReadGateway, 255, 255, new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) }); + return; } - else if (DB_ResidenceData.residenceData.GatewayType == 1) + Ins.GatewayOnline_Local = false; + var ggg = DB_ResidenceData.Instance.GatewayType == 0 ? "涓�绔彛" : "A缃戝叧"; + var ggg1 = MainPage.InternetStatus == 1 ? "4G" : "wifi"; + MainPage.Log($"鎼滅储缃戝叧鍒楄〃锛岀綉鍏崇被鍨�:{ggg};缃戠粶绫诲瀷:{ggg1}"); + if (MainPage.InternetStatus == 0) { - UdpSocket._BusSocket.SearchNetDeviceAction = (revIp) => + Ins.GatewayOnline_Cloud = false; + return; + } + else if (MainPage.InternetStatus == 1) + { + DAL.Mqtt.MqttClient.InitState(); + } + else if (MainPage.InternetStatus == 2) + { + OpenUdp(DB_ResidenceData.Instance.GatewayType == 0 ? 6000 : 8585); + //閲嶇疆鎼滅储缃戝叧鏍囧織 + IsSearchLocalGatewaySuccessful = false; + + new System.Threading.Thread(() => { - MainPage.Log($"鎼滅储鍒扮綉缁滆澶囷細{revIp}"); - }; - myUdp.SearchLocalGateway(); + for (int i = 0; i < 5; i++) + { + if (IsSearchLocalGatewaySuccessful) + { + Ins.GatewayOnline_Local = true; + break; + } + if (DB_ResidenceData.Instance.GatewayType == 0) + { + new Control_Udp().ControlBytesSend(Command.ReadGateway, 255, 255, new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) }); + } + else if (DB_ResidenceData.Instance.GatewayType == 1) + { + new Control_Udp().SearchLocalGateway(); + new Control_Udp().SearchLocalGateway(true); + } + System.Threading.Thread.Sleep(500); + } + + DAL.Mqtt.MqttClient.InitState(); + }) + { IsBackground = true }.Start(); } } @@ -138,15 +300,55 @@ /// </summary> public void ControlScene(Scene scene) { - if(myUdp!=null) + //浣撻獙妯″紡 + if(MainPage.NoLoginMode) { - myUdp.ControlBusScenes(scene); + foreach(var sceneFunction in scene.functions) + { + var revString = ""; + var upDataObj = new AlinkFunctionStatusObj(); + upDataObj.id = "999"; + upDataObj.objects = new List<AlinkStatusData>(); + var asd = new AlinkStatusData() { deviceId = sceneFunction.localFunction.deviceId, sid = sceneFunction.sid }; + var status1 = new List<AttributesStatus>(); + foreach (var dic in sceneFunction.status) + { + status1.Add(new AttributesStatus() { key = dic.key, value = dic.value }); + } + asd.status = status1; + upDataObj.objects.Add(asd); + revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj); + UpdataFunctionStatus(revString, null, true); + } + return; } - if(myTcpClient!= null) + + //杩滅▼鎴栬�呮帶鍒秎ink缃戝叧鍦烘櫙 + if (!Ins.GatewayOnline_Local || DB_ResidenceData.Instance.GatewayType == 1) { - ControlAProtocolScene(scene); + new System.Threading.Thread(() => + { + ControlAProtocolScene(scene); + }) + { IsBackground = true }.Start(); + } + else + { + if (DB_ResidenceData.Instance.GatewayType == 0) + { + new Control_Udp().ControlBusScenes(scene); + } } } + /// <summary> + /// 瀹夐槻鎺у埗 + /// </summary> + public void ControlArm() + { + DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); + //var pack = httpServer.GetSecurityAlarmLogList + } + /// <summary> /// 鍙戦�佸懡浠� @@ -155,33 +357,232 @@ /// </summary> /// <param name="commandString"></param> /// <param name="function"></param> + /// <param name="useRemote">鏄惁鐩存帴浣跨敤杩滅▼鍙戦��</param> /// <returns></returns> - public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary) + public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false,int resend = 3) { - function.usageCount++; + function.controlCounter++; function.refreshTime = DateTime.Now; - if (DB_ResidenceData.residenceData.GatewayType == 0) + + //濡傛灉鏄帶鍒惰皟鍏夌殑寮�鏃讹紝浜害鍊间笉鑳戒负0 + if (commandDictionary.Count > 2) { - try + if (commandDictionary.ContainsKey(FunctionAttributeKey.OnOff) && commandDictionary.ContainsKey(FunctionAttributeKey.Brightness)) { - if(myUdp != null) + if (commandDictionary[FunctionAttributeKey.OnOff] == "on") { - myUdp.WriteBusData(function, commandDictionary); + if (commandDictionary[FunctionAttributeKey.Brightness] == "0") + { + commandDictionary[FunctionAttributeKey.Brightness] = "100"; + } + } + if (commandDictionary[FunctionAttributeKey.OnOff] == "off") + { + if (commandDictionary[FunctionAttributeKey.Brightness] != "0") + { + commandDictionary[FunctionAttributeKey.Brightness] = "0"; + } } } - catch (Exception ex) + } + + ///dome鎺у埗 + if (MainPage.NoLoginMode) + { + var revString = ""; + var upDataObj = new AlinkFunctionStatusObj(); + upDataObj.id = "999"; + upDataObj.objects = new List<AlinkStatusData>(); + var asd = new AlinkStatusData() { deviceId = function.deviceId, sid = function.sid }; + var status1 = new List<AttributesStatus>(); + foreach (var dic in commandDictionary) { - MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + status1.Add(new AttributesStatus() { key = dic.Key, value = dic.Value }); } + asd.status = status1; + upDataObj.objects.Add(asd); + revString = Newtonsoft.Json.JsonConvert.SerializeObject(upDataObj); + UpdataFunctionStatus(revString, null, true); + return; + } + + + //MainPage.Log($"鍙戦�佹暟鎹�:{Newtonsoft.Json.JsonConvert.SerializeObject(commandDictionary)}"); + + ///绗笁鏂规秱楦﹁澶囩粺涓�浣跨敤杩滅▼鎺у埗 + switch (function.spk) + { + case SPK.ElectricTuyaAirCleaner: + case SPK.ElectricTuyaAirCleaner2: + case SPK.ElectricTuyaFan: + case SPK.ElectricTuyaFan2: + case SPK.ElectricTuyaWaterValve: + case SPK.ElectricTuyaWeepRobot: + case SPK.ElectricTuyaWeepRobot2: + useRemote = true; + break; + } + + //杩滅▼閫氳 --娑傞甫璁惧蹇呴』闇�瑕佽繙绋� + if (useRemote == true) + { + DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); + //ALink鎺у埗銆丅us鎺у埗浣跨敤鍚屼竴涓帴鍙f帶鍒讹紝鐢变簯绔礋璐hВ鏋� + var apiControlData = function.GetApiControlData(commandDictionary); + var actionObjs = new List<ApiAlinkControlActionObj>(); + actionObjs.Add(apiControlData); + var pack = httpServer.ControlDevice(actionObjs); } else { - if (myTcpClient != null) + //鏈湴閫氳 + if (Ins.GatewayOnline_Local) { - var sendDataObj = function.GetControlSendData(commandDictionary); - var sendJson = Newtonsoft.Json.JsonConvert.SerializeObject(sendDataObj); - var sendBytes = System.Text.Encoding.UTF8.GetBytes(sendJson); - myTcpClient.SendMessage(sendBytes); + //Bus鎺у埗 + if (DB_ResidenceData.Instance.GatewayType == 0) + { + try + { + new Control_Udp().WriteBusData(function, commandDictionary); + } + catch (Exception ex) + { + MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + } + } + //ALink鎺у埗 + else + { + var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary); + var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson); + new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id,resend); + MainPage.Log($"鏈湴閫氳 鍙戦�丠DL-Link鏁版嵁:{functionControlDataJson}"); + } + } + //杩滅▼閫氳 + else + { + //Bug淇锛氫竴绔彛杩滅▼鎺у埗璋冨厜璁惧鐨勮皟鍏夊睘鎬ф椂锛屾棤娉曟帶鍒跺埌0锛屽弽澶嶆í璺炽�� + //鍥犱负On + 杩滅▼鎺у埗鍙戦�佺粰浜戠浣跨敤鐨勬槸link鍗忚鏁版嵁锛屾潹娑涗腑杞粰楂樿儨澶勭悊鏃跺�欓�昏緫涓婃湁鍐茬獊锛屽鑷存棤娉曞崟鐙帶鍒朵寒搴﹀�硷紝闇�瑕佸悓鏃跺彂閫佸紑鍏冲�间笌浜害鍊笺�� + if (DB_ResidenceData.Instance.GatewayType == 0) + { + if (commandDictionary.Count == 1) + { + if (commandDictionary.ContainsKey(FunctionAttributeKey.Brightness)) + { + commandDictionary.Add(FunctionAttributeKey.OnOff, commandDictionary[FunctionAttributeKey.Brightness] == "0" ? "off" : "on"); + } + } + if(function.spk == SPK.LightCCT) + { + if (!commandDictionary.ContainsKey(FunctionAttributeKey.CCT)) + { + commandDictionary.Add(FunctionAttributeKey.CCT, function.GetAttrState(FunctionAttributeKey.CCT)); + } + } + } + DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); + //ALink鎺у埗銆丅us鎺у埗浣跨敤鍚屼竴涓帴鍙f帶鍒讹紝鐢变簯绔礋璐hВ鏋� + var apiControlData = function.GetApiControlData(commandDictionary); + var actionObjs = new List<ApiAlinkControlActionObj>(); + actionObjs.Add(apiControlData); + var pack = httpServer.ControlDevice(actionObjs); + MainPage.Log($"杩滅▼鎺у埗鍙嶉:{pack.message}"); + } + + } + } + /// <summary> + /// 鍏ㄥ紑鍏ㄥ叧鍔熻兘 + /// </summary> + public void SwtichFunctions(bool open,List<Function> functions) + { + //dome妯″紡鎺у埗 + if(MainPage.NoLoginMode) + { + new System.Threading.Thread(() => + { + foreach (var temp in functions) + { + Dictionary<string, string> d1 = new Dictionary<string, string>(); + d1.Add(FunctionAttributeKey.OnOff, open ? "on" : "off"); + SendWriteCommand(temp, d1); + System.Threading.Thread.Sleep(100); + } + }) + { IsBackground = true }.Start(); + return; + } + + var count = 0; + List<ApiAlinkControlActionObj> actionObjs = new List<ApiAlinkControlActionObj>(); + Dictionary<string, string> d = new Dictionary<string, string>(); + d.Add(FunctionAttributeKey.OnOff, open ? "on" : "off"); + var pm = new DAL.Server.HttpServerRequest(); + //涓�绔彛鍏ㄥ紑鍏ㄥ叧闇�瑕佸欢鏃跺彂閫� + if (DB_ResidenceData.Instance.GatewayType == 0) + { + new System.Threading.Thread(() => + { + foreach (var temp in functions) + { + var apiControlData = temp.GetApiControlData(d); + var result = pm.ControlDevice(new List<ApiAlinkControlActionObj>() { apiControlData }); + System.Threading.Thread.Sleep(100); + } + }) + { IsBackground = true }.Start(); + } + else + { + foreach (var temp in functions) + { + var apiControlData = temp.GetApiControlData(d); + actionObjs.Add(apiControlData); + count++; + if (count > 9) + { + var result = pm.ControlDevice(actionObjs); + actionObjs = new List<ApiAlinkControlActionObj>(); + count = 0; + System.Threading.Thread.Sleep(100); + } + } + var pack = pm.ControlDevice(actionObjs); + } + } + + public void SendApiReadCommand(List<string> functionIds) + { + var pm = new DAL.Server.HttpServerRequest(); + var pack = pm.RefreshDeviceStatus(functionIds); + } + /// <summary> + /// 璇诲彇鍔熻兘璇︾粏鏁版嵁 + /// </summary> + /// <param name="functionIds"></param> + public void ReadFunctionsInfo(List<string> functionIds) + { + var pm = new DAL.Server.HttpServerRequest(); + var pack = pm.GetDeviceInfoList(functionIds); + if(pack!= null&& pack.Data!=null) + { + //寰呮祴璇�2021-03-04 + var ddd = Newtonsoft.Json.JsonConvert.DeserializeObject<List<AlinkStatusData>>(pack.Data.ToString()); + if(ddd!= null) + { + foreach(var function in ddd) + { + var temp = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.deviceId == function.deviceId); + if(temp!= null) + { + if (SPK.Get3tySpk(SPK.BrandType.Tuya).Contains(temp.spk)) + { + Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(temp.sid, function.status); + } + } + } } } } @@ -190,39 +591,596 @@ /// 鍙戦�佽鍙栧懡浠� /// 鑷姩鍒ゆ柇鏄惁涓篈鍗忚璁惧 /// </summary> - public void SendReadCommand(Function function) + public void SendReadCommand(Function function ,bool forceRemote = false) { function.refreshTime = DateTime.Now; - if (function.bus_Data != null) + if (forceRemote) { - try - { - //ReadBusData(function); - } - catch (Exception ex) - { - MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); - } + var pm = new DAL.Server.HttpServerRequest(); + var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId }); } else { - //var commandObj = function.GetSendJObject(CommandType_A.read); - //var commandString = Newtonsoft.Json.JsonConvert.SerializeObject(commandObj); - //var commandBytes = System.Text.Encoding.UTF8.GetBytes(commandString); - //MqttCommon.MqttRemoteSend(commandBytes); + if (Ins.GatewayOnline_Local) + { + + if (DB_ResidenceData.Instance.GatewayType == 0) + { + try + { + new Control_Udp().ReadBusData(function); + } + catch (Exception ex) + { + MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + } + } + else + { + var readKey = new Dictionary<string, string>(); + readKey.Add("sid", function.sid); + + var readDataObj = new AlinkReadFunctionStatusObj() + { + id = Ins.msg_id.ToString(), + objects = new List<Dictionary<string, string>>() + { + readKey + }, + time_stamp = Utlis.GetTimestamp() + }; + var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson); + MainPage.Log($"鏈湴閫氳 鍙戦�丠DL-Link鏁版嵁:{functionControlDataJson}"); + new Control_Udp().SendLocalHdlLinkData(sendBytes, readDataObj.id); + } + } + else + { + var pm = new DAL.Server.HttpServerRequest(); + var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId }); + } } } /// <summary> - /// 鎺у埗a鍗忚鍦烘櫙 + /// 瀹夐槻鎺у埗 + /// </summary> + public void ControlSecurity(SecurityAlarm securityAlarm,string state) + { + if (!Ins.GatewayOnline_Local)//缃戝叧鏈湴涓嶅湪绾� + { + var pm = new DAL.Server.HttpServerRequest(); + var result = pm.SetSecurityStatus(new List<SecurityState>() { new SecurityState() { + gatewayId = DB_ResidenceData.Instance.HomeGateway.gatewayId, + sid = securityAlarm.sid, status = state, userSecurityId = securityAlarm.userSecurityId + } }); + MainPage.Log($"瀹夐槻鎺у埗缁撴灉:{result.Code}"); + } + else + { + Dictionary<string, string> keys = new Dictionary<string, string>(); + keys.Add("sid", securityAlarm.sid); + keys.Add("status", state); + keys.Add("alarm", securityAlarm.alarm.ToString()); + var aLinkData = new AlinkReadFunctionStatusObj() + { + id = Ins.msg_id.ToString(), + objects = new List<Dictionary<string, string>>() + { + keys + }, + time_stamp = Utlis.GetTimestamp() + }; + var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlSeurity, aLinkJson); + new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id); + } + } + + /// <summary> + /// a鍗忚鎺у埗鍦烘櫙 /// </summary> /// <param name="scene"></param> static void ControlAProtocolScene(Scene scene) { - var sendSidObj = new AProtocolSendingObject(); - sendSidObj.time_stamp = ""; - sendSidObj.type = "device_sid"; - sendSidObj.command = "get_list_response"; + if (!Ins.GatewayOnline_Local)//缃戝叧鏈湴涓嶅湪绾� + { + var pm = new DAL.Server.HttpServerRequest(); + var result = pm.ExecuteScene(scene.userSceneId); + } + else + { + Dictionary<string, string> keys = new Dictionary<string, string>(); + keys.Add("sid", scene.sid); + var aLinkData = new AlinkReadFunctionStatusObj() + { + id = Ins.msg_id.ToString(), + objects = new List<Dictionary<string, string>>() + { + keys + }, + time_stamp = Utlis.GetTimestamp() + }; + var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlScene, aLinkJson); + new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id,0); + } + } + /// <summary> + /// 缃戝叧杩涘叆閰嶇綉妯″紡 + /// </summary> + public void AuthGateway() + { + var objects1 = new { spk = "", time = "180" }; + //{"objects":[{"spk":"","time":"180"}],"id":"8","time_stamp":"1635241216669"} + var sendId = Ins.msg_id.ToString(); + var sendObj = new { objects = objects1, id = sendId, time_stamp = Utlis.GetTimestamp() }; + + var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(sendObj); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.AuthGateway, aLinkJson); + new Control_Udp().SendLocalHdlLinkData(sendBytes, Ins.msg_id.ToString()); + } + + /// <summary> + /// 杞崲鍙戦�佹暟鎹� + /// </summary> + /// <param name="topic">涓婚</param> + /// <param name="bodyDataString">body鍐呭鏁版嵁</param> + /// <param name="isEncryption">鏄惁瑕佸body鍔犲瘑</param> + /// <returns></returns> + public byte[] ConvertSendBodyData(string topic, string bodyDataString, bool isEncryption = true) + { + //string topicString = "Topic:" + topic + "\r\n"; + //byte[] bodyBytes = Encoding.ASCII.GetBytes(bodyDataString); + //string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n"; + + //string sendDataString = topicString + lengthString + bodyDataString; + //byte[] sendDataBytes = Encoding.ASCII.GetBytes(sendDataString); + //MainPage.Log($"杞崲HDL-Link鏁版嵁\r\n{sendDataString}\r\n"); + + //*************************************************************** + //2021-09-23 澧炲姞鏈湴閫氫俊鍔犲瘑澶勭悊 + //1.鎷兼帴澶� + string topicString = "Topic:" + topic + "\r\n"; + //2.Body瀛楃涓茶浆涓篵yte鏁扮粍 + byte[] bodyBytes = Encoding.UTF8.GetBytes(bodyDataString); + //鍒ゆ柇鏄惁闇�鍔犲瘑Body鏁版嵁 + if (isEncryption && IsLocalEncryptAndGetAesKey) + { + bodyBytes = Securitys.EncryptionService.AesEncryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret); + //bodyDataString = Encoding.UTF8.GetString(bodyBytes); + //MainPage.Log($"杞崲HDL-Link鏁版嵁 鍔犲瘑key锛�" + DB_ResidenceData.Instance.CurrentRegion.localSecret); + } + //3.鎷兼帴body鐨凩ength闀垮害鏁版嵁 + string lengthString = "Length:" + bodyBytes.Length.ToString() + "\r\n" + "\r\n"; + string topicAndLengthString = topicString + lengthString; + byte[] topicAndLengthBytes = Encoding.UTF8.GetBytes(topicAndLengthString); + //4.鎷兼帴鍚堝苟 Topic 鍜� body鐨刡yte鏁扮粍鏁版嵁 + byte[] sendDataBytes = new byte[topicAndLengthBytes.Length + bodyBytes.Length]; + topicAndLengthBytes.CopyTo(sendDataBytes, 0); + bodyBytes.CopyTo(sendDataBytes, topicAndLengthBytes.Length); + + //var sendDataString = Encoding.UTF8.GetString(sendDataBytes); + //MainPage.Log($"杞崲HDL-Link鏁版嵁\r\n{sendDataString}\r\n"); + //*************************************************************** + + return sendDataBytes; + } + /// <summary> + /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 + /// </summary> + /// <returns></returns> + public void ConvertReceiveData(byte[] receiveBytes,string ip) + { + var reString = Encoding.UTF8.GetString(receiveBytes); + AnalysisReceiveData(reString, receiveBytes,ip); + } + /// <summary> + /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 + /// </summary> + /// <param name="receiveString">杞琒tring鍚庣殑鏁版嵁</param> + /// <param name="originalReceiveBytes"鍘熷Bytes鏁版嵁</param> + /// <returns></returns> + public LocalCommunicationData AnalysisReceiveData(string receiveString, byte[] originalReceiveBytes , string sIp = null) + { + LocalCommunicationData receiveObj = new LocalCommunicationData(); + + MainPage.Log($"灞�鍩熺綉淇℃伅: \r\n{receiveString}"); + + var res = receiveString.Split("\r\n\r\n"); + + if (res.Length == 2) + { + var topics = res[0].Split("\r\n"); + //MainPage.Log(res[1]); + foreach (var ts in topics) + { + var key = ts.Split(":"); + switch (key[0]) + { + case "Topic": + receiveObj.Topic = key[1]; + break; + case "Length": + receiveObj.Length = Convert.ToInt32(key[1]); + break; + } + } + + //MainPage.Log($"灞�鍩熺綉淇℃伅: {receiveObj.Topic} : 鍐呭: {res[1]}"); + + //楠岃瘉鏈夋晥鏁版嵁闀垮害 + //if (res[1].Length != receiveObj.Length) + //{ + // MainPage.Log($"鏀跺埌鏁版嵁鍖呴暱搴︿笉澶�"); + // return receiveObj; + //} + receiveObj.BodyDataString = res[1]; + + //2021-09-23 杩囨护涓嶉渶瑕佽В瀵嗙殑涓婚 鐩墠鎼滅储缃戝叧涓婚涓嶅姞瀵� + if (receiveObj.Topic != CommunicationTopic.SearchLoaclGatewayReply) + { + //鍒ゆ柇褰撳墠缃戝叧鏄惁寮�鍚簡鏈湴鍔犲瘑 + if (IsLocalEncryptAndGetAesKey) + { + MainPage.Log($"灞�鍩熺綉淇℃伅 寮�濮嬭В瀵�"); + if (originalReceiveBytes != null) + { + //鎷垮埌鍘熷Bytes鏁版嵁鍘昏В瀵� + byte[] topicBytes = Encoding.UTF8.GetBytes(res[0]); + byte[] bodyBytes = new byte[receiveObj.Length]; + Array.Copy(originalReceiveBytes, topicBytes.Length + 4, bodyBytes, 0, receiveObj.Length); + byte[] receiveBytes = Securitys.EncryptionService.AesDecryptPayload(bodyBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret); + var revString = Encoding.UTF8.GetString(receiveBytes); + receiveObj.BodyDataString = revString; + MainPage.Log($"灞�鍩熺綉淇℃伅: 瑙e瘑鍚庯細" + receiveObj.BodyDataString); + //if(receiveObj.Topic.EndsWith("/thing/property/up")) + //{ + // MsgInfoList.Add(revString + "\r\n"); + //} + } + else + { + //鐩墠涓嶆嬁鍘熷Bytes鏁版嵁 瑙e瘑涓嶄簡 + //byte[] receiveBytes = Encoding.UTF8.GetBytes(res[1]); + //MainPage.Log($"灞�鍩熺綉淇℃伅 receiveBytes {receiveBytes.Length}"); + //receiveBytes = Securitys.EncryptionService.AesDecryptPayload(receiveBytes, DB_ResidenceData.Instance.CurrentRegion.localSecret); + //MainPage.Log($"灞�鍩熺綉淇℃伅 瑙e瘑鍚庯細receiveBytes {receiveBytes.Length}"); + //var revString = Encoding.UTF8.GetString(receiveBytes); + //receiveObj.BodyDataString = revString; + //MainPage.Log($"灞�鍩熺綉淇℃伅: 瑙e瘑鍚庯細" + receiveObj.BodyDataString); + } + + } + } + + + if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply || receiveObj.Topic == CommunicationTopic.GatewayBroadcast) + { + + var bodyJObj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]); + if (bodyJObj == null) + { + return receiveObj; + } + + var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString()); + if (device.device_mac.ToUpper() == DB_ResidenceData.Instance.HomeGateway.mac.ToUpper()) + { + MainPage.Log("鏈湴鎼滅储缃戝叧鎴愬姛"); + Ins.IsSearchLocalGatewaySuccessful = true; + Ins.GatewayOnline_Local = true; + if (!string.IsNullOrEmpty(device.gatewayId)) + { + Ins.GatewayId = device.gatewayId; + } + else + { + Ins.GatewayId = device.device_mac; + } + if (!string.IsNullOrEmpty(sIp)) + { + device.ip_address = sIp; + } + reportIp = device.ip_address;//涓绘挱鍦板潃涔熻兘鎺у埗璁惧//"239.0.168.188";// + //2021-09-23 鏂板鑾峰彇褰撳墠缃戝叧鏄惁鏈湴鍔犲瘑 + Ins.IsLocalEncrypt = device.isLocalEncrypt; + //MainPage.Log("缃戝叧鏈湴鍔犲瘑鐘舵�侊細" + device.local_encrypt.ToString()); + } + } + 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)) + { + //TODO 鏆傛椂涓嶄紶姝g‘鐨勬暟鎹笂鍘伙紝濡傛灉鍚庨潰瑕佷紭鍖栧墠闈㈣繖浜涗唬鐮� + UpdataFunctionStatus(receiveObj.BodyDataString, null); + } + else if (receiveObj.Topic == CommunicationTopic.ct.ControlSeurity +"_reply" + || receiveObj.Topic == CommunicationTopic.ct.ReadSecurityStatus + "_reply" + || receiveObj.Topic == CommunicationTopic.ct.SecurityStatusUp) + { + try + { + MainPage.Log($"灞�鍩熺綉瀹夐槻淇℃伅: {receiveObj.Topic} : 鍐呭: {res[1]}"); + var tt = ""; + lock (tt) { + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityStatusObj>(receiveObj.BodyDataString); + if (temp != null) + { + Control_Udp.ReceiveRepeatManager(temp.id, null); + foreach (var updataSecurity in temp.objects) + { + var updataLocalSecurity = FunctionList.List.securities.Find((obj) => obj.sid == updataSecurity.sid); + if (updataLocalSecurity != null) + { + updataLocalSecurity.status = updataSecurity.status; + updataLocalSecurity.alarm = updataSecurity.alarm; + ArmCenterPage.LoadEvent_RefreshSecurityStatus(updataLocalSecurity); + } + } + HomePage.LoadEvent_RefreshSecurityStatus(); + } + } + } + catch (Exception ex){ + MainPage.Log($"瀹夐槻灞�鍩熺綉寮傚父锛歿ex.Message}"); + } + } + else + { + //涓�浜涚壒娈婄殑涓婚澶勭悊(涓轰簡鎵ц閫熷害,灏藉彲鑳界殑鍒姞鑰楁椂鐨勬搷浣�) + Stan.HdlCloudReceiveLogic.Current.CloudOverallMsgReceiveEx(receiveObj.Topic, receiveObj.BodyDataString); + } + } + return receiveObj; + } + + /// <summary> + /// 鏇存柊璁惧鐘舵�� + /// A鍗忚鏁版嵁 + /// </summary> + /// <param name="updateBytes"></param> + public void UpdataFunctionStatus(string revString, byte[] usefulBytes,bool isCloudData = false) + { + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString); + if (temp != null) + { + Control_Udp.ReceiveRepeatManager(temp.id, usefulBytes); + var allLocalFuntion = FunctionList.List.GetDeviceFunctionList(); + foreach (var updateTemp in temp.objects) + { + try + { + + if (Ins.GatewayOnline_Local && isCloudData)//鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞� + { + if (FunctionList.List.OtherBrandFunction.Count != 0) + { + if (FunctionList.List.OtherBrandFunction.Find((obj) => obj.sid == updateTemp.sid) == null) + { + //MainPage.Log($"A鍗忚鏇存柊鐘舵��:鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞�..."); + return; + } + } + } + + + + + var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid); + if (localFunction == null) + { + continue; + } + if (Ins.GatewayOnline_Local && isCloudData)//鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞� + { + if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk)) + { + //MainPage.Log($"A鍗忚鏇存柊鐘舵��:鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞�........"); + return; + } + } + //MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}"); + foreach (var attr in updateTemp.status) + { + localFunction.time_stamp = temp.time_stamp; + localFunction.SetAttrState(attr.key, attr.value); + } + + //鏇存柊鐣岄潰鐘舵�� + switch (localFunction.spk) + { + case SPK.AirSwitch: + AirSwitchPage.UpdataState(localFunction); + if(localFunction.GetAttribute(FunctionAttributeKey.Power)!=null)//濡傛灉鏄甫鐢甸噺鐨勭┖寮�涔熻鏇存柊鑳芥簮鐣岄潰 + { + EnergyMainPage.UpdataStatus(localFunction); + } + break; + case SPK.ElectricEnergy: + EnergyMainPage.UpdataStatus(localFunction); + break; + case SPK.LightSwitch: + RelayPage.UpdataState(localFunction); + break; + case SPK.LightDimming: + localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%"; + DimmerPage.UpdataStates(localFunction); + break; + case SPK.ElectricFan: + case SPK.HvacFan: + localFunction.lastState = Language.StringByID(StringId.Level) + " : " + + localFunction.GetAttrState(FunctionAttributeKey.OpenLevel); + FanPage.UpdataState(localFunction); + break; + case SPK.LightRGB: + localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%"; + RGBPage.UpdataStates(localFunction); + break; + case SPK.LightRGBW: + break; + case SPK.LightCCT: + localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%"; + ColorTureLampPage.UpdataStatus(localFunction); + break; + case SPK.CurtainSwitch: + localFunction.lastState = localFunction.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close); + CurtainModulePage.UpdataState(localFunction); + break; + case SPK.CurtainTrietex: + localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%"; + MotorCurtainPage.UpdataState(localFunction); + break; + case SPK.CurtainRoller: + localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%"; + RollingShutterPage.UpdataState(localFunction); + break; + case SPK.CurtainShades: + break; + case SPK.AcStandard: + case SPK.HvacAC: + case SPK.AcIr: + Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status); + if (localFunction != null) + { + localFunction.lastState = ""; + switch (localFunction.GetAttrState(FunctionAttributeKey.Mode)) + { + case "cool": + localFunction.lastState = Language.StringByID(StringId.Cool); + break; + case "heat": + localFunction.lastState = Language.StringByID(StringId.Heat); + break; + case "dry": + localFunction.lastState = Language.StringByID(StringId.Dry); + break; + case "auto": + localFunction.lastState = Language.StringByID(StringId.Auto); + break; + case "fan": + localFunction.lastState = Language.StringByID(StringId.AirSupply); + break; + } + switch (localFunction.GetAttrState(FunctionAttributeKey.FanSpeed)) + { + case "high": + localFunction.lastState += " " + Language.StringByID(StringId.HighWindSpeed); + break; + case "medium": + localFunction.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed); + break; + case "low": + localFunction.lastState += " " + Language.StringByID(StringId.LowWindSpeed); + break; + case "auto": + localFunction.lastState += " " + Language.StringByID(StringId.Auto); + break; + } + localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new AC().GetTempUnitString(localFunction); + + } + break; + case SPK.HvacFloorHeat: + case SPK.FloorHeatStandard: + localFunction.lastState = ""; + switch (localFunction.GetAttrState(FunctionAttributeKey.Mode)) + { + case "normal": + localFunction.lastState = Language.StringByID(StringId.Normal); + break; + case "day": + localFunction.lastState = Language.StringByID(StringId.Day); + break; + case "night": + localFunction.lastState = Language.StringByID(StringId.Night); + break; + case "timer": + localFunction.lastState = Language.StringByID(StringId.Auto); + break; + case "away": + localFunction.lastState = Language.StringByID(StringId.Away); + break; + } + localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new FloorHeating().GetTempUnitString(localFunction); + FloorHeatingPage.UpdataStates(localFunction); + break; + case SPK.SensorPm25: + case SPK.SensorCO2: + case SPK.SensorTVOC: + case SPK.SensorTemperature: + case SPK.SensorHumidity: + case SPK.SensorHcho: + if(localFunction.spk == SPK.SensorTemperature) + { + HomePage.LoadEvent_RefreshEnvirIndoorTemp(); + } + else if (localFunction.spk == SPK.SensorHumidity) + { + HomePage.LoadEvent_RefreshEnvirIndoorHumi(); + } + EnvironmentalPage.LoadEvent_UpdataStatus(localFunction); + //A_EnvironmentalDataCenter.LoadEvent_UpdataStatus(localFunction); + break; + case SPK.SensorEnvironment: + case SPK.SensorEnvironment2: + case SPK.SensorEnvironment3: + if (localFunction.GetAttributes().Contains(FunctionAttributeKey.Temperature)) + { + HomePage.LoadEvent_RefreshEnvirIndoorTemp(); + } + if (localFunction.GetAttributes().Contains(FunctionAttributeKey.Humidity)) + { + HomePage.LoadEvent_RefreshEnvirIndoorHumi(); + } + EnvironmentalPage.LoadEvent_UpdataStatus(localFunction); + //A_EnvironmentalDataCenter.LoadEvent_UpdataStatus(localFunction); + break; + case SPK.ElectricSocket: + case SPK.PanelSocket: + SocketPage.UpdataState(localFunction); + break; + case SPK.ElectricTV: + break; + case SPK.ElectricTuyaAirCleaner: + case SPK.ElectricTuyaAirCleaner2: + case SPK.ElectricTuyaFan: + case SPK.ElectricTuyaFan2: + case SPK.ElectricTuyaWeepRobot: + case SPK.ElectricTuyaWeepRobot2: + case SPK.ElectricTuyaWaterValve: + case SPK.ElectricTuyaWaterValve2: + case SPK.SensorPir: + case SPK.SensorDoorWindow: + case SPK.SensorSmoke: + case SPK.SensorWater: + case SPK.ClothesHanger: + case SPK.SenesorMegahealth: + case SPK.SenesorMegahealth2: + case SPK.AirFreshStandard: + case SPK.HvacAirFresh: + case SPK.SensorGas: + //璁惧鐘舵�佹帹閫� + //鐘舵�佹洿鏂� + Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status); + break; + } + + HomePage.UpdataFunctionStates(localFunction); + RoomPage.UpdataStates(localFunction); + FunctionPage.UpdataStates(localFunction); + ClassificationPage.UpdataInfo(localFunction); + + } + catch (Exception ex) + { + MainPage.Log($"A鍗忚鏇存柊鐘舵�佸紓甯�:{ex.Message}"); + } + } + } } } -- Gitblit v1.8.0