| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using System.Text; |
| | | using HDL_ON.DAL; |
| | | using HDL_ON.DAL.Net; |
| | | using HDL_ON.Entity; |
| | | using HDL_ON.Entity.Enumerative; |
| | | using HDL_ON.UI; |
| | | using Newtonsoft.Json.Linq; |
| | | |
| | | 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 static byte[] Send(JObject commandString, Function function, int sendCount) |
| | | |
| | | public class Control |
| | | { |
| | | static Control _control; |
| | | public static Control ins |
| | | { |
| | | if (string.IsNullOrEmpty(function.A_Protocol)) |
| | | 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> |
| | | /// 发送命令 |
| | | /// 自动判断是否为A协议设备, |
| | | /// 不是A协议,自动转化bus命令数据 |
| | | /// </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; |
| | | if (DB_ResidenceData.residenceData.GatewayType == 0) |
| | | { |
| | | try |
| | | { |
| | | var subnetID = Convert.ToByte(JObject.FromObject(function.Bus_Protocol).GetValue("SubnetID")); |
| | | var deviceID = Convert.ToByte(JObject.FromObject(function.Bus_Protocol).GetValue("DeviceID")); |
| | | byte[] bytes = DataConversion_Bus(commandString); |
| | | |
| | | var sss = ControlBytesSendHasReturn(Command.SetSingleLight, subnetID, deviceID, bytes, sendCount); |
| | | return sss; |
| | | 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 null; |
| | | 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) |
| | | /// <param name="scene"></param> |
| | | static void ControlAProtocolScene(Scene scene) |
| | | { |
| | | //反馈: |
| | | //{ |
| | | //"Namespace": "HDL", "Command": "writeRespone", |
| | | //“Type”:”device”, "objects": [{ |
| | | //"sid": "0001002019101209000025670100010001”, "statue": "success” |
| | | //}] } |
| | | byte[] sendBytes; |
| | | |
| | | switch (commandString.GetValue("Command").ToString()) |
| | | { |
| | | case "write": |
| | | var jobj = JObject.FromObject(commandString.GetValue("objects")); |
| | | var functionType = jobj.GetValue("sid").ToString().Substring(24, 2); |
| | | switch ((FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(functionType))) |
| | | { |
| | | case FunctionType.Light: |
| | | if (jobj.ContainsKey("Switch"))//继电器 |
| | | { |
| | | if (jobj.ContainsKey("Dimmer")) |
| | | {//调光器 |
| | | |
| | | } |
| | | else//继电器 |
| | | { |
| | | |
| | | } |
| | | } |
| | | break; |
| | | } |
| | | break; |
| | | } |
| | | |
| | | |
| | | return null; |
| | | var sendSidObj = new AProtocolSendingObject(); |
| | | sendSidObj.time_stamp = ""; |
| | | sendSidObj.type = "device_sid"; |
| | | sendSidObj.command = "get_list_response"; |
| | | } |
| | | |
| | | } |