using System; using System.Collections.Generic; using System.Text; using Newtonsoft.Json.Linq; using ZigBee.Device; namespace Shared.Phone.UserCenter { /// /// 全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作) /// public class HdlGatewayReceiveLogic { #region ■ 变量声明___________________________ /// /// 全局接收网关推送的的逻辑 /// private static HdlGatewayReceiveLogic m_Current = null; /// /// 全局接收网关推送的的逻辑 /// public static HdlGatewayReceiveLogic Current { get { if (m_Current == null) { m_Current = new HdlGatewayReceiveLogic(); } return m_Current; } } /// /// 设备推送事件集合 /// private Dictionary> dicDeviceEvent = new Dictionary>(); /// /// 命令区分 /// private Dictionary dicCommandDiv = new Dictionary(); #endregion #region ■ 全局接收___________________________ /// /// 全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作) /// /// 网关ID /// 整个主题 /// 上报数据的主题 /// 接收的数据 public void GatewayOverallMsgReceive(string gatewayId, string topic, string reportTopic, JObject receiveData) { if (topic == "AppNoLogin") { HdlThreadLogic.Current.RunMain(() => { //登录密匙已经过期,请重新登录 string msg = Language.StringByID(R.MyInternationalizationString.uTokenIsOldAndLoginAgain); var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); UserCenterLogic.ReLoginAgain(UserCenterResourse.UserInfo.Account, false); }); } else if (topic == "BeingSqueezedOffline") { HdlThreadLogic.Current.RunMain(() => { //此帐号已在别处登录,您被迫下线 string msg = Language.StringByID(R.MyInternationalizationString.uHadBeenLoginAndOffLine); var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); UserCenterLogic.ReLoginAgain(UserCenterResourse.UserInfo.Account, false); }); } else if (topic == "YouIpAndPortNoRecord") { HdlThreadLogic.Current.RunMain(() => { //您当前的IP及端口在云端不存在,请重新登录! string msg = Language.StringByID(R.MyInternationalizationString.uYouIpAndPortNoRecord); var contr = new ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); UserCenterLogic.ReLoginAgain(UserCenterResourse.UserInfo.Account, false); }); } try { if (HdlGatewayLogic.Current.IsGatewayExist(gatewayId) == false) { //不是自己绑定的网关,则不处理 return; } //设备属性上报 if (reportTopic == "DeviceStatusReport") { //设备属性上报 //this.DeviceAttributeReportPush(receiveData); } //传感器上报 else if (reportTopic == "IASInfoReport") { //this.SensorDeviceReportPush(receiveData); } //门锁上报 else if (topic == gatewayId + "/Alarms/SendAlarmInform") { this.DoorLockDeviceReportPush(receiveData); } //通过外部方式布防撤防成功时报告 else if (topic == gatewayId + "/Security/EnOrWithdrawSucceedReport") { SecurityEnOrWithdrawSucceedReport(receiveData); } } catch (Exception ex) { //Log出力 HdlLogLogic.Current.WriteLog(ex); } } #endregion #region ■ 通过外部方式布防撤防_______________ /// /// 通过外部方式布防撤防 /// /// 接收的数据 private void SecurityEnOrWithdrawSucceedReport(JObject receiveData) { var data = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"].ToString()); if (data.EnOrWithdraw == -1 || data.ModeId == -1 || data.OperationWay == -1) { return; } var garrison = GarrisonMode.None; if (data.EnOrWithdraw == 0) { //在家布防 if (data.ModeId == 1) { garrison = GarrisonMode.AtHome; } //离家布防 else if (data.ModeId == 2) { garrison = GarrisonMode.RemoveHome; } } else if (data.EnOrWithdraw == 1) { //撤防 garrison = GarrisonMode.RemoveGarrison; } string appendText = string.Empty; //自动化 if (data.OperationWay == 0) { appendText = "(" + Language.StringByID(R.MyInternationalizationString.uLogicOperation) + ")"; } //按键操作 else if (data.OperationWay == 1) { appendText = "(" + Language.StringByID(R.MyInternationalizationString.uPanelOperation) + ")"; } //保存报警信息然后推送到界面上 HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(garrison, appendText, true); } /// /// 通过外部方式布防撤防的接收结果 /// private class SecurityEnOrWithdrawResult { /// /// 0:布防成功 1:撤防成功 /// public int EnOrWithdraw = -1; /// /// 安防模式id /// public int ModeId = -1; /// /// 外部布撤防方式-> 0:执行逻辑动作 1:按键操作 /// public int OperationWay = -1; } #endregion #region ■ 设备属性上报_______________________ /// /// 设备属性上报 /// /// private void DeviceAttributeReportPush(JObject receiveData) { var deviceAddr = receiveData.Value("DeviceAddr"); var deviceEpoint = receiveData.Value("Epoint"); var tempDevice = new CommonDevice { DeviceAddr = deviceAddr, DeviceEpoint = deviceEpoint }; tempDevice.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"].ToString()); this.DeviceReportPush(tempDevice, "DeviceStatusReport"); } #endregion #region ■ 传感器上报_________________________ /// /// 传感器设备上报 /// /// private void SensorDeviceReportPush(JObject receiveData) { var ias = new IASZone() { DeviceAddr = receiveData.Value("DeviceAddr"), DeviceEpoint = receiveData.Value("Epoint") }; ias.iASInfo = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"].ToString()); //如果没有添加入安防 if (HdlSafeguardLogic.Current.GetZoneIdByIASZone(ias) == -1) { } else { //保存安防报警信息到本地 HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(ias); } } #endregion #region ■ 门锁上报___________________________ /// /// 门锁上报 /// /// private void DoorLockDeviceReportPush(JObject receiveData) { //保存门锁信息到本地 HdlAlarmsLogic.Current.SaveDoorLockAlarmInfo(receiveData); } #endregion #region ■ 添加设备事件_______________________ /// /// 添加获取设备属性的事件(推送已经强制指定运行于主线程,属性上报的对象:device.DeviceStatusReport) /// /// 标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况) /// 命令区分,比如:DeviceStatusReport,IASInfoReport等等 /// 当接收到网关回复之后的回调函数,属性上报的对象:device.DeviceStatusReport public void AddAttributeEvent(string mainKeys, string comand, Action action) { lock (this.dicDeviceEvent) { this.dicDeviceEvent[mainKeys] = action; this.dicCommandDiv[mainKeys] = comand; } } #endregion #region ■ 移除设备监听_______________________ /// /// 移除事件 /// /// 标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况) public void RemoveEvent(string mainKeys) { lock (this.dicDeviceEvent) { if (this.dicDeviceEvent.ContainsKey(mainKeys) == true) { var action = this.dicDeviceEvent[mainKeys]; this.dicDeviceEvent.Remove(mainKeys); this.dicCommandDiv.Remove(mainKeys); action = null; } } } /// /// 移除全部的事件 /// public void RemoveAllEvent() { lock (this.dicDeviceEvent) { var list = new HashSet(); foreach (var keys in this.dicDeviceEvent.Keys) { list.Add(keys); } foreach (var keys in list) { //需要慢慢一个一个的释放Action,听说 this.RemoveEvent(keys); } } } #endregion #region ■ 设备上报推送_______________________ /// /// 设备上报推送 /// /// /// private void DeviceReportPush(CommonDevice common, string reportTopic) { lock (this.dicDeviceEvent) { if (this.dicDeviceEvent.Count == 0) { //没有添加监听 return; } var list = new List>(); foreach (string keys in this.dicDeviceEvent.Keys) { if (this.dicCommandDiv[keys] != reportTopic) { //命令区分不一致,则不调用回调函数 continue; } //命令区分一致时,则调用回调函数 list.Add(this.dicDeviceEvent[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); } } }); } } #endregion #region ■ 一般方法___________________________ /// /// 是否存在指定的事件 /// /// /// public bool IsEsixt(string mainkeys) { return this.dicCommandDiv.ContainsKey(mainkeys); } #endregion } }