using System;
using System.Collections.Generic;
using System.Text;
using ZigBee.Device;
namespace Shared.Phone.UserCenter
{
///
/// 设备镜像的逻辑
///
public class HdlDeviceImageInfoLogic
{
#region ■ 变量声明___________________________
///
/// 设备镜像的逻辑
///
private static HdlDeviceImageInfoLogic m_Current = null;
///
/// 设备镜像的逻辑
///
public static HdlDeviceImageInfoLogic Current
{
get
{
if (m_Current == null)
{
m_Current = new HdlDeviceImageInfoLogic();
}
return m_Current;
}
}
///
/// OTA设备获取镜像后的回调函数
///
private Dictionary> dicOtaBackAction = new Dictionary>();
#endregion
#region ■ 主入口函数_________________________
///
/// 设置设备全部的镜像信息
///
///
///
public void SetAllImageInfoToOtaDevice(OTADevice tADevice, Action backAction = null)
{
if (tADevice == null)
{
return;
}
lock (dicOtaBackAction)
{
//先移除
this.RemoveDeviceFirmwareVersionThread(tADevice);
if (backAction != null)
{
this.dicOtaBackAction[tADevice.DeviceAddr] = backAction;
}
//设置设备的固件版本号(需要等待推送后才会更改)
this.SetFirmwareVersionToOtaDevice(tADevice);
}
}
///
/// 设置设备的固件版本号(需要等待推送后才会更改)
///
///
private void SetFirmwareVersionToOtaDevice(OTADevice tADevice)
{
if (HdlGatewayReceiveLogic.Current.IsEsixt("DeviceAutoGetFirmwareVersion") == false)
{
//添加事件
HdlGatewayReceiveLogic.Current.AddAttributeEvent("DeviceAutoGetFirmwareVersion", ReceiveComandDiv.A设备属性上报, this.SetFirmwareVersionByInterfaceResult);
}
//发送命令
this.SetFirmwareVersionComand(tADevice);
}
#endregion
#region ■ 发送命令___________________________
///
/// 发送获取固件版本信息的命令
///
///
public void SetFirmwareVersionComand(OTADevice device)
{
var jObject = new Newtonsoft.Json.Linq.JObject
{
{ "DeviceAddr",device.DeviceAddr },
{ "Epoint", device.DeviceEpoint },
{ "Cluster_ID", (int)Cluster_ID.Ota },
{ "Command", 108 }
};
var attriBute = new Newtonsoft.Json.Linq.JArray
{
new Newtonsoft.Json.Linq.JObject
{
{ "AttriButeId", (int)AttriButeId.ImgVersion}
},
new Newtonsoft.Json.Linq.JObject
{
{ "AttriButeId", (int)AttriButeId.mgHWversion}
},
new Newtonsoft.Json.Linq.JObject
{
{ "AttriButeId", (int)AttriButeId.ImgTypeId}
}
};
var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
jObject.Add("Data", data);
device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
}
#endregion
#region ■ 设置属性___________________________
///
/// 设置设备的固件版本 -1:异常 0:推送的这个东西并不是固件信息 1:正常
///
/// 上报信息
/// 需要修改的设备对象
///
public int SetFirmwareVersion(CommonDevice.DeviceStatusReportData report, CommonDevice device)
{
if (report == null)
{
return -1;
}
//是否是正确的推送数据
bool isRightData = false;
foreach (var data in report.AttriBute)
{
//镜像版本
if (data.AttributeId == (int)AttriButeId.ImgVersion)
{
isRightData = true;
device.ImgVersion = data.AttriButeData;
}
//硬件版本
if (data.AttributeId == (int)AttriButeId.mgHWversion)
{
isRightData = true;
device.HwVersion = data.AttriButeData;
}
//镜像ID
if (data.AttributeId == (int)AttriButeId.ImgTypeId)
{
isRightData = true;
device.ImgTypeId = data.AttriButeData;
}
}
if (isRightData == false)
{
//这个不是固件信息的推送
return 0;
}
return 1;
}
#endregion
#region ■ 接口推送处理_______________________
///
/// 根据接口推送的信息,设置固件版本号
///
///
private void SetFirmwareVersionByInterfaceResult(CommonDevice device)
{
var otaDevice = Common.LocalDevice.Current.GetOTADevice(device.DeviceAddr, device.DeviceEpoint);
if (otaDevice != null)
{
//设置固件版本信息
this.SetFirmwareVersion(device.DeviceStatusReport, otaDevice);
otaDevice.ReSave();
}
lock (dicOtaBackAction)
{
if (this.dicOtaBackAction.ContainsKey(device.DeviceAddr) == true)
{
var action = this.dicOtaBackAction[device.DeviceAddr];
//调用回调函数
action?.Invoke(device, device.DeviceStatusReport);
//然后移除
this.dicOtaBackAction.Remove(device.DeviceAddr);
action = null;
}
}
}
#endregion
#region ■ 移除监听线程_______________________
///
/// 移除获取设备固件信息的监听线程
///
///
public void RemoveDeviceFirmwareVersionThread(CommonDevice device)
{
lock (dicOtaBackAction)
{
if (this.dicOtaBackAction.ContainsKey(device.DeviceAddr) == true)
{
var action = this.dicOtaBackAction[device.DeviceAddr];
//然后移除
this.dicOtaBackAction.Remove(device.DeviceAddr);
action = null;
}
}
}
#endregion
}
}