using System; using System.Collections.Generic; using System.Text; using HDL_ON.Entity; namespace HDL_ON.DriverLayer { /// /// 通讯方式 /// public enum CommunicationMode { none, /// /// 本地udp /// local_BusUdp, /// /// 本地tcp客户端 /// 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; /// /// 通讯ID /// public int msg_id { get { return _msg_id++; } } bool _gatewayOnline = false; /// /// 网关是否在线 /// public bool GatewayOnline { get { return _gatewayOnline; } set { _gatewayOnline = value; //修改主页连接状态 UI.HomePage.LoadEvent_CheckLinkStatus(); } } /// /// 是否为远程连接 /// public bool IsRemote = false; /// /// 通讯地址IP /// public string reportIp = "255.255.255.255"; /// /// tcp服务端 /// public Control_TcpServer myTcpServer = null; /// /// tcp客服端 /// public Control_TcpClient myTcpClient = null; /// /// 本地udp /// public Control_Udp myUdp = null; /// /// 通讯方式 /// public CommunicationMode communicationMode; /// /// 打开tcp服务端 /// public void OpenTcpServer() { myTcpServer = new Control_TcpServer(); myTcpServer.OpenServer(); } /// /// 打开Udp /// public void OpenUdp(int port) { if (myUdp == null) { myUdp = new Control_Udp(); } UdpSocket._BusSocket.Start(port); } /// /// 打开tcp客服端 /// public void OpenTcpClent() { if (myTcpClient == null) { myTcpClient = new Control_TcpClient(reportIp); myTcpClient.Connect(); } } ///// ///// 改变通讯方式 ///// //public void ChangeCommunicationMode(CommunicationMode communicationMode) //{ // this.communicationMode = communicationMode; //} /// /// 搜索本地网关列表 /// 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(); } } /// /// 场景控制入口 /// public void ControlScene(Scene scene) { if(myUdp!=null) { myUdp.ControlBusScenes(scene); } if(myTcpClient!= null) { ControlAProtocolScene(scene); } } /// /// 发送命令 /// 自动判断是否为A协议设备, /// 不是A协议,自动转化bus命令数据 /// /// /// /// public void SendWriteCommand(Function function, Dictionary commandDictionary) { function.usageCount++; function.refreshTime = DateTime.Now; if (DB_ResidenceData.residenceData.GatewayType == 0) { try { if(myUdp != null) { myUdp.WriteBusData(function, commandDictionary); } } catch (Exception ex) { MainPage.Log($"发送数据异常: {ex.Message}"); } } else { if (myTcpClient != null) { var sendDataObj = function.GetControlSendData(commandDictionary); var sendJson = Newtonsoft.Json.JsonConvert.SerializeObject(sendDataObj); var sendBytes = System.Text.Encoding.UTF8.GetBytes(sendJson); myTcpClient.SendMessage(sendBytes); } } } /// /// 发送读取命令 /// 自动判断是否为A协议设备 /// 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); } } /// /// 控制a协议场景 /// /// static void ControlAProtocolScene(Scene scene) { var sendSidObj = new AProtocolSendingObject(); sendSidObj.time_stamp = ""; sendSidObj.type = "device_sid"; sendSidObj.command = "get_list_response"; } /// /// 转换通讯数据 /// 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); return sendDataBytes; } /// /// 转换接收到的数据 /// /// public void ConvertReceiveData(byte[] receiveBytes) { var reString = Encoding.UTF8.GetString(receiveBytes); AnalysisReceiveData(reString); } /// /// 转换接收到的数据 /// /// 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(res[1]); if (bodyJObj == null) { return receiveObj; } switch (receiveObj.Topic) { case CommunicationTopic.SearchLoaclGateway: var device = Newtonsoft.Json.JsonConvert.DeserializeObject(bodyJObj.objects.ToString()); #if DEBUG if (UserInfo.Current.AccountString == "464027401@qq.com") { DB_ResidenceData.residenceData.residenceGatewayMAC = "0000000000000000"; } #endif if (device.device_mac == DB_ResidenceData.residenceData.residenceGatewayMAC) { Control.Ins.GatewayOnline = true; } break; } } return receiveObj; } } }