using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace ZigBee.Device { [System.Serializable] public class AC : ThirdPartyModuleUpgrade { public AC() { this.Type = DeviceType.Thermostat; } /// ///当前室内温度 /// public int currentLocalTemperature = 0; /// /// 当前加热度数 /// public int currentHeatingSetpoint = 0; /// /// 当前制冷度数 /// public int currentCoolingSetpoint = 0; /// /// 当前自动温度 /// public int currentAutoSetpoint; /// ///恒温设备类型 /// 恒温设备具备功能,Attribute Values如下 /// 0:(Cooling Only) 无Heat和Emergency功能 /// 1:(Cooling With Reheat)无Heat和Emergency功能 /// 2:(Heating Only)无Cool和Precooling功能 /// 3:(Heating With Reheat)无Cool和Precooling功能 /// 4:(Cooling and Heating 4-pipes)可能有所有功能 /// 5:(Cooling and Heating 4-pipes with Reheat)可能有所有功能 /// public int currentAcType = 0; /// /// 恒温设备当前模式 /// 恒温设备具备功能,SystemMode Attribute Values如下 /// 0:Off /// 1:Auto /// 3:Cool /// 4:Heat /// 5:Emergency heating /// 6:Precooling /// 7:Fan only /// 8:Dry /// 9:Sleep /// public int currentSystemMode = 0; /// /// 风扇当前模式 /// 0:Off /// 1:Low /// 2:Medium /// 3:High /// 4:On /// 5:Auto /// 6:Smart /// public int currentFanMode = 0; /// /// 风扇zz扫风当前模式 /// 0:1挡 /// 1:2 /// 2:3 /// 3:4 /// 4:5 /// 7:Auto /// public int currentFanSwingMode = 0; /// /// 支持的控制模式 /// public List acModes = new List { }; /// /// 支持的风速模式 /// public List fanModes = new List { }; /// /// 自定义空调支持的模式(默认全关) /// 数组索引 -> 0:制冷 1:制热 2:送风 3:除湿 4:自动 /// 值 -> 1:代表使用 0:代表不使用 /// public int[] listSupportMode = new int[5] { 0, 0, 0, 0, 0 }; /// /// 过滤网清洗状态 /// public bool CleanStatu = false; /// /// 获取当前室内温度. /// AttriButeId=0 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadLocalTemperature() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.LocalTemperature); } /// /// 获取当前制冷度数. /// AttriButeId=17 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadCoolingSetpoint() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.CoolingSetpoint); } /// /// 获取当前加热度数. /// AttriButeId=18 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadHeatingSetpoint() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.HeatingSetpoint); } /// /// 获取当前自动度数. /// AttriButeId=18 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadAutoSetpoint() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.AutoSetpoint); } /// /// 获取恒温设备类型(******测试设备返回的AttriBute属性是空) /// AttriButeId=27 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadControlSequenceOfOperation() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.ControlSequenceOfOperation); } /// /// 获取恒温设备当前工作模式 /// AttriButeId=28 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadSystemMode() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.SystemMode); } /// /// 获取风扇模式。 /// AttriButeId=0 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadFanMode() { ReadAttri(Device.Cluster_ID.FanControl, AttriButeId.FanMode); } /// /// 获取风扇拥有的工作模式种类. /// AttriButeId=1 (先调用发现属性接口,查看设备是否支持该接口的属性) /// public void ReadFanModeSequence() { ReadAttri(Device.Cluster_ID.FanControl, AttriButeId.FanModeSequence); } /// /// 获取空调自定义设置的支持模式 /// public void ReadModeSupport() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.AcModeSupport); } /// /// 过滤网清洗状态 /// public void ReadCleanStatu() { ReadAttri(Device.Cluster_ID.Thermostat, AttriButeId.CleanStatu); } /// /// 扫风模式 /// public enum FanSwingMode { /// /// 一档 /// First = 0, /// /// 二挡 /// Second = 1, /// /// 三挡 /// Thrid = 2, /// /// 四挡 /// Fourth = 3, /// /// 五档 /// Fifth = 4, /// /// 自动 /// Auto = 7 } /// /// 获取扫风模式 /// public void ReadSystemFansSwingMode() { ReadAttri(Device.Cluster_ID.FanSwing, AttriButeId.FanSwing); } /// /// 设置扫风模式 /// /// /// public async System.Threading.Tasks.Task SetFanSwingAsyncMode(FanSwingMode fanSwing) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 514 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 4096 }, { "AttributeDataType", 48 }, { "AttributeData", (int)fanSwing } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///设置制冷度数. /// public async System.Threading.Tasks.Task SetCoolingTemperatureAsync(int temperature) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 513 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 17 }, { "AttributeDataType", 41 }, { "AttributeData", (int)temperature } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///设置制热度数. /// public async System.Threading.Tasks.Task SetHeatingTemperatureAsync(int temperature) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 513 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 18 }, { "AttributeDataType", 41 }, { "AttributeData", (int)temperature } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///设置自动度数. /// public async System.Threading.Tasks.Task SetAutoTemperatureAsync(int temperature) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 513 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 4096 }, { "AttributeDataType", 41 }, { "AttributeData", (int)temperature } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///设置恒温器设备当前工作模式. /// public async System.Threading.Tasks.Task SetSystemModeAsync(AcMode acMode) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 513 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 28 }, { "AttributeDataType", 48 }, { "AttributeData", (int)acMode } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } public enum AcMode { /// /// 关闭模式(测试恒温面板时发现:2,5,6,7,8,9都是可以打开的) /// Off = 0, /// /// 自动模式 /// Auto = 1, /// /// 制冷模式 /// Cool = 3, /// /// 制热模式 /// Heat = 4, /// /// 紧急制热模式 /// EmergencyHeating = 5, /// /// 预冷模式 /// Precooling = 6, /// /// 只有风速模式 /// FanOnly = 7, /// /// 干燥模式 /// Dry = 8, /// /// 睡眠模式 /// Sleep = 9 } /// ///设置恒温器设备当前风速. /// public async System.Threading.Tasks.Task SetFanModeAsync(FanMode fanMode) { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { SetWritableValueResponAllData d = null; Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "SetWritableValue_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 514 }, { "Command", 120 } }; var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0 }, { "AttributeDataType", 48 }, { "AttributeData", (int)fanMode } }; jObject.Add("Data", data); Gateway.Send("SetWritableValue", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } public enum FanMode { /// /// 关闭风速 /// Off = 0, /// /// 低风 /// Low = 1, /// /// 中风 /// Medium = 2, /// /// 高风 /// High = 3, /// /// 打开风速 /// On = 4, /// /// 自动 /// Auto = 5, /// /// 聪明fe /// Smart = 6, } /// ///设置恒温设备加热或制冷度数(没有测试成功) /// mode要调节的模式 0:加热;1:制冷;2:自动调节 ///temperature:要变化的度数,单位:0.1℃ /// public void SetTemperature(int mode, int temperature) { var jObject = new JObject { { "DeviceAddr", DeviceAddr}, { "Epoint", DeviceEpoint}, { "Cluster_ID",513}, { "Command", 0}, { "SendMode", 2 } }; var data = new JObject { { "Mode", mode }, { "Amount", temperature } }; jObject.Add("Data", data); Gateway?.Send("DeviceControl", jObject.ToString()); } /// /// 关闭 /// /// The close. public async System.Threading.Tasks.Task Close() { return await SetSystemModeAsync(AcMode.Off); } /// /// 开启 /// /// The open. /// Ac mode. public async System.Threading.Tasks.Task Open(AcMode acMode = AcMode.Cool) { return await SetSystemModeAsync(acMode); } #region 升级空调第三方模块的接口 #region 读取IRACC模块固件版本(APP -> Zigbee MCU) /// ///读取IRACC模块固件版本 /// reserve:0-ff /// public async System.Threading.Tasks.Task ReadACFirewareVersionAsync(string reserve = "01") { ReadACFirewareVersionResponAllData result = null; if (Gateway == null) { result = new ReadACFirewareVersionResponAllData { errorMessageBase = "当前没有网关" }; return result; } return await System.Threading.Tasks.Task.Run(async () => { Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { result = new ReadACFirewareVersionResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new ReadACFirewareVersionResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "ZbDataPassthrough") { var gatewayTemp = new ZbGateway() { DataID = jobject.Value("Data_ID") }; gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (gatewayTemp.clientDataPassthroughResponseData == null) { result = new ReadACFirewareVersionResponAllData { errorMessageBase = "网关返回的数据为空" }; } else { if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) { var data = gatewayTemp.clientDataPassthroughResponseData.PassData; var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0259") { var tempD = new ReadACFirewareVersionResponData(); tempD.Status = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); if (data.Length == 82) { var firewareString = data.Substring(12); var aa = firewareString.Length; firewareVersion = firewareString; var bytes = new byte[firewareString.Length / 2]; for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(firewareString.Substring(i * 2, 2), 16); } var firewareVersionTemp = System.Text.Encoding.ASCII.GetString(bytes); tempD.FirewareVersion = firewareVersionTemp.Replace('\0', ' ').Trim(); } result = new ReadACFirewareVersionResponAllData { readACFirewareVersionResponData = tempD }; System.Console.WriteLine($"UI收到通知后的主题_command:0258_{topic}"); } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = ReadACFirewareVersionData(reserve); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (result != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { result = new ReadACFirewareVersionResponAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// /// 读取IRACC模块固件版本 /// string ReadACFirewareVersionData(string reserve) { string data = ""; string dataLength = "05"; string dataComand1 = "58"; string dataComand2 = "02"; string dataSerialNum = "01"; string addDataLength = "01"; string reserveData = reserve; try { data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + reserveData; } catch { }; return data; } /// /// IRACC模块固件版本,网关反馈信息 /// public ReadACFirewareVersionResponAllData readACFirewareVersionResponAllData; /// /// IRACC模块固件版本,网关反馈信息 /// [System.Serializable] public class ReadACFirewareVersionResponAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// IRACC模块固件版本信息 /// public ReadACFirewareVersionResponData readACFirewareVersionResponData; } /// /// IRACC模块固件版本的数据 /// [System.Serializable] public class ReadACFirewareVersionResponData { /// /// 状态 ///0--成功 ///1--失败 ///ff--无效 /// public int Status; /// /// 固件版本 /// public string FirewareVersion; } #endregion #region 升级IRACC模块通知(APP -> Zigbee MCU) /// ///升级IRACC模块通知 /// firewareVer:固件版本 /// firewareSize:固件大小 /// public async System.Threading.Tasks.Task UpggradeACNotificationAsync(string firewareVer, long firewareSize) { ResponseAllData result = null; if (Gateway == null) { result = new ResponseAllData { errorMessageBase = "当前没有网关" }; return result; } return await System.Threading.Tasks.Task.Run(async () => { Action action = (topic, message) => { var gatewayID = topic.Split('/')[0]; var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); if (topic == gatewayID + "/" + "Error_Respon") { var gatewayTemp = new ZbGateway() { Time = jobject.Value("Time"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { result = new ResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "ZbDataPassthrough") { var gatewayTemp = new ZbGateway() { DataID = jobject.Value("Data_ID") }; gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (gatewayTemp.clientDataPassthroughResponseData == null) { result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) { var data = gatewayTemp.clientDataPassthroughResponseData.PassData; var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "025b") { var tempD = new ResponseData(); if (data.Length == 12) { tempD.status = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); } result = new ResponseAllData { responseData = tempD }; System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = UpggradeACNotificationData(firewareVer, firewareSize); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (result != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { result = new ResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } private string firewareVersion = string.Empty; /// /// 升级IRACC模块通知返回 /// string UpggradeACNotificationData(string firewareVer, long firewareSize) { string data = ""; string dataLength = "2C"; string dataComand1 = "5A"; string dataComand2 = "02"; string dataSerialNum = "01"; string addDataLength = "28"; string deviceUpgradeMethod = "01"; string firewareVersionData = ""; string firewareSizeData = ""; try { //固件版本 var firewareVerBytes = System.Text.Encoding.ASCII.GetBytes(firewareVer); for (int i = 0; i < firewareVerBytes.Length; i++) { var fw = Convert.ToString(firewareVerBytes[i], 16); if (fw.Length == 1) { fw = "0" + fw; } firewareVersionData += fw; } var aa = firewareVersionData.Length; firewareVersionData = firewareVersionData.PadRight(70, '0'); //固件尺寸 var tempFwSize = Convert.ToString(firewareSize, 16); tempFwSize = tempFwSize.PadLeft(8, '0'); for (int i = 6; i >= 0; i = i - 2) { firewareSizeData += tempFwSize.Substring(i, 2); } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + deviceUpgradeMethod + firewareVersionData + firewareSizeData; } catch { }; return data; } /// ///升级IRACC模块通知回复 /// public ResponseAllData keyColorDataResponseAllData; [System.Serializable] public class ResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 升级IRACC模块通知信息 /// public ResponseData responseData; } /// /// 升级IRACC模块通知回复(Zigbee MCU -> APP) /// [System.Serializable] public class ResponseData { /// /// 状态值 /// 0--版本号不一致(可以升级 /// 1--版本号一致(不用升级 /// 2--预留(暂时不用到 /// ff--无效(暂时不用到) /// public int status = -1; } #endregion #region 设备请求APP获取升级数据 (Zigbee MCU -> APP,主动上报) /// ///设备请求APP获取升级数据(Zigbee MCU -> APP,主动上报) /// [System.Serializable] public class DeviceRequestUpgradeResponseData { /// /// 数据偏移量,每个分包偏移量+(1-43) /// public string offset = string.Empty; /// /// 数据长度len /// public int dataLength = -1; } #endregion #region 发升级数据到设备(APP -> Zigbee MCU) /// ///读取IRACC模块固件版本 /// reserve:0-ff /// public async void UpgradeAsync(SendUpgradeData upgradeData) { if (Gateway == null) { return; } Action action = (topic, message) => { }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { string passData = ""; if (upgradeData != null) { passData = SendUpgrade(upgradeData); } var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); } catch { } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); } /// /// 发升级数据到设备 /// string SendUpgrade(SendUpgradeData upgradeData) { string data = ""; string dataLength = ""; string dataComand1 = "5D"; string dataComand2 = "02"; string dataSerialNum = "01"; string addDataLength = ""; string status = ""; string offset = ""; string upgradeDataLength = ""; string dataString = ""; try { var len = 4 + 1 + 4 + 1 + upgradeData.dataLength; dataLength = Convert.ToString(len, 16); if (dataLength.Length == 1) { dataLength = "0" + dataLength; } addDataLength = Convert.ToString(6 + upgradeData.dataLength, 16); if (addDataLength.Length == 1) { addDataLength = "0" + addDataLength; } if (upgradeData.status == 0) { status = "00"; } else if (upgradeData.status == 1) { status = "01"; } else { status = "ff"; } offset = upgradeData.offset; var dl = Convert.ToString(upgradeData.dataLength, 16); if (dl.Length == 1) { upgradeDataLength = "0" + dl; } else { upgradeDataLength = dl; } for (int i = 0; i < upgradeData.databytes.Length; i++) { var dataB = Convert.ToString(upgradeData.databytes[i], 16);
 if (dataB.Length == 1)
 {
 dataB = "0" + dataB;
 }
 dataString += dataB; } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + status + offset + upgradeDataLength + dataString; } catch { }; return data; } /// /// 发送升级数据到设备(APP -> Zigbee MCU) /// [System.Serializable] public class SendUpgradeData { /// /// 0--成功 ///1--失败 ///ff--无效 /// public int status = 0; /// /// 数据偏移量,每个分包偏移量+(1-43) /// public string offset; /// /// 数据长度len /// public int dataLength = -1; /// /// 分包数据 /// public byte[] databytes; } #endregion #region 分包结束(Zigbee MCU -> APP,主动上报) /// /// 设备请求APP获取分包结束命令(Zigbee MCU -> APP) /// [System.Serializable] public class DeviceRequestFinishResponseData { /// /// 0-ff /// public int reserve = -1; } #endregion #region 分包结束(APP -> Zigbee MCU) /// ///读取IRACC模块固件版本 /// status:0--成功;1--失败;ff--无效 . /// public async void SendFinishAsync(int status) { if (Gateway == null) { return; } Action action = (topic, message) => { }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SendFinishDataString(status); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); Gateway.Send(("ClientDataPassthrough"), jObject.ToString()); } catch { } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); } /// /// 发升级数据到设备 /// string SendFinishDataString(int status) { string data = ""; string dataLength = "05"; string dataComand1 = "5F"; string dataComand2 = "02"; string dataSerialNum = "01"; string addDataLength = "01"; string statusString = ""; try { if (status == 0) { statusString = "00"; } else if (status == 1) { statusString = "01"; } else { statusString = "ff"; } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + statusString; } catch { }; return data; } /// /// 分包结束返回(APP -> Zigbee MCU /// //[System.Serializable] public class SendFinishData { /// /// 状态:成功/失败 ///0--成功< ///1--失败< ///ff--无效< /// public int status = -1; } #endregion #endregion } }