using System; using System.Collections.Generic; using Newtonsoft.Json.Linq; namespace ZigBee.Device { [System.Serializable] public class BindObj : CommonDevice { #region 设备绑定 /// ///设备绑定 /// public async System.Threading.Tasks.Task AddDeviceBindAsync(AddBindData addBindData) { return await System.Threading.Tasks.Task.Run(async () => { AddedDeviceBindResponseAllData result = null; var mainGateway = ZbGateway.MainGateWay; if (mainGateway == null) { result = new AddedDeviceBindResponseAllData { errorMessageBase = "当前没有主网关" }; return result; } 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 = ZbGateway.MainGateWay.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { result.errorMessageBase = "网关错误回复,且数据是空"; } else { result.errorResponData = temp; result.errorMessageBase = ErrorMess(temp.Error); } } else if (topic == gatewayID + "/" + "Bind/SetBind_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = ZbGateway.MainGateWay.getGatewayBaseInfo.gwID }; var tempResult = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempResult == null) { result = new AddedDeviceBindResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { result = new AddedDeviceBindResponseAllData { addedDeviceBindResponseData = tempResult }; DebugPrintLog($"UI收到通知后的主题_{topic}"); } } }; mainGateway.Actions += action; DebugPrintLog("Bind/SetBind_Actions 启动" + "_" + System.DateTime.Now.ToLongTimeString() + " " + System.DateTime.Now.Millisecond); try { if (addBindData != null) { var jObject = new JObject { { "DeviceAddr", addBindData.DeviceAddr }, { "Epoint", addBindData.Epoint }, { "Cluster_ID", 0 }, { "Command", 5001 } }; var bindList = new JArray { }; foreach (var bindInfo in addBindData.BindList) { if (bindInfo.BindType == 0) { var dInfo = new JObject{ { "BindMacAddr",bindInfo.BindMacAddr}, { "BindEpoint", bindInfo.BindEpoint} , { "BindCluster", bindInfo.BindCluster} , { "BindType",bindInfo.BindType} }; bindList.Add(dInfo); } else if (bindInfo.BindType == 1) { var dInfo = new JObject{ { "BindCluster", bindInfo.BindCluster} , { "BindType",bindInfo.BindType}, { "BindScenesId", bindInfo.BindScenesId} }; bindList.Add(dInfo); } } var data = new JObject{ {"BindName",addBindData.BindName}, { "BindList", bindList } }; jObject.Add("Data", data); mainGateway.Send("Bind/SetBind", jObject.ToString()); } } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 20 * 1000) { await System.Threading.Tasks.Task.Delay(10); if (result != null) { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > 20 * 1000) { result = new AddedDeviceBindResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; } mainGateway.Actions -= action; System.Console.WriteLine($"Bind/SetBind_Actions 退出 { System.DateTime.Now.ToLongTimeString() + " " + System.DateTime.Now.Millisecond}"); return result; }); } /// /// 绑定设备信息,网关反馈信息 /// public AddedDeviceBindResponseAllData addedDeviceBindResponseAllData; [System.Serializable] public class AddedDeviceBindResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 网关直接反馈绑定设备信息 /// public AddedDeviceBindResponseData addedDeviceBindResponseData; /// /// 按键设备的确认反馈绑定设备信息 /// public AddBindResultResponseData addBindResultResponseData; } /// /// 绑定设备信息 /// public AddedDeviceBindResponseData addedDeviceBindResponseData; [System.Serializable] public class AddedDeviceBindResponseData { /// ///绑定名称 /// public string BindName; /// ///绑定列表 ,当Status=0时存在 /// public List BindList = new List(); /// /// 0:绑定所有目标成功 ///1:绑定目标失败,绑定设备目标有漏掉 /// public int Result = -1; } /// /// 绑定列表的信息 /// [System.Serializable] public class AddBindListResponseObj : BindListResponseObj { /// /// 0:加入成功(该状态只适用用于跨网关绑定和绑定场景。同网关设备间的绑定需要节点设备的确认成功信息,不会直接反馈成功。) ///1:失败,节点设备或场景不存在。 ///2:未知,由节点设备反馈发送“Bind/BindResult”主题消息确定是否成功。 ///3:绑定已经存在。 /// public int Result; } /// /// 按键设备的确认的信息 /// [System.Serializable] public class AddBindResultResponseData { /// ///绑定结果 ///0:成功 ///140:失败,控制设备的绑定列表已满 ///其他:失败 /// public int Result; /// /// 绑定的cluster /// public int BindCluster; /// /// 绑定设备Mac地址, 当BindType=0时存在 /// public string BindMacAddr; /// /// 绑定设备的端口号,当BindType=0时存在 /// public int BindEpoint; /// /// 绑定场景,当BindType=2时存在 /// public int BindScenesId; /// /// 绑定设备的名称 /// public string DeviceName; } /// /// 绑定设备的数据 /// public AddBindData addBindData; [System.Serializable] public class AddBindData { /// /// 控制设备节点的mac地址 /// public string DeviceAddr; /// /// 错误信息 /// public int Epoint; /// ///绑定名称,不修改名称时忽略该选项 /// public string BindName; /// ///绑定列表,不修改绑定列表时忽略该选项。 /// public List BindList = new List(); } /// /// 控制设备绑定的信息 /// [System.Serializable] public class AddBindListObj { /// /// 绑定类型 ///0:绑定设备 ///1:绑定场景 /// public int BindType; /// /// 绑定的cluster,需要控制设备的OutCluster列表中存在该cluster。 ///如绑定某个设备的on/off,为6。 /// public int BindCluster; /// /// 绑定设备Mac地址, 当BindType=0时存在 /// public string BindMacAddr; /// /// 绑定设备的端口号,当BindType=0时存在 /// public int BindEpoint; /// /// 绑定场景,当BindType=1时存在 /// public int BindScenesId; } #endregion #region 解除绑定 /// /// 解除绑定 /// //public async System.Threading.Tasks.Task DelDeviceBindAsync(DelDeviceBindData delDeviceBindData) //{ // return await System.Threading.Tasks.Task.Run(async () => // { // DelDeviceBindResponseAllData responseData = null; // var mainGateway = ZbGateway.MainGateWay; // if (mainGateway == null) // { // responseData = new DelDeviceBindResponseAllData { errorMessageBase = "当前没有主网关" }; // } // 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 = mainGateway.getGatewayBaseInfo.gwID }; // var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); // if (temp == null) // { // responseData = new DelDeviceBindResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; // } // else // { // responseData = new DelDeviceBindResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; // } // } // //场景移除 // if (topic == gatewayID + "/" + "Bind/RemoveBind_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) // { // responseData = new DelDeviceBindResponseAllData { errorMessageBase = "网关返回的数据为空" }; // } // else // { // responseData = new DelDeviceBindResponseAllData { delDeviceBindResponseData = tempData }; // System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); // } // } // //设备移除 // if (topic == gatewayID + "/" + "Bind/RemoveBindResult") // { // var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = mainGateway.getGatewayBaseInfo.gwID }; // var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); // if (tempData != null) // { // responseData = new DelDeviceBindResponseAllData { removeBindResultResponseData = tempData }; // System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); // } // } // }; // mainGateway.Actions += action; // System.Console.WriteLine("DeviceBind/DelBind_Actions 启动" + "_" + System.DateTime.Now.ToString()); // try // { // if (delDeviceBindData != null) // { // var jObject = new JObject { { "DeviceAddr", delDeviceBindData.DeviceAddr }, { "Epoint", delDeviceBindData.Epoint }, { "Cluster_ID", 0 }, { "Command", 5003 } }; // var removeBindList = new JArray { }; // foreach (var removeBindInfo in delDeviceBindData.RemoveBindList) // { // if (removeBindInfo.BindType == 0) // { // var dInfo = new JObject{ // { "BindMacAddr",removeBindInfo.BindMacAddr}, // { "BindEpoint", removeBindInfo.BindEpoint} , // { "BindCluster", removeBindInfo.BindCluster} , // { "BindType",removeBindInfo.BindType} // }; // removeBindList.Add(dInfo); // } // else if (removeBindInfo.BindType == 1) // { // var dInfo = new JObject{ // { "BindCluster", removeBindInfo.BindCluster} , // { "BindType",removeBindInfo.BindType}, // { "BindScenesId", removeBindInfo.BindScenesId} // }; // removeBindList.Add(dInfo); // } // } // var data = new JObject { // {"RemoveBindList",removeBindList} // }; // jObject.Add("Data", data); // mainGateway.Send("Bind/RemoveBind", jObject.ToString()); // } // } // catch { } // var dateTime = DateTime.Now; // while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) // { // await System.Threading.Tasks.Task.Delay(10); // if (responseData != null) // { // break; // } // } // if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) // { // responseData = new DelDeviceBindResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; // } // mainGateway.Actions -= action; // System.Console.WriteLine("DeviceBind/DelBind_Actions 退出" + System.DateTime.Now.ToString()); // return responseData; // }); //} //之前2种方式反馈结果 public async System.Threading.Tasks.Task DelDeviceBindAsync(DelDeviceBindData delDeviceBindData) { return await System.Threading.Tasks.Task.Run(async () => { var responseData = new DelDeviceBindResponseAllData(); var mainGateway = ZbGateway.MainGateWay; if (mainGateway == null) { responseData.errorMessageBase = "当前没有主网关"; return responseData; } 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 = mainGateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { responseData.errorMessageBase = "网关错误回复,且数据是空"; } else { responseData.errorResponData = temp; responseData.errorMessageBase = ErrorMess(temp.Error); } } if (topic == gatewayID + "/" + "Bind/RemoveBind_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) { responseData.errorMessageBase = "网关返回的数据为空"; } else { responseData.delDeviceBindResponseData = tempData; System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); } } if (topic == gatewayID + "/" + "Bind/RemoveBindResult") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DeviceEpoint = jobject.Value("Epoint"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = mainGateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData != null) { responseData.removeBindResultResponseData = tempData; System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); } } }; mainGateway.Actions += action; System.Console.WriteLine("DeviceBind/DelBind_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { if (delDeviceBindData != null) { var jObject = new JObject { { "DeviceAddr", delDeviceBindData.DeviceAddr }, { "Epoint", delDeviceBindData.Epoint }, { "Cluster_ID", 0 }, { "Command", 5003 } }; var removeBindList = new JArray { }; foreach (var removeBindInfo in delDeviceBindData.RemoveBindList) { if (removeBindInfo.BindType == 0) { var dInfo = new JObject{ { "BindMacAddr",removeBindInfo.BindMacAddr}, { "BindEpoint", removeBindInfo.BindEpoint} , { "BindCluster", removeBindInfo.BindCluster} , { "BindType",removeBindInfo.BindType} }; removeBindList.Add(dInfo); } else if (removeBindInfo.BindType == 1) { var dInfo = new JObject{ { "BindCluster", removeBindInfo.BindCluster} , { "BindType",removeBindInfo.BindType}, { "BindScenesId", removeBindInfo.BindScenesId} }; removeBindList.Add(dInfo); } } var data = new JObject { {"RemoveBindList",removeBindList} }; jObject.Add("Data", data); //ZbGateway.MainGateWay.CurrentGateWayId = ZbGateway.MainGateWay.getGatewayBaseInfo?.gwID; mainGateway.Send("Bind/RemoveBind", jObject.ToString()); } } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) { await System.Threading.Tasks.Task.Delay(100); if (responseData == null || responseData.delDeviceBindResponseData == null) { continue; } if (0 < responseData.delDeviceBindResponseData.RemoveBindList.FindAll((obj) => obj.BindType == 0 && obj.Result == 1).Count) { if (responseData.removeBindResultResponseData != null) { break; } } else if (0 < responseData.delDeviceBindResponseData.RemoveBindList.FindAll((obj) => obj.BindType == 0 && obj.Result == 3).Count) { if (responseData.removeBindResultResponseData != null) { break; } } else if (0 < responseData.delDeviceBindResponseData.RemoveBindList.FindAll((obj) => obj.BindType == 0 && obj.Result == 2).Count) { if (responseData.removeBindResultResponseData != null) { break; } } else { break; } } if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) { responseData.errorMessageBase = "回复超时,请重新操作"; } mainGateway.Actions -= action; System.Console.WriteLine("DeviceBind/DelBind_Actions 退出" + System.DateTime.Now.ToString()); return responseData; }); } /// ///解除绑定数据,网关反馈信息 /// public DelDeviceBindResponseAllData delDeviceBindResponseAllData; /// ///解除绑定数据,网关反馈信息 /// [System.Serializable] public class DelDeviceBindResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 解除绑定数据信息 /// public DelDeviceBindResponseData delDeviceBindResponseData; /// /// 解除绑定按键确认数据信息 /// public RemoveBindResultResponseData removeBindResultResponseData; } /// /// 解除绑定数据 /// public DelDeviceBindResponseData delDeviceBindResponseData; /// /// 解除绑定数据 /// [System.Serializable] public class DelDeviceBindResponseData { /// ///绑定列表 ,当Status=0时存在 /// public List RemoveBindList = new List(); } /// /// 移除设备绑定的信息 /// [System.Serializable] public class RemoveBindListResponseObj : BindListResponseObj { /// /// 0:移除成功(该状态只适用用于跨网关绑定、绑定场景、失效设备(设备已经从网关的设备列表中删除)。同网关设备间的解除绑定需要节点设备的确认成功信息,不会直接反馈成功。) ///1:失败,设备不在绑定列表中 ///3:失败,在等待节点设备确认是否解除绑定成功(当网关还在等待某节点设备确认是否解除绑定成功的反馈信息时,客户端再次发送解除绑定该节点设备的指令,将反馈该状态。) ///2:未知,由节点设备反馈发送“Bind/RemoveBindResult”主题消息确定是否成功。 /// public int Result; } /// /// 移除设备绑定按键确认的信息 /// [System.Serializable] public class RemoveBindResultResponseData { /// ///绑定结果 ///0:成功 ///136:控制设备本地绑定列表中无此绑定 ///其他:失败 /// public int Result; /// /// 绑定设备Mac地址 /// public string BindMacAddr; /// /// 绑定设备的端口号 /// public int BindEpoint; /// /// 绑定的cluster /// public int BindCluster; /// /// 绑定设备名称 /// public string DeviceName; } /// /// 解除绑定数据 /// public DelDeviceBindData delDeviceBindData; /// /// 解除绑定数据 /// [System.Serializable] public class DelDeviceBindData { /// /// 控制设备节点的mac地址 /// public string DeviceAddr; /// /// 错误信息 /// public int Epoint; /// ///绑定列表 ,当Status=0时存在 /// public List RemoveBindList = new List(); } /// /// 移除设备绑定的信息 /// [System.Serializable] public class RemoveBindListObj { /// /// 绑定类型 ///0:移除设备 ///1:移除场景 /// public int BindType; /// /// 绑定的cluster /// public int BindCluster; /// /// 绑定设备Mac地址, 当BindType=0时存在 /// public string BindMacAddr; /// /// 绑定设备的端口号,当BindType=0时存在 /// public int BindEpoint; /// /// 绑定场景,当BindType=1时存在 /// public int BindScenesId; } #endregion #region (从网关中)获取所有绑定 /// ///获取所有绑定 /// public async System.Threading.Tasks.Task GetDeviceBindAsync() { return await System.Threading.Tasks.Task.Run(async () => { GetDeviceBindResponseAllData d = null; var mainGateway = ZbGateway.MainGateWay; if (mainGateway == null) { d = new GetDeviceBindResponseAllData { errorMessageBase = "当前没有主网关" }; return d; } 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 = mainGateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new GetDeviceBindResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new GetDeviceBindResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "Bind/GetDeviceBind_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = mainGateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); //var tempBindList = Newtonsoft.Json.Linq.JArray.Parse(jobject["Data"]["BindList"].ToString()); if (tempData == null) { d = new GetDeviceBindResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new GetDeviceBindResponseAllData { getAllBindResponseData = tempData }; System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); } } }; mainGateway.Actions += action; try { System.Console.WriteLine("Bind/GetDeviceBind_Actions 启动" + "_" + System.DateTime.Now.ToString()); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 0 }, { "Command", 5007 } }; mainGateway.Send("Bind/GetDeviceBind", 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 GetDeviceBindResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; } mainGateway.Actions -= action; System.Console.WriteLine("Bind/GetDeviceBind_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///获取所有绑定数据,网关反馈信息 /// public GetDeviceBindResponseAllData getAllBindResponseAllData; [System.Serializable] public class GetDeviceBindResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 控制设备绑定的设备列表回复数据 /// public GetDeviceBindResponseData getAllBindResponseData; } /// /// 获取所有绑定回复的数据 /// public GetDeviceBindResponseData getAllBindResponseData; [System.Serializable] public class GetDeviceBindResponseData { /// /// 0:成功 ///1:绑定不存在 /// public int Result; /// /// 绑定列表 ,当Status=0时存在。 /// public List BindList = new List(); } /// /// 获取所有绑定的信息 /// public class BindListResponseObj { /// /// 绑定类型 ///0:移除设备,同网关设备间的移除 ///1:移除设备,跨网关设备间的移除 ///2:移除绑定场景 /// public int BindType; /// /// 绑定的cluster /// public int BindCluster; /// /// 绑定设备Mac地址, 当BindType=0时存在 /// public string BindMacAddr; /// /// 绑定设备的端口号,当BindType=0时存在 /// public int BindEpoint; /// /// 绑定场景,当BindType=1时存在 /// public int BindScenesId; /// /// 绑定的设备或场景名称 /// public string ESName; } #endregion #region 从节点设备本地记录读取绑定列表信息 /// ///从节点设备本地记录读取绑定列表信息 /// public async System.Threading.Tasks.Task GetDeviceLocalBindAsync(int startIndex = 0) { return await System.Threading.Tasks.Task.Run(async () => { GetDeviceLocalBindResponseAllData d = null; var mainGateway = ZbGateway.MainGateWay; if (mainGateway == null) { d = new GetDeviceLocalBindResponseAllData { errorMessageBase = "当前没有主网关" }; return d; } 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 = mainGateway.getGatewayBaseInfo.gwID }; var temp = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (temp == null) { d = new GetDeviceLocalBindResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new GetDeviceLocalBindResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "Bind/GetDeviceLocalBind_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = mainGateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new GetDeviceLocalBindResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new GetDeviceLocalBindResponseAllData { getDeviceLocalBindResponseData = tempData }; DebugPrintLog($"UI收到通知后的主题_{ topic}"); } } }; mainGateway.Actions += action; try { DebugPrintLog("Bind/GetDeviceLocalBind_Actions 启动" + "_" + System.DateTime.Now.ToString()); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Cluster_ID", 0 }, { "Command", 5008 } }; var data = new JObject { { "StartIndex", startIndex } }; mainGateway.Send("Bind/GetDeviceLocalBind", 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 GetDeviceLocalBindResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; } mainGateway.Actions -= action; DebugPrintLog("Bind/GetDeviceLocalBind_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///从节点设备本地记录读取绑定列表信息回复的数据,网关反馈信息 /// public GetDeviceLocalBindResponseAllData getDeviceLocalBindResponseAllData; [System.Serializable] public class GetDeviceLocalBindResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 从节点设备本地记录读取绑定列表信息回复的数据 /// public GetDeviceLocalBindResponseData getDeviceLocalBindResponseData; } /// /// 从节点设备本地记录读取绑定列表信息回复的数据 /// public GetDeviceLocalBindResponseData getDeviceLocalBindResponseData; [System.Serializable] public class GetDeviceLocalBindResponseData { /// /// 0:成功 ///181:失败 /// public int Result; /// /// 该设备一共有多少个绑定列表 /// public int MaxNumItems; /// ///开始索引号 /// public int StartIndex; /// /// 该次读取返回绑定列表个数 /// public int ReturnBindNum; /// /// 绑定列表,当Result=0时存在 /// public List BindList = new List(); } /// /// 从节点设备本地记录读取绑定列表的信息 /// public class BindDeviceLocalListResponseObj { /// /// 绑定类型 ///0x01:绑定组(暂没用到组绑定,可忽略) ///0x03:绑定设备 /// public int BindMode; /// /// 控制设备的端口号 /// public int ControllerEpoint; /// /// 绑定的cluster /// public int BindCluster; /// /// 绑定的组(暂没用到组绑定,可忽略)。当BindMode为1时存在 /// public int GroupId; /// /// 绑定设备Mac地址, 当BindMode为3时存在 /// public string BindMacAddr; /// /// 绑定设备的端口号,当BindMode 为3时存在 /// public int BindEpoint; } #endregion #region 删除一个控制设备所有绑定信息 /// ///删除一个控制设备所有绑定信息 /// public async System.Threading.Tasks.Task ClearBindInfoAsync() { if (Gateway == null) { return null; } return await System.Threading.Tasks.Task.Run(async () => { ClearBindInfoResponseAllData 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 ClearBindInfoResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; } else { d = new ClearBindInfoResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; } } if (topic == gatewayID + "/" + "Bind/ClearBindInfo_Respon") { var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value("Device_ID"), DeviceAddr = jobject.Value("DeviceAddr"), DataID = jobject.Value("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject(jobject["Data"].ToString()); if (tempData == null) { d = new ClearBindInfoResponseAllData { errorMessageBase = "网关返回的数据为空" }; } else { d = new ClearBindInfoResponseAllData { clearBindInfoResponseData = tempData }; System.Console.WriteLine($"UI收到通知后的主题_{ topic}"); } } }; Gateway.Actions += action; DebugPrintLog("Bind/ClearBindInfo_Actions 启动" + "_" + System.DateTime.Now.ToString()); try { var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 0 }, { "Command", 5006 } }; Gateway.Send("Bind/ClearBindInfo", jObject.ToString()); } catch { } var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalMilliseconds < 25 * 1000) { await System.Threading.Tasks.Task.Delay(10); if (d != null) { break; } } //一键清除目标,会因为目标数量多而加长时间,目前暂定20秒 if ((DateTime.Now - dateTime).TotalMilliseconds > 25 * 1000) { d = new ClearBindInfoResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; } Gateway.Actions -= action; DebugPrintLog("Bind/ClearBindInfo_Actions 退出" + System.DateTime.Now.ToString()); return d; }); } /// ///删除一个控制设备所有绑定数据,网关反馈信息 /// public ClearBindInfoResponseAllData clearBindInfoResponseAllData; [System.Serializable] public class ClearBindInfoResponseAllData { /// /// 错误信息 /// public string errorMessageBase; /// /// 网关信息错误反馈 /// 当网关接收到客户端信息后,出现以下异常情况将反馈错误。 /// public ErrorResponData errorResponData; /// /// 控制设备绑定的设备列表回复数据 /// public ClearBindInfoResponseData clearBindInfoResponseData; } /// /// 删除一个控制设备所有绑定信息回复的数据 /// public ClearBindInfoResponseData clearBindInfoResponseData; [System.Serializable] public class ClearBindInfoResponseData { /// /// 0:成功 ///1:绑定信息不存在 /// public int Result; } #endregion } }