From e87985ec1dcb69beedaf9f95e8e7aba14b7c08d6 Mon Sep 17 00:00:00 2001 From: JLChen <551775569@qq.com> Date: 星期三, 09 十二月 2020 18:50:14 +0800 Subject: [PATCH] 2020-12-09 1.信息中心,增加下划线和点击Alter提醒详情。 --- HDL_ON/DAL/DriverLayer/Control.cs | 617 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 617 insertions(+), 0 deletions(-) diff --git a/HDL_ON/DAL/DriverLayer/Control.cs b/HDL_ON/DAL/DriverLayer/Control.cs new file mode 100644 index 0000000..5f3c63b --- /dev/null +++ b/HDL_ON/DAL/DriverLayer/Control.cs @@ -0,0 +1,617 @@ +using 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> + local_BusUdp, + /// <summary> + /// 鏈湴tcp瀹㈡埛绔� + /// </summary> + tcp_local_client, + } + + public class Control + { + static Control _control; + public static Control Ins + { + get + { + if (_control == null) + { + _control = new Control(); + } + return _control; + } + } + 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(); + } + + bool _gatewayOnline = false; + /// <summary> + /// 缃戝叧鏄惁鍦ㄧ嚎 + /// </summary> + public bool GatewayOnline { + get + { + return _gatewayOnline; + } + set + { + if (_gatewayOnline != value) + { + _gatewayOnline = value; + //淇敼涓婚〉杩炴帴鐘舵�� + UI.HomePage.LoadEvent_CheckLinkStatus(); + if (value) + { + MainPage.Log($"缃戝叧鍦ㄧ嚎锛屽埛鏂拌澶囩姸鎬�"); + FunctionList.List.ReadAllFunctionStatus(); + } + } + } + } + /// <summary> + /// 缃戝叧閫氳ID + /// </summary> + public string GatewayId; + + bool _isRemote = false; + /// <summary> + /// 鏄惁涓鸿繙绋嬭繛鎺� + /// </summary> + public bool IsRemote { + get + { + return _isRemote; + } + set + { + _isRemote = value; + //淇敼涓婚〉杩炴帴鐘舵�� + HomePage.LoadEvent_CheckLinkStatus(); + } + } + /// <summary> + /// 閫氳鍦板潃IP + /// </summary> + public string reportIp = "255.255.255.255"; + /// <summary> + /// tcp鏈嶅姟绔� + /// </summary> + public Control_TcpServer myTcpServer = null; + /// <summary> + /// tcp瀹㈡湇绔� + /// </summary> + public Control_TcpClient myTcpClient = null; + /// <summary> + /// 鏈湴udp + /// </summary> + public Control_Udp myUdp = null; + + /// <summary> + /// 閫氳鏂瑰紡 + /// </summary> + public CommunicationMode communicationMode; + + /// <summary> + /// 鎵撳紑tcp鏈嶅姟绔� + /// </summary> + public void OpenTcpServer() + { + myTcpServer = new Control_TcpServer(); + myTcpServer.OpenServer(); + } + + /// <summary> + /// 鎵撳紑Udp + /// </summary> + public void OpenUdp(int port) + { + if (myUdp == null) + { + myUdp = new Control_Udp(); + } + + UdpSocket._BusSocket.Start(port); + } + /// <summary> + /// 鍏抽棴udp + /// </summary> + public void CloseUdp() + { + if (myUdp != null) + { + myUdp = null; + } + UdpSocket._BusSocket.Stop(); + } + + /// <summary> + /// 鎵撳紑tcp瀹㈡湇绔� + /// </summary> + public void OpenTcpClent() + { + if (myTcpClient == null) + { + myTcpClient = new Control_TcpClient(reportIp); + myTcpClient.Connect(); + } + } + + ///// <summary> + ///// 鏀瑰彉閫氳鏂瑰紡 + ///// </summary> + //public void ChangeCommunicationMode(CommunicationMode communicationMode) + //{ + // this.communicationMode = communicationMode; + //} + + /// <summary> + /// 鎼滅储鏈湴缃戝叧鍒楄〃 + /// </summary> + public void SearchLoaclGateway() + { + OpenUdp(DB_ResidenceData.residenceData.GatewayType == 0 ? 6000 : 8585); + new System.Threading.Thread(() => + { + for (int i = 0; i < 5; i++) + { + if (GatewayOnline) + break; + if (DB_ResidenceData.residenceData.GatewayType == 0) + { + myUdp.ControlBytesSend(Command.ReadGateway, 255, 255, new byte[] { (byte)new Random().Next(255), (byte)new Random().Next(255) }); + } + else if (DB_ResidenceData.residenceData.GatewayType == 1) + { + myUdp.SearchLocalGateway(); + } + System.Threading.Thread.Sleep(500); + } + }) + { IsBackground = true }.Start(); + if (!GatewayOnline)//缃戝叧涓嶅湪绾跨殑鏃跺�欐墠鍙皾璇曡繙绋嬭繛鎺� + { + Ins.IsRemote = true; + DAL.Mqtt.MqttClient.InitState(); + } + } + + /// <summary> + /// 鍦烘櫙鎺у埗鍏ュ彛 + /// </summary> + public void ControlScene(Scene scene) + { + if(myUdp!=null) + { + myUdp.ControlBusScenes(scene); + } + if(myTcpClient!= null) + { + ControlAProtocolScene(scene); + } + } + + /// <summary> + /// 鍙戦�佸懡浠� + /// 鑷姩鍒ゆ柇鏄惁涓篈鍗忚璁惧锛� + /// 涓嶆槸A鍗忚锛岃嚜鍔ㄨ浆鍖朾us鍛戒护鏁版嵁 + /// </summary> + /// <param name="commandString"></param> + /// <param name="function"></param> + /// <returns></returns> + public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary) + { + function.usageCount++; + function.refreshTime = DateTime.Now; + DAL.Server.HttpServerRequest httpServer = new DAL.Server.HttpServerRequest(); + //杩滅▼閫氳 + if (Ins.IsRemote) + { + //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.Code}:{pack.Data}"); + } + //鏈湴閫氳 + else + { + //Bus鎺у埗 + if (DB_ResidenceData.residenceData.GatewayType == 0) + { + try + { + if (myUdp != null) + { + myUdp.WriteBusData(function, commandDictionary); + } + } + catch (Exception ex) + { + MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + } + } + //ALink鎺у埗 + else + { + if (myUdp != null) + { + var functionControlDataObj = function.GetGatewayAlinkControlData(commandDictionary); + var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(functionControlDataObj); + var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ControlFunctionTopic, functionControlDataJson); + myUdp.SendLocalHdlLinkData(sendBytes); + } + } + } + } + + /// <summary> + /// 鍙戦�佽鍙栧懡浠� + /// 鑷姩鍒ゆ柇鏄惁涓篈鍗忚璁惧 + /// </summary> + public void SendReadCommand(Function function) + { + function.refreshTime = DateTime.Now; + if (Ins.IsRemote) + { + var pm = new DAL.Server.HttpServerRequest(); + var pack = pm.RefreshDeviceStatus(new List<string>() { function.deviceId}); + } + else + { + if (DB_ResidenceData.residenceData.GatewayType == 0) + { + try + { + Ins.myUdp.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); + Ins.myUdp.SendLocalHdlLinkData(sendBytes); + } + } + } + ///// <summary> + ///// 鍙戦�丄鍗忚璇诲彇鍛戒护 + ///// </summary> + //public void SendReadCommand(List<Dictionary<string, string>> keyValuePairs) + //{ + // var readDataObj = new GatewayAlinkReadObj() + // { + // id = Ins.msg_id.ToString(), + // objects = keyValuePairs, + // time_stamp = Utlis.GetTimestamp() + // }; + // var functionControlDataJson = Newtonsoft.Json.JsonConvert.SerializeObject(readDataObj); + // var sendBytes = Ins.ConvertSendBodyData(CommunicationTopic.ct.ReadStatus, functionControlDataJson); + // Ins.myUdp.SendLocalHdlLinkData(sendBytes); + //} + + /// <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"; + } + /// <summary> + /// 杞崲閫氳鏁版嵁 + /// </summary> + public byte[] ConvertSendBodyData(string topic, string bodyDataString) + { + 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"); + + return sendDataBytes; + } + /// <summary> + /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 + /// </summary> + /// <returns></returns> + public void ConvertReceiveData(byte[] receiveBytes) + { + var reString = Encoding.UTF8.GetString(receiveBytes); + AnalysisReceiveData(reString); + } + /// <summary> + /// 杞崲鎺ユ敹鍒扮殑鏁版嵁 + /// </summary> + /// <returns></returns> + public LocalCommunicationData AnalysisReceiveData(string receiveString) + { + LocalCommunicationData receiveObj = new LocalCommunicationData(); + + 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; + } + } + //楠岃瘉鏈夋晥鏁版嵁闀垮害 + //if (res[1].Length != receiveObj.Length) + //{ + // MainPage.Log($"鏀跺埌鏁版嵁鍖呴暱搴︿笉澶�"); + // return receiveObj; + //} + receiveObj.BodyDataString = res[1]; + + var bodyJObj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack>(res[1]); + if (bodyJObj == null) + { + return receiveObj; + } + if (receiveObj.Topic == CommunicationTopic.SearchLoaclGatewayReply) + { + var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString()); + if (device.device_mac == DB_ResidenceData.residenceData.residenceGatewayMAC) + { + Ins.GatewayOnline = true; + if(!string.IsNullOrEmpty( device.gatewayId)) + { + Ins.GatewayId = device.gatewayId; + } + else + { + Ins.GatewayId = device.device_mac; + } + reportIp = "239.0.168.188";// device.ip_address; + Ins.IsRemote = false; + } + } + else if(receiveObj.Topic == CommunicationTopic.ct.ReadStatus+"_reply" || + receiveObj.Topic == CommunicationTopic.ct.GatewayUpStatus) + { + UpdataFunctionStatus(receiveObj.BodyDataString); + } + } + return receiveObj; + } + + /// <summary> + /// 鏇存柊璁惧鐘舵�� + /// A鍗忚鏁版嵁 + /// </summary> + /// <param name="updateBytes"></param> + public void UpdataFunctionStatus(string revString) + { + MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}"); + var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<AlinkFunctionStatusObj>(revString); + if (temp != null) + { + var allLocalFuntion = FunctionList.List.GetAllDeviceFunctionList(); + foreach (var updateTemp in temp.objects) + { + try + { + bool hadChange = false;//鐘舵�佹湁鍙樺寲鍐嶆洿鏂扮晫闈� + var updataObj = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid); + if (updataObj != null) + { + foreach (var attr in updateTemp.status) + { + foreach (var locatAttr in updataObj.attributes) + { + if (attr.key == locatAttr.key) + { + if (locatAttr.curValue.ToString() == attr.value) + { + continue; + } + locatAttr.curValue = attr.value; + hadChange = true; + } + } + } + if (!hadChange)//鐘舵�佹湁鍙樺寲鍐嶆洿鏂扮晫闈� + { + continue; + } + //鏇存柊鐣岄潰鐘舵�� + switch (updataObj.spk) + { + case SPK.LightSwitch: + RelayPage.UpdataState(updataObj as Light); + break; + case SPK.LightDimming: + var dimming = updataObj as Light; + dimming.lastState = Language.StringByID(StringId.Brightness) + " : " + dimming.brightness + "%"; + DimmerPage.UpdataStates(dimming); + break; + case SPK.ElectricFan: + var fan = updataObj as Fan; + fan.lastState = Language.StringByID(StringId.Level) + " : " + fan.openLevel; + FanPage.UpdataState(fan); + break; + case SPK.LightRGB: + var rgb = updataObj as Light; + rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + rgb.brightness + "%"; + RGBPage.UpdataStates(rgb); + break; + case SPK.LightRGBW: + case SPK.LightCCT: + break; + case SPK.CurtainSwitch: + var curtain = updataObj as Curtain; + curtain.lastState = curtain.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close); + CurtainModulePage.UpdataState(curtain); + break; + case SPK.CurtainTrietex: + var trietex = updataObj as Curtain; + trietex.lastState = Language.StringByID(StringId.Open) + trietex.percent + "%"; + MotorCurtainPage.UpdataState(trietex); + break; + case SPK.CurtainRoller: + var roller = updataObj as Curtain; + roller.lastState = Language.StringByID(StringId.Open) + roller.percent + "%"; + RollingShutterPage.UpdataState(roller); + break; + case SPK.CurtainShades: + break; + case SPK.AcStandard: + var ac = updataObj as AC; + ac.lastState = ""; + switch (ac.trait_mode.curValue.ToString()) + { + case "cool": + ac.lastState = Language.StringByID(StringId.Cool); + break; + case "heat": + ac.lastState = Language.StringByID(StringId.Heat); + break; + case "dry": + ac.lastState = Language.StringByID(StringId.Dry); + break; + case "auto": + ac.lastState = Language.StringByID(StringId.Auto); + break; + case "fan": + ac.lastState = Language.StringByID(StringId.AirSupply); + break; + } + switch (ac.trait_fan.curValue.ToString()) + { + case "high": + ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed); + break; + case "medium": + ac.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed); + break; + case "low": + ac.lastState += " " + Language.StringByID(StringId.LowWindSpeed); + break; + case "auto": + ac.lastState += " " + Language.StringByID(StringId.Auto); + break; + } + ac.lastState += " " + ac.trait_temp.curValue + ac.tempUnitString; + ACPage.UpdataStates(ac); + break; + case SPK.FloorHeatStandard: + var fh = updataObj as FloorHeating; + switch (fh.trait_mode.curValue) + { + case "normal": + fh.lastState = Language.StringByID(StringId.Normal); + break; + case "day": + fh.lastState = Language.StringByID(StringId.Day); + break; + case "night": + fh.lastState = Language.StringByID(StringId.Night); + break; + case "timer": + fh.lastState = Language.StringByID(StringId.Auto); + break; + case "away": + fh.lastState = Language.StringByID(StringId.Away); + break; + } + fh.lastState += " " + fh.trait_temp.curValue + fh.tempUnitString; + FloorHeatingPage.UpdataStates(fh); + break; + case SPK.SensorPm25: + case SPK.SensorCO2: + case SPK.SensorTVOC: + case SPK.SensorTemperature: + case SPK.SensorHumidity: + var sensor = updataObj as Sensor; + EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor); + break; + case SPK.ElectricSocket: + break; + case SPK.ElectricTV: + break; + default: + break; + } + HomePage.UpdataFunctionStates(updataObj); + RoomPage.UpdataStates(updataObj); + FunctionPage.UpdataStates(updataObj); + ClassificationPage.UpdataInfo(updataObj); + } + } + catch (Exception ex) + { + MainPage.Log($"A鍗忚鏇存柊鐘舵�佸紓甯�:{ex.Message}"); + } + } + } + } + + } +} \ No newline at end of file -- Gitblit v1.8.0