| | |
| | | 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> |
| | | /// 发送命令 |
| | |
| | | /// <param name="commandString"></param> |
| | | /// <param name="function"></param> |
| | | /// <returns></returns> |
| | | public static void Send(string commandType, Function function) |
| | | 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); |
| | | ControlBusData(function, commandType); |
| | | //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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | /// <summary> |
| | | /// 将A协议控制数据转换程bus协议的控制数据 |
| | | /// 发送读取命令 |
| | | /// 自动判断是否为A协议设备 |
| | | /// </summary> |
| | | /// <param name="commandString"></param> |
| | | /// <returns></returns> |
| | | static void ControlBusData(Function function,string command)//JObject commandString,BusData bus_Data, |
| | | public void SendReadCommand(Function function) |
| | | { |
| | | //反馈: |
| | | //{ |
| | | //"Namespace": "HDL", "Command": "writeRespone", |
| | | //“Type”:”device”, "objects": [{ |
| | | //"sid": "0001002019101209000025670100010001”, "statue": "success” |
| | | //}] } |
| | | try |
| | | function.refreshTime = DateTime.Now; |
| | | if (function.bus_Data != null) |
| | | { |
| | | var subnetId = function.bus_Data.SubnetID; |
| | | var deviceId = function.bus_Data.DeviceID; |
| | | var loopId = function.bus_Data.LoopID; |
| | | |
| | | //var jobj = JObject.FromObject(commandString.GetValue("objects")); |
| | | //var functionType = jobj.GetValue("sid").ToString().Substring(22, 2);//截取24,25字符获取控制的设备的类型 |
| | | switch (command) |
| | | try |
| | | { |
| | | case "write": |
| | | switch (function.functionCategory) |
| | | { |
| | | case FunctionType.Light: |
| | | var light = function as Light; |
| | | switch (light.functionType) |
| | | { |
| | | case "RGB": |
| | | byte b = 100;//开关操作依据on_off字段,实际开关值依据brightness,当on_off为打开,brightness不能为0 |
| | | if (light.on_off == 0) |
| | | { |
| | | b = 0; |
| | | } |
| | | else |
| | | { |
| | | b = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness; |
| | | } |
| | | var bytes = new byte[] { function.bus_Data.LoopID, |
| | | b, |
| | | 254, 0,0,3, |
| | | light.redColor,light.greenColor, |
| | | light.blueColor, |
| | | 0,0}; |
| | | ControlBytesSend(Command.SetLogicLoopColor, subnetId, deviceId, bytes); |
| | | break; |
| | | case "Dimmer": |
| | | byte b1 = 100; |
| | | if (light.on_off == 0) |
| | | { |
| | | b1 = 0; |
| | | } |
| | | else |
| | | { |
| | | b1 = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness; |
| | | } |
| | | ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { |
| | | function.bus_Data.LoopID, |
| | | b1, |
| | | 0, 0 }); |
| | | break; |
| | | case "Relay": |
| | | ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, light.on_off == 1 ? (byte)100 : (byte)0, 0, 0 }); |
| | | break; |
| | | } |
| | | break; |
| | | case FunctionType.Curtain: |
| | | //if (jobj.ContainsKey("Curtain"))//on/off/stop |
| | | //{ |
| | | // byte state = 0; |
| | | // switch (jobj.GetValue("switch").ToString()) |
| | | // { |
| | | // case "stop": |
| | | // state = 0; |
| | | // break; |
| | | // case "on": |
| | | // state = 1; |
| | | // break; |
| | | // case "off": |
| | | // state = 2; |
| | | // break; |
| | | // } |
| | | // return ControlBytesSendHasReturn(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { function.bus_Data.LoopID, state }); |
| | | //} |
| | | //else if (jobj.ContainsKey("MotorCurtain") || jobj.ContainsKey("RollingShutter")) |
| | | //{ |
| | | // var state = Convert.ToByte(jobj.GetValue("openLevel").ToString()); |
| | | // return ControlBytesSendHasReturn(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, state }); |
| | | //} |
| | | 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; |
| | | //ReadBusData(function); |
| | | } |
| | | |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log($"发送数据异常: {ex.Message}"); |
| | | } |
| | | } |
| | | catch (Exception ex) { |
| | | MainPage.Log($"DataConversion_Bus Erorr : {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"; |
| | | } |
| | | |
| | | } |
| | | } |