using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace ZigBee.Device { [System.Serializable] public class IASZone : BindObj { public IASZone() { this.Type = DeviceType.IASZone; } /// /// 光感等级个数(Lux能力) /// 有几个等级就显示几个刻度 /// public int LightLevelCount = -1; #region IAS安防信息上报. /// /// IAS安防信息上报 /// 当安防设备属性状态改变时候(例如一氧化碳传感器检测到一氧化碳气体),设备将上报属性状态变化数据。 /// public IASInfoData iASInfo; /// /// IAS安防信息上报 /// 当安防设备属性状态改变时候(例如一氧化碳传感器检测到一氧化碳气体),设备将上报属性状态变化数据。 /// [System.Serializable] public class IASInfoData { /// ///设备状态() /// 下面的 Alarm1到BatteryDefect实则是对ZoneStatus二进制格式的解析 /// public int ZoneStatus; /// ///自定义设备状态 /// public int ExtendedStatus; /// ///区域ID /// public int ZoneId; /// ///在设备状态改变之后延时Delay(单位:1/4秒) /// public int Delay; /// /// hdl ///1 - opened or alarmed ///0 - closed or not alarmed /// public int Alarm1; /// ///1 - opened or alarmed ///0 - closed or not alarmed /// public int Alarm2; /// ///1 - Tampered ///0 - Not tampered /// public int Tamper; /// ///1 - Low battery ///0 - Battery OK /// public int Battery; /// ///1 - Reports ///0 - Does not report /// public int SupervisionReports; /// ///1 - Reports restore ///0 - Does not report restore /// public int RestoreReports; /// ///1 - Trouble/Failure ///0 - OK /// public int Trouble; /// ///1 - AC/Mains fault ///0 - AC/Mains OK /// public int MaAC_Mainsins; /// ///1 - Sensor is in test mode ///0 - Sensor is operation mode /// public int Test; /// ///1 - Sensor detects a defective battery ///0 - Sensor battery is functioning normally /// public int BatteryDefect; } #endregion #region 获取PIR光感等级(光照能力值). /// ///获取PIR光感等级(光照能力值) /// reserve:0-ff /// public async System.Threading.Tasks.Task GetPIRLightAbilitySizeAsync(string reserve = "01") { PirLightAbilitySizeInfo result = null; if (Gateway == null) { result = new PirLightAbilitySizeInfo { 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 PirLightAbilitySizeInfo { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new PirLightAbilitySizeInfo { 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 PirLightAbilitySizeInfo { errorMessageBase = "网关返回的数据为空" }; } else { if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) { var data = gatewayTemp.clientDataPassthroughResponseData.PassData; if (data.Length == 12) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0304") { var cou = data[10].ToString() + data[11].ToString(); int countTemp = Convert.ToInt32(cou, 16); LightLevelCount = countTemp; result = new PirLightAbilitySizeInfo { LightLevelCount = countTemp }; System.Console.WriteLine($"UI收到通知后的主题_command:0303_{ topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SendPIRLightAbilitySizeData(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 < 9000)//WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (result != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { result = new PirLightAbilitySizeInfo { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// /// 发送PIR光感等级(光照能力值)数据 /// 发配置按键指示灯颜色命令时,此时为发送到网关的透传数据 /// string SendPIRLightAbilitySizeData(string reserve) { string data = ""; string dataLength = "05"; string dataComand1 = "03"; string dataComand2 = "03"; string dataSerialNum = "01"; string addDataLength = "01"; string reserveData = reserve; try { data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + reserveData; } catch { }; return data; } /// /// PIR配置参数回复 /// public PirLightAbilitySizeInfo lightLevelSizeInfo; [System.Serializable] public class PirLightAbilitySizeInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 光感等级个数(Lux能力) /// 有几个等级就显示几个刻度 /// public int LightLevelCount = -1; } #endregion #region PIR传感器参数配置 /// ///PIR传感器参数配置 /// public async System.Threading.Tasks.Task SetPIRSensorParamateAsync(ConfigureParamates configureParamates) { 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; if (data.Length == 16) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0002") { var tempD = new ResponseData(); tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); result = new ResponseAllData { responseData = tempD }; System.Console.WriteLine($"UI收到通知后的主题_command:0300_{ topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SetPIRSensorData(configureParamates); 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 < 9000)//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; }); } /// /// PIR配置参数回复 /// public ParamatesInfo paramatesInfo; [System.Serializable] public class ParamatesInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// PIR配置参数 /// public ConfigureParamates configureParamates; } /// /// PIR配置参数 /// public ConfigureParamates configureParamates; /// /// PIR配置参数 /// [System.Serializable] public class ConfigureParamates { /// ///亮度(光照度)使能 /// false:不使能 /// true:使能 /// public bool levelEnable; /// /// 光照度等级 /// 值:0-10 /// public int levelSize = -1; /// ///控制设备使能位 /// false:不使能 /// true:使能 /// public bool controlDevEnable; /// /// 触发开灯到触发关灯的时间间隔 /// 0-65535 单位秒 /// public int transitionTime; } /// /// 配置PIR配置参数 /// 发配置按键指示灯颜色命令时,此时为发送到网关的透传数据 /// string SetPIRSensorData(ConfigureParamates configureParamates) { string data = ""; string dataLength = "09"; string dataComand1 = "00"; string dataComand2 = "03"; string dataSerialNum = "01"; string addDataLength = "05"; string levelEnable = ""; string levelSize = ""; string controlDevEnable = ""; string transitionTime = ""; try { if (configureParamates != null) { if (configureParamates.levelEnable) { levelEnable = "01"; } else { levelEnable = "00"; } //光照等级 if (configureParamates.levelSize > 0) { levelSize = configureParamates.levelSize.ToString().PadLeft(2, '0'); } else { levelSize = "00"; } if (configureParamates.controlDevEnable) { controlDevEnable = "01"; } else { controlDevEnable = "00"; } var tempBytes = new byte[2]; for (int i = 0; i < 2; i++) { tempBytes[i] = (byte)(configureParamates.transitionTime >> (i * 8) & 0xff); } var time1 = Convert.ToString(tempBytes[0], 16); var time2 = Convert.ToString(tempBytes[1], 16); if (time1.Length == 1) { time1 = "0" + time1; } if (time2.Length == 1) { time2 = "0" + time2; } transitionTime = (time1 + time2).ToUpper(); } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + levelEnable + levelSize + controlDevEnable + transitionTime; } catch { }; return data; } #endregion #region 获取PIR配置数据 /// ///PIR传感器参数配置 /// reserve:0-ff /// public async System.Threading.Tasks.Task GetPIRSensorParamateAsync(string reserve = "01") { ParamatesInfo result = null; if (Gateway == null) { result = new ParamatesInfo { 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 ParamatesInfo { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new ParamatesInfo { 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 ParamatesInfo { errorMessageBase = "网关返回的数据为空" }; } else { if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null) { var data = gatewayTemp.clientDataPassthroughResponseData.PassData; if (data.Length == 20) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0302") { var le = data[10].ToString() + data[11].ToString(); var tempD = new ConfigureParamates(); if (le == "01") { tempD.levelEnable = true; } else { tempD.levelEnable = false; } var size = data[12].ToString() + data[13].ToString(); tempD.levelSize = Convert.ToInt32(size); var cdl = data[14].ToString() + data[15].ToString(); if (cdl == "01") { tempD.controlDevEnable = true; } else { tempD.controlDevEnable = false; } tempD.transitionTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16); configureParamates = tempD; result = new ParamatesInfo { configureParamates = tempD }; System.Console.WriteLine($"UI收到通知后的主题_command:0301_{ topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = GetPIRSensorData(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 < 9000)//WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(10); if (result != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { result = new ParamatesInfo { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// ///PIR光照能力值 /// 发配置按键指示灯颜色命令时,此时为发送到网关的透传数据 /// string GetPIRSensorData(string reserve) { string data = ""; string dataLength = "05"; string dataComand1 = "01"; string dataComand2 = "03"; string dataSerialNum = "01"; string addDataLength = "01"; string reserveData = reserve; try { data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + reserveData; } catch { }; return data; } #endregion } }