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; /// /// 当前Lux值 /// public int PirLux = -1; #region IAS安防信息上报. /// /// IAS安防信息上报 /// 当安防设备属性状态改变时候(例如一氧化碳传感器检测到一氧化碳气体),设备将上报属性状态变化数据。 /// [Newtonsoft.Json.JsonIgnore] 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 = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); if (tempD.command == "0300") { result = new ResponseAllData { responseData = tempD }; DebugPrintLog($"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(0):不使能 /// true(1):使能 /// public bool levelEnable; /// /// 光照度等级 /// 值:0-10 /// public int levelSize = -1; /// ///控制设备使能位 /// false(0):不使能 /// true)1):使能 /// public bool controlDevEnable; /// /// 触发开灯到触发关灯的时间间隔 /// 0-65535 单位秒 /// public int transitionTime; /// /// IAS上报周期 /// 10-0xffff 秒 /// public int iasReportPeriod; /// /// 光照度等级 /// 0:半自动模式 /// 1:自动模式 /// public int mode = 0; /// /// 开灯类型 /// 值:0:调光 ///1:开关 /// public int type = 0; /// /// 调光模式,到达开灯亮度的时间 /// 值:0-10 秒 /// public int dimmerOnTime = 0; /// /// 调光模式,关灯到达0%所需要的时间 /// 值:0-10 秒 /// public int dimmerOffTime = 0; /// /// 调光模式开灯的亮度 /// 0-0xff (预留) /// public int dimmerLevel = 0; } /// /// 配置PIR配置参数 /// 发配置按键指示灯颜色命令时,此时为发送到网关的透传数据 /// string SetPIRSensorData(ConfigureParamates configureParamates) { string data = ""; string dataLength = "10"; string dataComand1 = "00"; string dataComand2 = "03"; string dataSerialNum = "01"; string addDataLength = "0C"; string levelEnable = ""; string levelSize = ""; string controlDevEnable = ""; string transitionTime = ""; string iasReportPeriod = ""; string mode = ""; string type = ""; string dimmerOnTime = ""; string dimmerOffTime = ""; string dimmerLevel = ""; try { if (configureParamates != null) { //levelEnable if (configureParamates.levelEnable) { levelEnable = "01"; } else { levelEnable = "00"; } //光照等级 if (configureParamates.levelSize > 0) { var tempLevelEnable = Convert.ToString(configureParamates.levelSize, 16); levelSize = tempLevelEnable.ToString().PadLeft(2, '0'); } else { levelSize = "00"; } //controlDevEnable if (configureParamates.controlDevEnable) { controlDevEnable = "01"; } else { controlDevEnable = "00"; } //transitionTime,iasReportPeriod for (int j = 0; j < 2; j++) { var tempBytes = new byte[2]; if (j == 0) { for (int i = 0; i < 2; i++) { tempBytes[i] = (byte)(configureParamates.transitionTime >> (i * 8) & 0xff); } } else { for (int i = 0; i < 2; i++) { tempBytes[i] = (byte)(configureParamates.iasReportPeriod >> (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; } if (j == 0) { transitionTime = (time1 + time2).ToUpper(); } else { iasReportPeriod = (time1 + time2).ToUpper(); } } //mode if (configureParamates.mode == 1) { mode = "01"; } else { mode = "00"; } //type if (configureParamates.type == 1) { type = "01"; } else { type = "00"; } //dimmerOnTime if (configureParamates.dimmerOnTime > 0) { var tempDimmerOnTime = Convert.ToString(configureParamates.dimmerOnTime, 16); dimmerOnTime = tempDimmerOnTime.ToString().PadLeft(2, '0'); } else { dimmerOnTime = "00"; } dimmerOnTime = dimmerOnTime.ToUpper(); if (configureParamates.dimmerOffTime > 0) { var tempDimmerOffTime = Convert.ToString(configureParamates.dimmerOffTime, 16); dimmerOffTime = tempDimmerOffTime.ToString().PadLeft(2, '0'); } else { dimmerOffTime = "00"; } dimmerOffTime = dimmerOffTime.ToUpper(); //dimmerLevel string temp = ""; var sbString = new System.Text.StringBuilder(); string temp2 = Convert.ToString(configureParamates.dimmerLevel, 16); switch (temp2.Length) { case 1: temp = "0" + temp2; break; case 2: temp = temp2; break; } sbString.Append(temp.ToUpper()); data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + levelEnable + levelSize + controlDevEnable + transitionTime + iasReportPeriod + mode + type + dimmerOnTime + dimmerOffTime + sbString; } } 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 == 34) { 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, 16); 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); tempD.iasReportPeriod = Convert.ToInt32(data[22].ToString() + data[23].ToString() + data[20].ToString() + data[21].ToString(), 16); tempD.mode = Convert.ToInt32(data[24].ToString() + data[25].ToString(), 16); tempD.type = Convert.ToInt32(data[26].ToString() + data[27].ToString(), 16); tempD.dimmerOnTime = Convert.ToInt32(data[28].ToString() + data[29].ToString(), 16); tempD.dimmerOffTime = Convert.ToInt32(data[30].ToString() + data[31].ToString(), 16); tempD.dimmerLevel = Convert.ToInt32(data[32].ToString() + data[33].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 #region 获取PIR lux值(Lux值) /// ///获取PIR lux值(Lux值) /// reserve:0-ff /// public async System.Threading.Tasks.Task GetPirLuxAbilitySizeAsync(string reserve = "01") { PirLuxAbilitySizeInfo result = null; if (Gateway == null) { result = new PirLuxAbilitySizeInfo { 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 PirLuxAbilitySizeInfo { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new PirLuxAbilitySizeInfo { 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 PirLuxAbilitySizeInfo { 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 == "0306") { var cou = data[10].ToString() + data[11].ToString(); int countTemp = Convert.ToInt32(cou, 16); PirLux = countTemp; result = new PirLuxAbilitySizeInfo { pirLux = countTemp }; System.Console.WriteLine($"UI收到通知后的主题_command:0303_{ topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SendPIRLuxAbilitySizeData(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 PirLuxAbilitySizeInfo { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// ///获取PIR lux值 /// string SendPIRLuxAbilitySizeData(string reserve) { string data = ""; string dataLength = "05"; string dataComand1 = "05"; 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 PirLuxAbilitySizeInfo pirLuxAbilitySizeInfo; [System.Serializable] public class PirLuxAbilitySizeInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 当前Lux值 /// 0-0xff Lux /// public int pirLux = -1; } #endregion } }