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
}
}