using System; using System.Collections.Generic; using System.Threading.Tasks; using MQTTnet; using Newtonsoft.Json.Linq; using Shared.Common; namespace ZigBee.Device { [System.Serializable] public class Panel : BindObj { public Panel() { this.Type = DeviceType.OnOffSwitch; } /// /// 按键模式(私有功能) /// public int panelMode = 65535; /// ///当前选择的简约多功能面板的类型【简约多功能面板】 /// 0:场景 1:开关 2:插座 3:灯光 4:遮阳 5:空调 6:新风 /// [Newtonsoft.Json.JsonIgnore] public int currentMutilfunctionBindType = 0; /// /// 当前选择模式 /// [Newtonsoft.Json.JsonIgnore] public string currentKeySelectModeText = ""; /// /// 当前选择的楼层ID /// [Newtonsoft.Json.JsonIgnore] public string currentSelectFloorId = string.Empty; /// /// 当前选择的房间ID【新风面板】 /// [Newtonsoft.Json.JsonIgnore] public string currentSelectRoomId = string.Empty; /// /// 绑定的楼层房间信息 /// [System.Serializable] public class FloorRoomBindObj { /// /// 楼层ID /// public string floodID; /// /// 楼层名称 /// public string floodName; /// /// 房间ID /// public string roomID; /// /// 房间名称 /// public string roomName; /// /// 绑定目标ID /// public string BindID; /// /// 绑定目标名称 /// public string BindName; /// /// 图片路径 /// public string IconPath = ""; } // /// 按键中被绑定的目标列表 /// [Newtonsoft.Json.JsonIgnore] public List bindList = new List(); /// /// 私有功能类 /// 256:Key,按键类类 /// 768:PIR,PIR类 /// 1024:Light,灯类 /// public List privateFuncFirstLevelList = new List(); /// /// 第二级信息 /// 1:特殊功能 /// 100:Switch,开关(按键类) /// 200:Dimmer,调光(按键类) /// 300:Curtain,窗帘(按键类) /// 0:EnergySavingMode,节能模式(灯类) /// 1:SleepMode,睡眠模式(灯类) /// 100:WhiteBalance,白平衡(灯类) /// 101:RGBColor,RGB指示灯颜色(灯类) /// 102:RGBLevel,RGB指示灯亮度(灯类) /// public List privateFuncSecondLevelList = new List(); /// /// 第三级信息 /// 1:场景触发(特殊功能) /// 65535:禁止发送功能(特殊功能) /// 100:SwitchOpen,开关开(按键类) /// 101:SwitchClose,开关关(按键类) /// 102:SwitchChange,开关切换(按键类) /// 200:DimmerStepUp,增大调光(按键类) /// 201:DimmerStepDown,降低调光(按键类) /// 202:DimmerStepChange,调光切换(按键类) /// 300:CurtainOpen,窗帘开(按键类) /// 301:CurtainClose,窗帘关(按键类) /// 302:CurtainStop,窗帘停 /// 303:CurtainUpStop,窗帘上升停 /// 304:CurtainDownstop,窗帘下降停 /// public List privateFuncThirdLevelList = new List(); #region 获取面板的私有信息. /// ///获取面板的私有信息 /// 注意params传入参数如下: /// 方法1:当int[]传空,返回值是“面板具有的功能大类,即返回“第一级别。1024:灯类,256:按键类,768:PIR类 /// 方法2:、当int[]值为第一级别PrivateFuncTypeFir中选择一个。 /// 返回值是“面按键发送功能类”,即返回“第二级别。 /// 1:特殊功能;100:Switch,开关(按键类);200:Dimmer,调光(按键类);300:Curtain,窗帘(按键类) /// 0:EnergySavingMode,节能模式(灯类);1:SleepMode,睡眠模式(灯类);100:WhiteBalance,白平衡(灯类);101:RGBColor,RGB指示灯颜色(灯类);102:RGBLevel,RGB指示灯亮度(灯类) /// 方法3:当int[]值为第一级别PrivateFuncTypeFir中选择一个,接着再选第二级别PrivateFunTypeSec中选择一个 /// 返回值是“面按键具体功能配置”,即返回“第二级别。 /// 1:场景触发;65535:禁止发送功能 /// 100:SwitchOpen,开关开(按键类);101:SwitchClose,开关关(按键类);102:SwitchChange,开关切换(按键类) /// 200:DimmerStepUp,增大调光(按键类);201:DimmerStepDown,降低调光(按键类);202:DimmerStepChange,调光切换(按键类) /// 300:CurtainOpen,窗帘开(按键类);301:CurtainClose,窗帘关(按键类);302:CurtainStop,窗帘停;303:CurtainUpStop,窗帘上升停;304:CurtainDownstop,窗帘下降停 /// public async System.Threading.Tasks.Task GetPanelPrivateFunctionsAsync(params int[] args) { PanelPrivateFunctionsResponseAllInfo result = null; if (Gateway == null) { result = new PanelPrivateFunctionsResponseAllInfo { 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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { result = new PanelPrivateFunctionsResponseAllInfo { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new PanelPrivateFunctionsResponseAllInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "ZbDataPassthrough") { var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (clientDataPassthroughResponseData == null) { result = new PanelPrivateFunctionsResponseAllInfo { errorMessageBase = "网关返回的数据为空" }; } else { if (clientDataPassthroughResponseData?.PassData != null) { var data = clientDataPassthroughResponseData.PassData; if (data.Length > 12) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0004") { var tempD = new PanelPrivateFunctionsResponseInfo(); int len = 2 + 2 * Convert.ToInt32(data[0].ToString() + data[1].ToString(), 16); int usefulLength = (len - 12); tempD.funLevel = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); int tempCount = 0; var listData = new List(); switch (tempD.funLevel) { case 1: while (tempCount < usefulLength) { listData.Add(data[12 + tempCount].ToString()); tempCount++; } for (int j = 0; j < listData.Count / 4; j++) { int curIndex = 4 * j; tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncFirstLevelList.Contains(256) == false) //{ // privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //} } break; case 2: while (tempCount < usefulLength) { listData.Add(data[12 + tempCount].ToString()); tempCount++; } for (int j = 0; j < listData.Count / 4; j++) { int curIndex = 4 * j; if (j == 0) { tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncFirstLevelList.Contains(256) == false) //{ // privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //} } else { tempD.privateFuncTypeLevelSecondList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncSecondLevelList.Contains(1) == false || privateFuncSecondLevelList.Contains(100) == false || privateFuncSecondLevelList.Contains(200) == false || privateFuncSecondLevelList.Contains(300) == false) //{ // privateFuncSecondLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //} } } break; case 3: while (tempCount < usefulLength) { listData.Add(data[12 + tempCount].ToString()); tempCount++; } for (int j = 0; j < listData.Count / 4; j++) { int curIndex = 4 * j; if (j == 0) { tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncFirstLevelList.Contains(256) == false) //{ // privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //} } else if (j == 1) { tempD.privateFuncTypeLevelSecondList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncSecondLevelList.Contains(1) == false || privateFuncSecondLevelList.Contains(100) == false || privateFuncSecondLevelList.Contains(200) == false || privateFuncSecondLevelList.Contains(300) == false) //{ // privateFuncSecondLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //} } else { tempD.privateFuncTypeLevelThirdList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); //if (privateFuncThirdLevelList.Contains(1) == false || privateFuncThirdLevelList.Contains(65535) == false || privateFuncThirdLevelList.Contains(100) == false || privateFuncThirdLevelList.Contains(101) == false || privateFuncThirdLevelList.Contains(102) == false || privateFuncThirdLevelList.Contains(200) == false || privateFuncThirdLevelList.Contains(201) == false || privateFuncThirdLevelList.Contains(202) == false || privateFuncThirdLevelList.Contains(300) == false || privateFuncThirdLevelList.Contains(301) == false || privateFuncThirdLevelList.Contains(302) == false || privateFuncThirdLevelList.Contains(303) == false || privateFuncThirdLevelList.Contains(304) == false) //{ // privateFuncThirdLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); ; //} } } break; } result = new PanelPrivateFunctionsResponseAllInfo { panelPrivateFunctionsResponseInfo = tempD }; System.Console.WriteLine($"UI收到通知后的主题_command:0003_{topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SendPanelPrivateFunctions(args); 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 PanelPrivateFunctionsResponseAllInfo { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// /// PIR配置参数回复 /// [System.Serializable] public class PanelPrivateFunctionsResponseAllInfo:ErrorResponCommon { /// /// 光感等级个数(Lux能力) /// 有几个等级就显示几个刻度 /// public PanelPrivateFunctionsResponseInfo panelPrivateFunctionsResponseInfo; } /// /// 配置参数回复 /// [System.Serializable] public class PanelPrivateFunctionsResponseInfo { /// /// 功能类级别梯度 /// 1:第一级别 /// 2:第二级别 /// 3:第三级别 /// public int funLevel = -1; /// /// 私有功能类 /// 256:Key,按键类类 /// 768:PIR,PIR类 /// 1024:Light,灯类 /// public List privateFuncTypeLevelFirstList = new List(); /// /// 第二级信息 /// 1:特殊功能 /// 100:Switch,开关(按键类) /// 200:Dimmer,调光(按键类) /// 300:Curtain,窗帘(按键类) /// 0:EnergySavingMode,节能模式(灯类) /// 1:SleepMode,睡眠模式(灯类) /// 100:WhiteBalance,白平衡(灯类) /// 101:RGBColor,RGB指示灯颜色(灯类) /// 102:RGBLevel,RGB指示灯亮度(灯类) /// public List privateFuncTypeLevelSecondList = new List(); /// /// 第三级信息 /// 1:场景触发(特殊功能) /// 65535:禁止发送功能(特殊功能) /// 100:SwitchOpen,开关开(按键类) /// 101:SwitchClose,开关关(按键类) /// 102:SwitchChange,开关切换(按键类) /// 200:DimmerStepUp,增大调光(按键类) /// 201:DimmerStepDown,降低调光(按键类) /// 202:DimmerStepChange,调光切换(按键类) /// 300:CurtainOpen,窗帘开(按键类) /// 301:CurtainClose,窗帘关(按键类) /// 302:CurtainStop,窗帘停 /// 303:CurtainUpStop,窗帘上升停 /// 304:CurtainDownstop,窗帘下降停 /// public List privateFuncTypeLevelThirdList = new List(); } /// ///读取面板的私有信息 /// 注意params取值如下: /// 1、当int[]传空,返回值是“面板具有的功能大类”:1024:灯类,256:按键类,768:PIR类 /// 2、当int[]值为第一级别PrivateFuncTypeFir中选择一个。返回值是“面按键发送功能类” /// 3、当int[]值为第一级别PrivateFuncTypeFir中选择一个,接着再选第二级别PrivateFunTypeSec中选择一个,返回值是“面按键具体功能配置” /// string SendPanelPrivateFunctions(params int[] args) { string data = ""; string dataLength = ""; string dataComand1 = "03"; string dataComand2 = "00"; string dataSerialNum = "01"; string addDataLength = ""; string value0 = ""; string value1 = ""; string value2 = ""; try { if (args.Length != 0) { if (Convert.ToString(2 * args.Length + 5, 16).Length == 1) { dataLength = string.Concat(0, 2 * args.Length + 5); } else { dataLength = Convert.ToString(2 * args.Length + 5, 16); } if (Convert.ToString(2 * args.Length, 16).Length == 1) { addDataLength = string.Concat(0, 2 * args.Length + 1); } else { addDataLength = Convert.ToString(2 * args.Length + 1, 16); } for (int i = 0; i < args.Length; i++) { switch (args.Length) { case 1: value0 = "02"; switch (args[0]) { case 1024: value1 = "0004"; break; case 256: value1 = "0001"; break; case 768: value1 = "0003"; break; } break; case 2: value0 = "03"; switch (args[0]) { case 1024: value1 = "0004"; switch (args[1]) { case 0: value2 = "0000"; break; case 1: value2 = "0100"; break; case 100: value2 = "6400"; break; case 101: value2 = "6500"; break; case 102: value2 = "6600"; break; } break; case 256: value1 = "0001"; switch (args[1]) { case 1: value2 = "0100"; break; case 100: value2 = "6400"; break; case 200: value2 = "C800"; break; case 300: value2 = "2C01"; break; } break; case 768: value1 = "0003"; break; } break; } } } else { dataLength = "05"; addDataLength = "01"; value0 = "01"; } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + value0 + value1 + value2; } catch { }; return data; } /// /// 私有功能类(第一级别)信息 /// public class PrivateFuncTypeFir { /// /// 私有功能类 /// 256:Key,按键类类 /// 768:PIR,PIR类 /// 1024:Light,灯类 /// public int privateFuncTypeOne; } /// /// 私有功能类(第二级别)信息 /// public class PrivateFunTypeSec { /// /// 第二级信息 /// 100:Switch,开关(按键类) /// 200:Dimmer,调光(按键类) /// 300:Curtain,窗帘(按键类) /// 0:EnergySavingMode,节能模式(灯类) /// 1:SleepMode,睡眠模式(灯类) /// 100:WhiteBalance,白平衡(灯类) /// 101:RGBColor,RGB指示灯颜色(灯类) /// 102:RGBLevel,RGB指示灯亮度(灯类) /// public int privateFuncTypeTwo; } /// /// 私有功能类(第三级别)信息 /// public class PrivateFunTypeThird { /// /// 第三级信息 /// 0:EnergySavingModeOpenLevel,节能模式开亮度(灯类 ) /// 1:EnergySavingModeCloseLevel,节能模式关亮度(灯类) /// 1:场景触发;(特殊功能) /// 65535:禁止发送功能(特殊功能) /// 100:SwitchOpen,开关开(按键类) /// 101:SwitchClose,开关关(按键类) /// 102:SwitchChange,开关切换(按键类) /// 200:DimmerStepUp,增大调光(按键类) /// 201:DimmerStepDown,降低调光(按键类) /// 202:DimmerStepChange,调光切换(按键类) /// 300:CurtainOpen,窗帘开(按键类) /// 301:CurtainClose,窗帘关(按键类) /// 302:CurtainStop,窗帘停 /// 303:CurtainUpStop,窗帘上升停 /// 304:CurtainDownstop,窗帘下降停 /// public int privateFuncTypeThird; } /// /// 获取按键面板的第一级别功能功能系(1024:灯类,256:按键类,768:PIR类) /// /// 按键面板的某一个回路 /// public async Task> GetPanelDeviceFunctionLevel1() { var result = await GetPanelPrivateFunctionsAsync(); if (result == null || result.panelPrivateFunctionsResponseInfo == null) { return null; } return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelFirstList; } /// /// 获取按键面板的第二级别功能功能系(以下为返回值) /// 100:Switch,开关(按键类) /// 200:Dimmer,调光(按键类) /// 300:Curtain,窗帘(按键类) /// 0:EnergySavingMode,节能模式(灯类) /// 1:SleepMode,睡眠模式(灯类) /// 100:WhiteBalance,白平衡(灯类) /// 101:RGBColor,RGB指示灯颜色(灯类) /// 102:RGBLevel,RGB指示灯亮度(灯类) /// /// 按键面板的某一个回路 /// 第一级别的ID(1024:灯类,256:按键类,768:PIR类) /// public async Task> GetPanelDeviceFunctionLevel2(int level1) { var result = await GetPanelPrivateFunctionsAsync(new int[] { level1 }); if (result == null || result.panelPrivateFunctionsResponseInfo == null) { return null; } return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelSecondList; } /// /// 按键类第三级别如下: /// 1:场景触发;(特殊功能) /// 65535:禁止发送功能(特殊功能) /// 100:SwitchOpen,开关开(按键类) /// 101:SwitchClose,开关关(按键类) /// 102:SwitchChange,开关切换(按键类) /// 200:DimmerStepUp,增大调光(按键类) /// 201:DimmerStepDown,降低调光(按键类) /// 202:DimmerStepChange,调光切换(按键类) /// 300:CurtainOpen,窗帘开(按键类) /// 301:CurtainClose,窗帘关(按键类) /// 302:CurtainStop,窗帘停 /// 303:CurtainUpStop,窗帘上升停 /// 304:CurtainDownstop,窗帘下降停 /// /// 按键面板的某一个回路 /// 第一级别的ID(1024:灯类,256:按键类,768:PIR类) /// 第二级别的ID(当第一级别是按键类,1:特殊功能,100:按键开关,200:按键调光;300:按键窗帘) /// public async Task> GetPanelDeviceFunctionLevel3(int level1, int level2) { var result = await GetPanelPrivateFunctionsAsync(new int[] { level1, level2 }); if (result == null || result.panelPrivateFunctionsResponseInfo == null) { return null; } return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelThirdList; } #endregion #region 控制按键指示灯. /// ///控制按键指示灯 /// public async System.Threading.Tasks.Task ControlKeyAsync(KeyNumStatus keyNum, KeyStatus keyStatus) { 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 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 clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (clientDataPassthroughResponseData == null) { result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { if (clientDataPassthroughResponseData?.PassData != null) { var data = 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 == "0400") { result = new ResponseAllData { responseData = tempD }; System.Console.WriteLine($"UI收到通知后的主题_command:0400_{ topic}"); } } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = ControlKeyData(keyNum, keyStatus); 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; }); } /// /// 按键指示灯状态 /// public enum KeyStatus { /// /// 关 /// close = 0x00, /// /// 开 /// open = 0x64, /// /// 无效 /// inValid = 0xff, } /// /// 控制按键指示灯 /// string ControlKeyData(KeyNumStatus keyNumStatus, KeyStatus keyStatus) { string data = ""; string dataLength = "07"; string dataComand1 = "00"; string dataComand2 = "04"; string dataSerialNum = "01"; string addDataLength = "03"; string kStatus = ""; int attributeData = 0; try { for (int i = 1; i <= 16; i++) { Type type = keyNumStatus.GetType(); var obj = type.InvokeMember("Key" + i, System.Reflection.BindingFlags.GetField, null, keyNumStatus, null); int value0 = 0; if (Convert.ToBoolean(obj) == true) { value0 = 1; } int v = (int)Math.Pow(2, i - 1); attributeData += value0 * v; } string td = attributeData.ToString("X4"); char[] td1 = td.ToCharArray(); string tempAttributeData = string.Concat(td1[2].ToString(), td1[3].ToString(), td1[0].ToString(), td1[1].ToString()); switch (keyStatus) { case KeyStatus.close: kStatus = "00"; break; case KeyStatus.open: kStatus = "64"; break; case KeyStatus.inValid: kStatus = "ff"; break; } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + tempAttributeData + kStatus; } catch { }; return data; } #endregion #region 配置按键指示灯颜色. /// /// 绑定设备信息,网关反馈信息 /// [System.Serializable] public class KeyColorDataResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 按键指示灯颜色信息 /// public KeyColorData keyColorData; } // /// 按键指示灯颜色信息 /// [System.Serializable] public class KeyColorData { /// /// 指示灯对应顺序号 /// public KeyNum keyNum; /// /// 开状态颜色R(0-ff) /// public string OpenColorR; /// /// 开状态颜色G(0-ff) /// public string OpenColorG; /// /// 开状态颜色B(0-ff) /// public string OpenColorB; /// /// 关状态颜色R(0-ff) /// public string CloseColorR; /// /// 关状态颜色G(0-ff) /// public string CloseColorG; /// /// 关状态颜色B(0-ff) /// public string CloseColorB; } /// /// 按键指示灯颜色信息对应顺序号 /// public class KeyNumStatus { /// /// false:关 /// true:开 /// public bool Key1; /// /// false:关 /// true:开 /// public bool Key2; /// /// false:关 /// true:开 /// public bool Key3; /// /// false:关 /// true:开 /// public bool Key4; /// /// false:关 /// true:开 /// public bool Key5; /// /// false:关 /// true:开 /// public bool Key6; /// /// false:关 /// true:开 /// public bool Key7; /// /// false:关 /// true:开 /// public bool Key8; /// /// false:关 /// true:开 /// public bool Key9; /// /// false:关 /// true:开 /// public bool Key10; /// /// false:关 /// true:开 /// public bool Key11; /// /// false:关 /// true:开 /// public bool Key12; /// /// false:关 /// true:开 /// public bool Key13; /// /// false:关 /// true:开 /// public bool Key14; /// /// false:关 /// true:开 /// public bool Key15; /// /// false:关 /// true:开 /// public bool Key16; } #endregion #region 配置接近传感 /// /// 配置接近传感 /// sensorEnable:传感器使能 /// public async System.Threading.Tasks.Task SetProximitySensor(bool sensorEnable) { 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 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 clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (clientDataPassthroughResponseData == null) { result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { if (clientDataPassthroughResponseData?.PassData != null) { var data = 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 == "0500") { result = new ResponseAllData { responseData = tempD }; DebugPrintLog($"UI收到通知后的主题_command:0500_{ topic}"); } } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SetProximitySensorData(sensorEnable); 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; }); } /// /// 配置接近传感 /// [该条协议另外2个参数UI和设备都不需要,设备都同事要求传感器距离和传感器触发延迟时间都默认是FFFF] /// /// 传感器使能 0-disable 1-enable /// string SetProximitySensorData(bool sensorEnable) { string data = ""; string dataLength = "09"; string dataComand1 = "00"; string dataComand2 = "05"; string dataSerialNum = "01"; string addDataLength = "05"; string sEnable = ""; try { if (sensorEnable) { sEnable = "01"; } else { sEnable = "00"; } data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + sEnable + "FFFFFFFF"; } catch { }; return data; } #endregion #region 获取按键指示灯开关颜色. /// /// 按键指示灯颜色信息对应顺序号(睡眠组号) /// public enum KeyNum { Key1 = 1, Key2 = 2, Key3 = 3, Key4 = 4, Key5 = 5, Key6 = 6, Key7 = 7, Key8 = 8, Key9 = 9, Key10 = 10, Key11 = 11, Key12 = 12, Key13 = 13, Key14 = 14, Key15 = 15, Key16 = 16, } #endregion #region 获取按键指示灯面板开关亮度配置. /// /// 按键指示灯面板开关亮度配置回复 /// [System.Serializable] public class PanelSwitchLevelInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// ///按键开状态(指示)亮度(这个是点击后的值) /// public int panelDirectionsLevel = -1; /// /// 按键关状态(背光)亮度(这个是点击前的值) /// public int panelBacklightLevel = -1; } #endregion #region 获取按键节能模式配置状态. /// /// 获取按键节能模式配置状态数据回复 /// [System.Serializable] public class PanelSwitchLevelResponInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 网关信息错误反馈 /// 获取按键节能模式配置状态数据 /// public PanelSaveEnergyModeInfo panelSaveEnergyModeInfo; } /// /// 获取按键节能模式配置状态数据 /// [System.Serializable] public class PanelSaveEnergyModeInfo { /// ///false-disable true-enable /// public bool enable; /// ///无操作进入节能模式时间(0-255 单位秒) /// public int time = -1; /// /// 节能模式亮度(0-100) /// public int level = -1; } #endregion #region 获取接近传感配置 /// ///获取接近传感配置 /// public async System.Threading.Tasks.Task GetProximitySensorAsync(string reserve = "01") { PanelProximitySensorResponInfo result = null; if (Gateway == null) { result = new PanelProximitySensorResponInfo { 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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { result = new PanelProximitySensorResponInfo { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new PanelProximitySensorResponInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "ZbDataPassthrough") { var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (clientDataPassthroughResponseData == null) { result = new PanelProximitySensorResponInfo { errorMessageBase = "网关返回的数据为空" }; } else { if (clientDataPassthroughResponseData?.PassData != null) { var data = clientDataPassthroughResponseData.PassData; if (data.Length == 20) { var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); if (command == "0502") { var tempR = new PanelProximitySensorInfo(); if (data[10].ToString() + data[11].ToString() == "01") { tempR.enable = true; } else { tempR.enable = false; } tempR.sensorDistance = Convert.ToInt32(data[14].ToString() + data[15].ToString() + data[12].ToString() + data[13].ToString(), 16); tempR.sensorDelayTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16); result = new PanelProximitySensorResponInfo { panelProximitySensorInfo = tempR }; System.Console.WriteLine($"UI收到通知后的主题_command:0408_{ topic}"); } } } } } }; Gateway.Actions += action; System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); try { var passData = SendProiximitySensorData(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 > 9000)// WaitReceiveDataTime) { result = new PanelProximitySensorResponInfo { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); return result; }); } /// /// 获取接近传感配置数据 /// string SendProiximitySensorData(string reserve) { string data = ""; string dataLength = "05"; string dataComand1 = "01"; string dataComand2 = "05"; string dataSerialNum = "01"; string addDataLength = "01"; string reserveData = reserve; try { data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + reserveData; } catch { }; return data; } /// /// 获取接近传感配置数据回复 /// [System.Serializable] public class PanelProximitySensorResponInfo { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 获取接近传感配置数据 /// public PanelProximitySensorInfo panelProximitySensorInfo; } /// /// 获取接近传感配置数据 /// [System.Serializable] public class PanelProximitySensorInfo { /// /// 传感器使能 ///false-disable true-enable /// public bool enable; /// ///传感器距离 /// public int sensorDistance = -1; /// /// 传感器触发延迟时间 /// public int sensorDelayTime = -1; } #endregion #region 配置按键指示灯睡眠组分(暂时不做) /// ///获取按键指示灯睡眠组 ///sleepGroup:睡眠组号 /// //public async System.Threading.Tasks.Task GetPanelSleepGroupAsync(SleepGroup sleepGroup) //{ // PanelSleepGroupResponseAllData result = null; // if (Gateway == null) // { // result = new PanelSleepGroupResponseAllData { 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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); // if (temp == null) // { // result = new PanelSleepGroupResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; // } // else // { // result = new PanelSleepGroupResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; // } // } // if (topic == gatewayID + "/" + "ZbDataPassthrough") // { // var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); // if (clientDataPassthroughResponseData == null) // { // result = new PanelSleepGroupResponseAllData { errorMessageBase = "网关返回的数据为空" }; // } // else // { // if (clientDataPassthroughResponseData?.PassData != null) // { // var data = clientDataPassthroughResponseData.PassData; // if (data.Length == 14) // { // var tempR = new PanelSleepGroupResponseData(); // tempR.status = int.Parse(data[12].ToString() + data[13].ToString()); // switch (data[10].ToString() + data[11].ToString()) // { // case "01": // tempR.sleepGroupNum = SleepGroupNum.Group1; // break; // case "02": // tempR.sleepGroupNum = SleepGroupNum.Group2; // break; // case "03": // tempR.sleepGroupNum = SleepGroupNum.Group3; // break; // case "04": // tempR.sleepGroupNum = SleepGroupNum.Group4; // break; // case "05": // tempR.sleepGroupNum = SleepGroupNum.Group5; // break; // case "06": // tempR.sleepGroupNum = SleepGroupNum.Group6; // break; // case "07": // tempR.sleepGroupNum = SleepGroupNum.Group7; // break; // case "08": // tempR.sleepGroupNum = SleepGroupNum.Group8; // break; // case "09": // tempR.sleepGroupNum = SleepGroupNum.Group9; // break; // case "0a": // tempR.sleepGroupNum = SleepGroupNum.Group10; // break; // case "0b": // tempR.sleepGroupNum = SleepGroupNum.Group11; // break; // case "0c": // tempR.sleepGroupNum = SleepGroupNum.Group12; // break; // case "0d": // tempR.sleepGroupNum = SleepGroupNum.Group13; // break; // case "0e": // tempR.sleepGroupNum = SleepGroupNum.Group14; // break; // case "0f": // tempR.sleepGroupNum = SleepGroupNum.Group15; // break; // } // result = new PanelSleepGroupResponseAllData { panelSleepGroupResponseData = tempR }; // } // } // System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); // } // } // }; // Gateway.Actions += action; // System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString()); // try // { // OpenPassthroughControl(Gateway); // var passData = SetPanelSleepGroupData(sleepGroup); // var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; // var data = new JObject { { "PassData", passData } }; // jObject.Add("Data", data); // CurrentGateWayId = Gateway.getGatewayBaseInfo?.gwID; // 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 PanelSleepGroupResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; // } // Gateway.Actions -= action; // System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); // return result; // }); //} ///// ///// 绑定设备信息,网关反馈信息 ///// //public PanelSleepGroupResponseAllData panelSleepGroupResponseAllData; //[System.Serializable] //public class PanelSleepGroupResponseAllData //{ // /// // /// 错误信息 // /// // public string errorMessageBase; // /// // /// 网关信息错误反馈 // /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 // /// // public ErrorResponData errorResponData; // /// // /// 绑定设备信息 // /// // public PanelSleepGroupResponseData panelSleepGroupResponseData; //} ///// ///// 绑定设备信息,网关反馈信息 ///// //public PanelSleepGroupResponseData panelSleepGroupResponseData; //[System.Serializable] //public class PanelSleepGroupResponseData //{ // /// // /// 睡眠组号 // /// // public SleepGroupNum sleepGroupNum; // /// // /// 状态 // /// 0--执行 1—唤醒 // /// // public int status; //} ///// ///// 配置按键指示灯睡眠组分区 ///// //string SetPanelSleepGroupData(SleepGroup sleepGroup) //{ // string data = ""; // string dataLength = "06"; // string dataComand1 = "0a"; // string dataComand2 = "04"; // string dataSerialNum = "01"; // string addDataLength = "02"; // int attributeData = 0; // try // { // int bit0 = 0, bit1 = 0, bit2 = 0, bit3 = 0, bit4 = 0, bit5 = 0, bit6 = 0, bit7 = 0, bit8 = 0, bit9 = 0, bit10 = 0, bit11 = 0, bit12 = 0, bit13 = 0, bit14 = 0, bit15 = 0; // if (sleepGroup != null) // { // if (sleepGroup.bit0) // { // bit0 = 1; // } // if (sleepGroup.bit1) // { // bit1 = 1; // } // if (sleepGroup.bit2) // { // bit2 = 1; // } // if (sleepGroup.bit3) // { // bit3 = 1; // } // if (sleepGroup.bit4) // { // bit4 = 1; // } // if (sleepGroup.bit5) // { // bit5 = 1; // } // if (sleepGroup.bit6) // { // bit6 = 1; // } // if (sleepGroup.bit7) // { // bit7 = 1; // } // if (sleepGroup.bit8) // { // bit8 = 1; // } // if (sleepGroup.bit9) // { // bit9 = 1; // } // if (sleepGroup.bit10) // { // bit10 = 1; // } // if (sleepGroup.bit11) // { // bit11 = 1; // } // if (sleepGroup.bit12) // { // bit12 = 1; // } // if (sleepGroup.bit13) // { // bit13 = 1; // } // if (sleepGroup.bit14) // { // bit14 = 1; // } // if (sleepGroup.bit15) // { // bit15 = 1; // } // attributeData = bit0 * 1 + bit1 * 2 + bit2 * 4 + bit3 * 8 + bit4 * 16 + bit5 * 32 + bit6 * 64 + bit7 * 128 + bit8 * 256 + bit9 * 512 + bit10 * 1024 + bit11 * 2048 + bit12 * 4096 + bit13 * 8192 + bit14 * 16384 + bit15 * 32768; // } // string tempAttributeData = attributeData.ToString("X4"); // if (sleepGroup != null) // { // data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + // tempAttributeData; // } // } // catch { }; // return data; //} ///// ///// 睡眠组号(可位或) ///// //public class SleepGroup //{ // /// // /// false:关 // /// true:开 // /// // public bool bit0; // /// // /// false:关 // /// true:开 // /// // public bool bit1; // /// // /// false:关 // /// true:开 // /// // public bool bit2; // /// // /// false:关 // /// true:开 // /// // public bool bit3; // /// // /// false:关 // /// true:开 // /// // public bool bit4; // /// // /// false:关 // /// true:开 // /// // public bool bit5; // /// // /// false:关 // /// true:开 // /// // public bool bit6; // /// // /// false:关 // /// true:开 // /// // public bool bit7; // /// // /// false:关 // /// true:开 // /// // public bool bit8; // /// // /// false:关 // /// true:开 // /// // public bool bit9; // /// // /// false:关 // /// true:开 // /// // public bool bit10; // /// // /// false:关 // /// true:开 // /// // public bool bit11; // /// // /// false:关 // /// true:开 // /// // public bool bit12; // /// // /// false:关 // /// true:开 // /// // public bool bit13; // /// // /// false:关 // /// true:开 // /// // public bool bit14; // /// // /// false:关 // /// true:开 // /// // public bool bit15; //} ///// ///// 执行按键指示灯睡眠组 ///// //public enum SleepGroupNum //{ // Group1 = 1, // Group2 = 2, // Group3 = 3, // Group4 = 4, // Group5 = 5, // Group6 = 6, // Group7 = 7, // Group8 = 8, // Group9 = 9, // Group10 = 10, // Group11 = 11, // Group12 = 12, // Group13 = 13, // Group14 = 14, // Group15 = 15, // Group16 = 16, //} #endregion #region 配置面板功能 /// /// 配置面板的功能模式 /// public enum KeyMode { /// /// 开关类型——开. /// Scene_Trigger = 1, /// /// 开关类型——开. /// OnOff_On = 100, /// /// 开关类型——关. /// OnOff_oFF = 101, /// /// 开关类型——取反. /// OnOff_OnOff = 102, /// /// 亮度类型——按等级调大. /// Level_Step_Up = 200, /// /// 亮度类型——按等级调小. /// Level_Step_Down = 201, /// /// 亮度类型——按等级取反. /// Level_Step_Up_Down = 202, /// /// 亮度类型——取反. /// Level_Up = 203, /// /// 亮度类型——取反. /// Level_Down = 204, /// /// 亮度类型——取反. /// Level_Up_Down = 205, /// /// 窗帘类型——开. /// Wcd_Up = 300, /// /// 窗帘类型——关. /// Wcd_Down = 301, /// /// 窗帘类型——停. /// Wcd_Stop = 302, /// /// 窗帘类型——上升停止. /// Wcd_Up_Stop = 303, /// /// 窗帘类型——下降停止. /// Wcd_Down_Stop = 304, /// /// 窗帘类型——下降停止. /// Default = 65535, } #endregion /// ///读取面板的配置信息 /// public void ReadPanelSupportAttribute() { ReadAttri(Device.Cluster_ID.HdlKey, AttriButeId.HdlKey); } #region 读取面板的配置信息 /// /// 网关恢复出厂设置返回数据 /// [System.Serializable] public class PanelConfigureInfoResponAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// ///设备数据 /// public DeviceStatusReportData deviceStatusReportData; } #endregion #region 获取网关中的场景 /// /// 只能获取场景信息,没有场景中的设备信息 /// /// public async System.Threading.Tasks.Task GetSceneInfoAsync() { GetOnlySceneAllData result = null; if (ZbGateway.MainGateWay == null) { result = new GetOnlySceneAllData { errorMessageBase = "没有主网关" }; } 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 tempResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempResult == null) { result = new GetOnlySceneAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new GetOnlySceneAllData { errorResponData = tempResult }; } } if (topic == gatewayID + "/" + "Scene/GetInfo_Respon") { var getSceneInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (getSceneInfo == null) { result = new GetOnlySceneAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { result = new GetOnlySceneAllData { getSceneInfo = getSceneInfo }; } } }; ZbGateway.MainGateWay.Actions += action; System.Console.WriteLine("Scene/GetInfo_Actions 启动" + System.DateTime.Now.ToString()); var jobjectData = new JObject { { "Cluster_ID", 0 }, { "Command", 805 } }; await ZbGateway.MainGateWay.Send(("Scene/GetInfo"), System.Text.Encoding.UTF8.GetBytes(jobjectData.ToString())); 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 GetOnlySceneAllData { errorMessageBase = " 回复超时,请重新操作" }; } return result; }); } /// ///获取场景信息,网关反馈信息 /// [System.Serializable] public class GetOnlySceneAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 获取场景信息 /// public GetSceneInfo getSceneInfo; } /// /// 获取场景信息 /// [System.Serializable] public class GetSceneInfo { /// ///场景总数 /// public int ScenesSum; /// /// 场景列表 /// public List ScenesList = new List(); } /// /// 场景列表中的具体信息 /// [System.Serializable] public class ScenesListInfo { /// /// 场景ID /// public int ScenesId; /// /// 名称 /// public string ScenesName; /// /// 是否处于开启状态 ///0:场景没有被开启 ///1:场景处于开启状态 /// public int IsOpen; } #endregion } }