using Shared.Common; using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 设备属性上报的逻辑类 /// public class HdlDeviceAttributeLogic : ZigBee.Common.IStatus { #region ■ 变量声明___________________________ /// /// 属性上报的逻辑 /// private static HdlDeviceAttributeLogic m_Current = null; /// /// 属性上报的逻辑 /// public static HdlDeviceAttributeLogic Current { get { if (m_Current == null) { m_Current = new HdlDeviceAttributeLogic(); } return m_Current; } set { m_Current = value; } } /// /// 事件集合 /// private Dictionary> dicEvent = new Dictionary>(); /// /// 命令区分 /// private Dictionary dicCommandDiv = new Dictionary(); #endregion #region ■ 添加事件___________________________ /// /// 添加获取设备属性的事件(推送已经强制指定运行于主线程,属性上报的对象:device.DeviceStatusReport) /// /// 标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况) /// 命令区分,比如:DeviceStatusReport,IASInfoReport等等 /// 当接收到网关回复之后的回调函数,属性上报的对象:device.DeviceStatusReport public void AddAttributeEvent(string mainKeys, string comand, Action action) { lock (this.dicEvent) { if (this.dicEvent.Count == 0) { ZbGateway.StatusList.Add(this); } this.dicEvent[mainKeys] = action; this.dicCommandDiv[mainKeys] = comand; } } #endregion #region ■ 移除监听___________________________ /// /// 移除事件 /// /// 标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况) public void RemoveEvent(string mainKeys) { lock (this.dicEvent) { if (this.dicEvent.ContainsKey(mainKeys) == true) { var action = this.dicEvent[mainKeys]; this.dicEvent.Remove(mainKeys); this.dicCommandDiv.Remove(mainKeys); action = null; } if (this.dicEvent.Count == 0) { ZbGateway.StatusList.Remove(this); } } } /// /// 移除全部的事件 /// public void RemoveAllEvent() { lock (this.dicEvent) { var list = new HashSet(); foreach (var keys in this.dicEvent.Keys) { list.Add(keys); } foreach (var keys in list) { //需要慢慢一个一个的释放Action,听说 this.RemoveEvent(keys); } } } #endregion #region ■ 实现接口___________________________ /// /// 设备状态通知 /// /// /// public void DeviceInfoChange(CommonDevice common, string typeTag) { if (common == null || string.IsNullOrEmpty(common.DeviceAddr) == true) { //我也不知道这有没有可能 return; } lock (this.dicEvent) { var list = new List>(); foreach (string keys in this.dicEvent.Keys) { if (this.dicCommandDiv[keys] != typeTag) { //命令区分不一致,则不调用回调函数 continue; } //命令区分一致时,则调用回调函数 list.Add(this.dicEvent[keys]); } //有可能在回调函数中移除了事件,导致报错,所以先收集,再调用 Application.RunOnMainThread(() => { foreach (var action in list) { try { action?.Invoke(common); } catch (Exception ex) { //Log出力 string msg = "当前激活的界面[" + UserCenterResourse.NowActionFormID + "]"; HdlLogLogic.Current.WriteLog(-1, msg); HdlLogLogic.Current.WriteLog(ex); } } }); } } /// /// 不使用 /// /// public void Changed(CommonDevice common) { } /// /// 不使用 /// public void ChangedILogicStatus(ZigBee.Device.Logic logic) { } /// /// 不使用 /// public void ChangedISceneStatus(Scene scene) { } #endregion #region ■ 一般方法___________________________ /// /// 是否存在指定的事件 /// /// /// public bool IsEsixt(string mainkeys) { return this.dicCommandDiv.ContainsKey(mainkeys); } #endregion } }