From 0f2e0147e8990e913d16d99bc1b94fb6bc53abd7 Mon Sep 17 00:00:00 2001 From: 陈嘉乐 <cjl@hdlchina.com.cn> Date: 星期四, 03 十二月 2020 15:35:42 +0800 Subject: [PATCH] 2020-12-03-1 --- HDL_ON/DAL/DriverLayer/Control.cs | 363 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 363 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..bdf87b9 --- /dev/null +++ b/HDL_ON/DAL/DriverLayer/Control.cs @@ -0,0 +1,363 @@ +using System; +using System.Collections.Generic; +using System.Text; +using HDL_ON.Entity; + +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 + { + _gatewayOnline = value; + //淇敼涓婚〉杩炴帴鐘舵�� + UI.HomePage.LoadEvent_CheckLinkStatus(); + } + } + /// <summary> + /// 缃戝叧閫氳ID + /// </summary> + public string GatewayId; + /// <summary> + /// 鏄惁涓鸿繙绋嬭繛鎺� + /// </summary> + public bool IsRemote = false; + /// <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); + + 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(); + } + } + + /// <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); + httpServer.ControlDevice(actionObjs); + } + //鏈湴閫氳 + else + { + //ALink鎺у埗 + if (DB_ResidenceData.residenceData.GatewayType == 0) + { + try + { + if (myUdp != null) + { + myUdp.WriteBusData(function, commandDictionary); + } + } + catch (Exception ex) + { + MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + } + } + //Bus鎺у埗 + 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); + //MainPage.Log($"鍙戦�佹湰鍦癏DL-Link鏁版嵁{functionControlDataJson}\r\n"); + } + } + } + } + + /// <summary> + /// 鍙戦�佽鍙栧懡浠� + /// 鑷姩鍒ゆ柇鏄惁涓篈鍗忚璁惧 + /// </summary> + public void SendReadCommand(Function function) + { + function.refreshTime = DateTime.Now; + if (function.bus_Data != null) + { + try + { + //ReadBusData(function); + } + catch (Exception ex) + { + MainPage.Log($"鍙戦�佹暟鎹紓甯�: {ex.Message}"); + } + } + 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); + } + } + + /// <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; + } + switch (receiveObj.Topic) + { + case CommunicationTopic.SearchLoaclGatewayReply: + var device = Newtonsoft.Json.JsonConvert.DeserializeObject<DeviceModule>(bodyJObj.objects.ToString()); + if (device.device_mac == DB_ResidenceData.residenceData.residenceGatewayMAC) + { + Ins.GatewayOnline = true; + Ins.GatewayId = device.gatewayId; + reportIp = "239.0.168.188";// device.ip_address; + } + break; + } + } + return receiveObj; + } + } +} \ No newline at end of file -- Gitblit v1.8.0