using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
using System.Threading.Tasks;
namespace Shared.Phone.UserCenter
{
///
/// 设备绑定的逻辑
///
public class HdlDeviceBindLogic
{
#region ■ 变量声明___________________________
///
/// 设备绑定的逻辑
///
private static HdlDeviceBindLogic m_Current = null;
///
/// 设备绑定的逻辑
///
public static HdlDeviceBindLogic Current
{
get
{
if (m_Current == null)
{
m_Current = new HdlDeviceBindLogic();
}
return m_Current;
}
}
#endregion
#region ■ 获取设备下面绑定的设备_____________
///
/// 获取设备下面绑定的设备(错误时返回null)
///
/// 设备对象
///
public async Task> GetBindTargetDevice(CommonDevice mainDevice)
{
var result = (BindObj.GetDeviceBindResponseAllData)await this.LoadDeviceMethodByNameAsync(mainDevice, "GetDeviceBindAsync");
if (result == null || result.getAllBindResponseData == null)
{
//获取设备的绑定目标失败
string msg = Language.StringByID(R.MyInternationalizationString.uGetDeviceBindTargetFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return null;
}
var listDevice = new List();
foreach (var data in result.getAllBindResponseData.BindList)
{
CommonDevice deviceTemp = Common.LocalDevice.Current.GetDevice(data.BindMacAddr, data.BindEpoint);
if (deviceTemp == null)
{
continue;
}
listDevice.Add(deviceTemp);
}
return listDevice;
}
#endregion
#region ■ 执行绑定设备目标___________________
///
/// 绑定设备的目标(返回成功设置的设备,错误时,返回null)
///
/// 设备对象
/// 要绑定的目标设备
/// BindCluster
///
public async Task> BindDeviceTarget(CommonDevice mainDevice, List listDevice, int BindCluster = 6)
{
if (listDevice.Count == 0)
{
return new List();
}
var dicDevice = new Dictionary();
//组装数据
var addData = new IASZone.AddBindData();
addData.DeviceAddr = mainDevice.DeviceAddr;
addData.Epoint = mainDevice.DeviceEpoint;
foreach (var device in listDevice)
{
var info = new IASZone.AddBindListObj();
info.BindCluster = BindCluster;
info.BindMacAddr = device.DeviceAddr;
info.BindEpoint = device.DeviceEpoint;
info.BindType = 0;
addData.BindList.Add(info);
//返回成功设备的时候使用
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
dicDevice[mainkeys] = device;
}
var result = (BindObj.AddedDeviceBindResponseAllData)await this.LoadDeviceMethodByNameAsync(mainDevice, "AddDeviceBindAsync", addData);
if (result == null || result.addedDeviceBindResponseData == null)
{
//绑定目标设置失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetBindTargetsFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return null;
}
var listSuccess = new List();
foreach (var data in result.addedDeviceBindResponseData.BindList)
{
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(data.BindMacAddr, data.BindEpoint);
if (dicDevice.ContainsKey(mainkeys) == true)
{
listSuccess.Add(dicDevice[mainkeys]);
}
}
if (listSuccess.Count == 0)
{
//绑定目标设置失败
string msg = Language.StringByID(R.MyInternationalizationString.uSetBindTargetsFail);
this.ShowTipMsg(msg);
}
return listSuccess;
}
#endregion
#region ■ 删除设备绑定的目标_________________
///
/// 删除设备绑定的目标
///
/// 设备对象
/// 要删除的绑定目标设备
/// BindCluster
///
public async Task DeleteDeviceTarget(CommonDevice mainDevice, CommonDevice deleteDevice, int BindCluster = 6)
{
//组装数据
var deleteData = new IASZone.DelDeviceBindData();
deleteData.DeviceAddr = mainDevice.DeviceAddr;
deleteData.Epoint = mainDevice.DeviceEpoint;
var info = new IASZone.RemoveBindListObj();
info.BindCluster = BindCluster;
info.BindMacAddr = deleteDevice.DeviceAddr;
info.BindEpoint = deleteDevice.DeviceEpoint;
info.BindType = 0;
deleteData.RemoveBindList.Add(info);
var result = (BindObj.DelDeviceBindResponseAllData)await this.LoadDeviceMethodByNameAsync(mainDevice, "DelDeviceBindAsync", deleteData);
if (result == null || result.delDeviceBindResponseData == null)
{
//删除绑定目标失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return false;
}
foreach (var data in result.delDeviceBindResponseData.RemoveBindList)
{
//0:成功 1:设备不在绑定列表中 ,也可以代表成功
if (data.Result == 0 || data.Result == 1 || data.Result == 5)
{
return true;
}
//3:失败,在等待节点设备确认是否解除绑定成功
else if (data.Result == 3)
{
//其他绑定目标正在删除中,请稍后再试
string msg = Language.StringByID(R.MyInternationalizationString.uOtherBindTargetsIsDelettingPleaseWait);
this.ShowErrorMsg(msg);
return false;
}
//2:未知,由节点设备反馈发送“Bind/BindResult”主题消息确定是否成功
else if (data.Result == 2)
{
if (result.removeBindResultResponseData == null)
{
//删除绑定目标失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
this.ShowErrorMsg(msg);
return false;
}
else
{
//成功
if (result.removeBindResultResponseData.Result == 0)
{
return true;
}
//136:控制设备本地绑定列表中无此绑定
else if (result.removeBindResultResponseData.Result == 136)
{
//这个可以当做成功
return true;
}
else
{
//删除绑定目标失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
this.ShowErrorMsg(msg);
return false;
}
}
}
}
return false;
}
///
/// 删除设备绑定的目标
///
/// 设备对象
/// 要删除的绑定目标设备
/// BindCluster
/// 返回的是成功删除的设备
public async Task> DeleteDeviceTarget(CommonDevice mainDevice, List listDeleteDevice, int BindCluster = 6)
{
//组装数据
var deleteData = new IASZone.DelDeviceBindData();
deleteData.DeviceAddr = mainDevice.DeviceAddr;
deleteData.Epoint = mainDevice.DeviceEpoint;
var dicDevice = new Dictionary();
foreach (var device in listDeleteDevice)
{
var info = new IASZone.RemoveBindListObj();
info.BindCluster = BindCluster;
info.BindMacAddr = device.DeviceAddr;
info.BindEpoint = device.DeviceEpoint;
info.BindType = 0;
deleteData.RemoveBindList.Add(info);
//返回成功设备的时候使用
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(device);
dicDevice[mainkeys] = device;
}
var listSuccess = new List();
var result = (BindObj.DelDeviceBindResponseAllData)await this.LoadDeviceMethodByNameAsync(mainDevice, "DelDeviceBindAsync", deleteData);
if (result == null || result.delDeviceBindResponseData == null)
{
//删除绑定目标失败
string msg = Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
//拼接上【网关回复超时】的Msg
msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result);
this.ShowErrorMsg(msg);
return listSuccess;
}
foreach (var data in result.delDeviceBindResponseData.RemoveBindList)
{
string mainkeys = Common.LocalDevice.Current.GetDeviceMainKeys(data.BindMacAddr, data.BindEpoint);
//0:成功 1:设备不在绑定列表中 ,也可以代表成功
if (data.Result == 0 || data.Result == 1)
{
listSuccess.Add(dicDevice[mainkeys]);
}
//3:失败,在等待节点设备确认是否解除绑定成功
else if (data.Result == 3)
{
//设备名称 其他绑定目标正在删除中,请稍后再试
string msg = Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + "\r\n";
msg += Language.StringByID(R.MyInternationalizationString.uOtherBindTargetsIsDelettingPleaseWait);
this.ShowErrorMsg(msg);
}
//2:未知,由节点设备反馈发送“Bind/BindResult”主题消息确定是否成功
else if (data.Result == 2)
{
if (result.removeBindResultResponseData == null)
{
//设备名称 删除绑定目标失败
string msg = Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + "\r\n";
msg += Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
this.ShowErrorMsg(msg);
}
else
{
//成功
if (result.removeBindResultResponseData.Result == 0)
{
listSuccess.Add(dicDevice[mainkeys]);
}
//136:控制设备本地绑定列表中无此绑定
else if (result.removeBindResultResponseData.Result == 136)
{
//这个可以当做成功
listSuccess.Add(dicDevice[mainkeys]);
}
else
{
//设备名称 删除绑定目标失败
string msg = Common.LocalDevice.Current.GetDeviceEpointName(dicDevice[mainkeys]) + "\r\n";
msg += Language.StringByID(R.MyInternationalizationString.uDeleteBindTargetsFail);
this.ShowErrorMsg(msg);
}
}
}
}
return listSuccess;
}
#endregion
#region ■ 一般方法___________________________
///
/// 执行指定设备对象类里面的方法(注意:这个是专门调用异步,并且等待异步完成的高科技函数,不调用异步的情况,别使用此函数)
///
/// 需要执行的设备的设备对象
/// 指定要加载的方法名
/// 启动参数
private async Task