From 6d73bf6e816570291865674bef8bce8972e4de3f Mon Sep 17 00:00:00 2001 From: xm <1271024303@qq.com> Date: 星期三, 01 十二月 2021 16:32:57 +0800 Subject: [PATCH] 2021-12-01-01 --- HDL_ON/DAL/DriverLayer/Control.cs | 254 +++++++++++++++++++++++++++++++++++++++++++++----- 1 files changed, 229 insertions(+), 25 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/Control.cs b/HDL_ON/DAL/DriverLayer/Control.cs index 99c5b0e..be5293d 100644 --- a/HDL_ON/DAL/DriverLayer/Control.cs +++ b/HDL_ON/DAL/DriverLayer/Control.cs @@ -38,6 +38,11 @@ return _control; } } + /// <summary> + /// 璁板綍鎺ユ敹鍒扮殑娑堟伅锛屾柟渚縵b鐨勫伐绋嬪笀璋冭瘯浠栦滑鐨勮澶� + /// </summary> + public List<string> MsgInfoList = new List<string>(); + int _msg_id = 1; /// <summary> /// 閫氳ID @@ -63,7 +68,19 @@ /// 鏄惁鎼滅储鏈湴缃戝叧鎴愬姛 /// </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> /// 缃戝叧鍦ㄧ嚎-灞�鍩熺綉 @@ -267,6 +284,7 @@ else if (DB_ResidenceData.Instance.GatewayType == 1) { new Control_Udp().SearchLocalGateway(); + new Control_Udp().SearchLocalGateway(true); } System.Threading.Thread.Sleep(500); } @@ -341,7 +359,7 @@ /// <param name="function"></param> /// <param name="useRemote">鏄惁鐩存帴浣跨敤杩滅▼鍙戦��</param> /// <returns></returns> - public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false) + public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary, bool useRemote = false,int resend = 3) { function.controlCounter++; function.refreshTime = DateTime.Now; @@ -395,9 +413,12 @@ 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; } @@ -435,7 +456,7 @@ 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); + new Control_Udp().SendLocalHdlLinkData(sendBytes, functionControlDataObj.id,resend); MainPage.Log($"鏈湴閫氳 鍙戦�丠DL-Link鏁版嵁:{functionControlDataJson}"); } } @@ -467,6 +488,7 @@ var actionObjs = new List<ApiAlinkControlActionObj>(); actionObjs.Add(apiControlData); var pack = httpServer.ControlDevice(actionObjs); + MainPage.Log($"杩滅▼鎺у埗鍙嶉:{pack.message}"); } } @@ -602,9 +624,9 @@ { id = Ins.msg_id.ToString(), objects = new List<Dictionary<string, string>>() - { - readKey - }, + { + readKey + }, time_stamp = Utlis.GetTimestamp() }; var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj); @@ -618,6 +640,41 @@ var pm = new DAL.Server.HttpServerRequest(); var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId }); } + } + } + + /// <summary> + /// 瀹夐槻鎺у埗 + /// </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); } } @@ -647,21 +704,66 @@ }; var aLinkJson = Newtonsoft.Json.JsonConvert.SerializeObject(aLinkData); var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlScene, aLinkJson); - new Control_Udp().SendLocalHdlLinkData(sendBytes, aLinkData.id); + 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> - public byte[] ConvertSendBodyData(string topic, string bodyDataString) + /// <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 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"); + //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; } @@ -669,18 +771,22 @@ /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 /// </summary> /// <returns></returns> - public void ConvertReceiveData(byte[] receiveBytes) + public void ConvertReceiveData(byte[] receiveBytes,string ip) { var reString = Encoding.UTF8.GetString(receiveBytes); - AnalysisReceiveData(reString); + AnalysisReceiveData(reString, receiveBytes,ip); } /// <summary> /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 /// </summary> + /// <param name="receiveString">杞琒tring鍚庣殑鏁版嵁</param> + /// <param name="originalReceiveBytes"鍘熷Bytes鏁版嵁</param> /// <returns></returns> - public LocalCommunicationData AnalysisReceiveData(string receiveString) + 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"); @@ -702,8 +808,7 @@ } } - MainPage.Log($"灞�鍩熺綉淇℃伅: {receiveObj.Topic} : 鍐呭: {res[1]}"); - + //MainPage.Log($"灞�鍩熺綉淇℃伅: {receiveObj.Topic} : 鍐呭: {res[1]}"); //楠岃瘉鏈夋晥鏁版嵁闀垮害 //if (res[1].Length != receiveObj.Length) @@ -712,6 +817,44 @@ // 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) { @@ -736,15 +879,54 @@ { Ins.GatewayId = device.device_mac; } - reportIp = "239.0.168.188";// device.ip_address;//涓绘挱鍦板潃涔熻兘鎺у埗璁惧 + 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 == 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 { @@ -800,7 +982,7 @@ return; } } - MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}"); + //MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}"); foreach (var attr in updateTemp.status) { localFunction.time_stamp = temp.time_stamp; @@ -808,9 +990,15 @@ } //鏇存柊鐣岄潰鐘舵�� - Function localObj = null; 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; @@ -823,6 +1011,7 @@ DimmerPage.UpdataStates(localFunction); break; case SPK.ElectricFan: + case SPK.HvacFan: localFunction.lastState = Language.StringByID(StringId.Level) + " : " + localFunction.GetAttrState(FunctionAttributeKey.OpenLevel); FanPage.UpdataState(localFunction); @@ -852,6 +1041,8 @@ case SPK.CurtainShades: break; case SPK.AcStandard: + case SPK.HvacAC: + case SPK.AcIr: Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status); if (localFunction != null) { @@ -890,10 +1081,12 @@ break; } localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new AC().GetTempUnitString(localFunction); - ACPage.UpdataStates(localFunction); + } break; + case SPK.HvacFloorHeat: case SPK.FloorHeatStandard: + localFunction.lastState = ""; switch (localFunction.GetAttrState(FunctionAttributeKey.Mode)) { case "normal": @@ -920,6 +1113,7 @@ case SPK.SensorTVOC: case SPK.SensorTemperature: case SPK.SensorHumidity: + case SPK.SensorHcho: if(localFunction.spk == SPK.SensorTemperature) { HomePage.LoadEvent_RefreshEnvirIndoorTemp(); @@ -929,6 +1123,7 @@ HomePage.LoadEvent_RefreshEnvirIndoorHumi(); } EnvironmentalPage.LoadEvent_UpdataStatus(localFunction); + //A_EnvironmentalDataCenter.LoadEvent_UpdataStatus(localFunction); break; case SPK.SensorEnvironment: case SPK.SensorEnvironment2: @@ -942,23 +1137,32 @@ 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.AcIr: case SPK.SenesorMegahealth: + case SPK.SenesorMegahealth2: + case SPK.AirFreshStandard: + case SPK.HvacAirFresh: + case SPK.SensorGas: //璁惧鐘舵�佹帹閫� //鐘舵�佹洿鏂� Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status); -- Gitblit v1.8.0