| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using HDL_ON.Entity; |
| | | using Newtonsoft.Json.Linq; |
| | | using Shared; |
| | | |
| | | namespace HDL_ON |
| | | namespace HDL_ON.DriverLayer |
| | | { |
| | | public partial class Control |
| | | |
| | | /// <summary> |
| | | /// 通讯方式 |
| | | /// </summary> |
| | | public enum CommunicationMode |
| | | { |
| | | /// <summary> |
| | | /// 本地udp |
| | | /// </summary> |
| | | local_BusUdp, |
| | | /// <summary> |
| | | /// 本地tcp服务端 |
| | | /// </summary> |
| | | tcp_local_server, |
| | | /// <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; |
| | | } |
| | | } |
| | | /// <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_Bus myUdp = null; |
| | | |
| | | /// <summary> |
| | | /// 通讯方式 |
| | | /// </summary> |
| | | public CommunicationMode communicationMode; |
| | | |
| | | /// <summary> |
| | | /// 改变通讯方式 |
| | | /// </summary> |
| | | public void ChangeCommunicationMode(CommunicationMode communicationMode) |
| | | { |
| | | this.communicationMode = communicationMode; |
| | | |
| | | |
| | | switch (this.communicationMode) |
| | | { |
| | | case CommunicationMode.local_BusUdp: |
| | | if (myUdp == null) |
| | | { |
| | | myUdp = new Control_Udp_Bus(); |
| | | } |
| | | UdpSocket._BusSocket.Start(); |
| | | if (myTcpServer != null) |
| | | { |
| | | myTcpClient.Close(); |
| | | myTcpClient = null; |
| | | } |
| | | if (myTcpClient != null) |
| | | { |
| | | myTcpClient.Close(); |
| | | myTcpClient = null; |
| | | } |
| | | break; |
| | | case CommunicationMode.tcp_local_server: |
| | | if (myTcpServer == null) |
| | | { |
| | | myTcpServer = new Control_TcpServer(); |
| | | myTcpServer.OpenServer(); |
| | | } |
| | | if (myTcpClient != null) |
| | | { |
| | | myTcpClient.Close(); |
| | | myTcpClient = null; |
| | | } |
| | | if(myUdp != null) |
| | | { |
| | | UdpSocket._BusSocket.Stop(); |
| | | myUdp = null; |
| | | } |
| | | break; |
| | | case CommunicationMode.tcp_local_client: |
| | | if (myTcpClient == null) |
| | | { |
| | | myTcpClient = new Control_TcpClient(reportIp); |
| | | myTcpClient.Connect(); |
| | | } |
| | | if (myTcpServer != null) |
| | | { |
| | | myTcpClient.Close(); |
| | | myTcpClient = null; |
| | | } |
| | | if (myUdp != null) |
| | | { |
| | | UdpSocket._BusSocket.Stop(); |
| | | myUdp = null; |
| | | } |
| | | break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 场景控制入口 |
| | | /// </summary> |
| | | public void ControlScene(Scene scene) |
| | | { |
| | | if(myUdp!=null) |
| | | { |
| | | myUdp.ControlBusScenes(scene); |
| | | } |
| | | if(myTcpClient!= null) |
| | | { |
| | | ControlAProtocolScene(scene); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 发送命令 |
| | |
| | | /// </summary> |
| | | /// <param name="commandString"></param> |
| | | /// <param name="function"></param> |
| | | /// <param name="sendCount"></param> |
| | | /// <returns></returns> |
| | | public static byte[] Send(string commandString, Function function, int sendCount = 3) |
| | | public void SendWriteCommand(Function function, Dictionary<string, string> commandDictionary) |
| | | { |
| | | if (function.bus_Data!=null) |
| | | function.usageCount++; |
| | | function.refreshTime = DateTime.Now; |
| | | if (DB_ResidenceData.residenceData.GatewayType == 0) |
| | | { |
| | | try |
| | | { |
| | | var ssd = function.GetSendJObject(commandString); |
| | | var revBytes = DataConversion_Bus(ssd, function.bus_Data, function); |
| | | return revBytes; |
| | | if(myUdp != null) |
| | | { |
| | | myUdp.WriteBusData(function, commandDictionary); |
| | | } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log($"发送数据异常: {ex.Message}"); |
| | | MainPage.Log($"发送数据异常: {ex.Message}"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | |
| | | //var jObject = new JObject { |
| | | //{ "DeviceAddr", 11}, |
| | | //{ "Epoint", 22}, |
| | | // { "Cluster_ID", 8 }, |
| | | // { "Command", 33}, |
| | | // { "SendMode", 2 } |
| | | //}; |
| | | //var data = new JObject { |
| | | // { "Level", 1 }, |
| | | // { "TransitionTime", 0 } |
| | | //}; |
| | | //jObject.Add("Data", data); |
| | | //return revBytes; |
| | | 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); |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 发送读取命令 |
| | | /// 自动判断是否为A协议设备 |
| | | /// </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协议控制数据转换程bus协议的控制数据 |
| | | /// 控制a协议场景 |
| | | /// </summary> |
| | | /// <param name="commandString"></param> |
| | | /// <returns></returns> |
| | | static byte[] DataConversion_Bus(JObject commandString,BusData bus_Data, Function function) |
| | | /// <param name="scene"></param> |
| | | static void ControlAProtocolScene(Scene scene) |
| | | { |
| | | //反馈: |
| | | //{ |
| | | //"Namespace": "HDL", "Command": "writeRespone", |
| | | //“Type”:”device”, "objects": [{ |
| | | //"sid": "0001002019101209000025670100010001”, "statue": "success” |
| | | //}] } |
| | | try |
| | | { |
| | | var subnetId = bus_Data.SubnetID; |
| | | var deviceId = bus_Data.DeviceID; |
| | | var loopId = bus_Data.LoopID; |
| | | |
| | | var jobj = JObject.FromObject(commandString.GetValue("objects")); |
| | | var functionType = jobj.GetValue("sid").ToString().Substring(22, 2);//截取24,25字符获取控制的设备的类型 |
| | | switch (commandString.GetValue("Command").ToString()) |
| | | { |
| | | case "write": |
| | | switch ((FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(functionType))) |
| | | { |
| | | case FunctionType.Light: |
| | | if (jobj.ContainsKey("brightness")) |
| | | { |
| | | var state = Convert.ToByte(jobj.GetValue("brightness")); |
| | | var bytes = new byte[] { Convert.ToByte(loopId), state, 0, 0 }; |
| | | return ControlBytesSendHasReturn(Command.SetSingleLight, subnetId, deviceId, bytes); |
| | | } |
| | | else if (jobj.ContainsKey("switch"))//继电器 |
| | | { |
| | | var state = jobj.GetValue("switch").ToString() == "0" ? (byte)0 : (byte)100; |
| | | var bytes = new byte[] { Convert.ToByte(loopId), state, 0, 0 }; |
| | | return ControlBytesSendHasReturn(Command.SetSingleLight, subnetId, deviceId, bytes); |
| | | } |
| | | break; |
| | | } |
| | | break; |
| | | case "read": |
| | | switch ((FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(functionType))) |
| | | { |
| | | case FunctionType.Light: |
| | | if (jobj.ContainsKey("switch"))//继电器 |
| | | { |
| | | var state = jobj.GetValue("switch").ToString() == "0" ? (byte)0 : (byte)100; |
| | | var bytes = new byte[] { Convert.ToByte(loopId), state, 0, 0 }; |
| | | return ControlBytesSendHasReturn(Command.ReadLightSingleLoopBrightness, subnetId, deviceId, bytes); |
| | | } |
| | | break; |
| | | } |
| | | break; |
| | | } |
| | | |
| | | } |
| | | catch (Exception ex) { |
| | | MainPage.Log($"DataConversion_Bus Erorr : {ex.Message}"); |
| | | } |
| | | |
| | | return null; |
| | | var sendSidObj = new AProtocolSendingObject(); |
| | | sendSidObj.time_stamp = ""; |
| | | sendSidObj.type = "device_sid"; |
| | | sendSidObj.command = "get_list_response"; |
| | | } |
| | | |
| | | } |