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); }); return; } 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); }); return; } 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); }); return; } 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") { this.SecurityEnOrWithdrawSucceedReport(receiveData); } //设备在线状态更新反馈 else if (reportTopic == "OnlineStatusChange_Respon") { this.DeviceOnlineChangePush(receiveData); } //撤防 else if (topic == gatewayId + "/Security/WithdrawMode_Respon") { this.RemoveSafetyGarrisonPush(receiveData); } //布防 else if (topic == gatewayId + "/Security/EnableMode_Respon") { this.SetSafetyGarrisonPush(receiveData); } //逻辑触发上报 else if (topic == gatewayId + "/Logic/Execute_Respon") { this.LogicExecutePush(receiveData); } //场景触发上报 else if (topic == gatewayId + "/Scene/Exec_Respon") { this.SceneExecPush(receiveData); } } catch (Exception ex) { //Log出力 HdlLogLogic.Current.WriteLog(ex); } } #endregion #region ■ 设备属性上报_______________________ /// /// 设备属性上报 /// /// private void DeviceAttributeReportPush(JObject receiveData) { if (this.dicDeviceEvent.Count == 0) { //没有添加监听 return; } 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, ReceiveComandDiv.A设备属性上报); } #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) { //保存安防报警信息到本地 HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(ias); } this.DeviceReportPush(ias, ReceiveComandDiv.A传感器上报); //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } #endregion #region ■ 门锁上报___________________________ /// /// 门锁上报 /// /// private void DoorLockDeviceReportPush(JObject receiveData) { //保存门锁信息到本地 HdlAlarmsLogic.Current.SaveDoorLockAlarmInfo(receiveData); //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } #endregion #region ■ 设备在线状态更新反馈_______________ /// /// 设备在线状态更新反馈 /// /// private void DeviceOnlineChangePush (JObject receiveData) { if (this.dicDeviceEvent.Count == 0) { //没有添加监听 return; } var tempDevice = new CommonDevice() { DeviceAddr = receiveData.Value("DeviceAddr"), DeviceEpoint = receiveData.Value("Epoint") }; tempDevice.IsOnline = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"]["IsOnline"].ToString()); this.DeviceReportPush(tempDevice, ReceiveComandDiv.A设备在线上报); } #endregion #region ■ 布防_______________________________ /// /// 布防推送 /// /// private void SetSafetyGarrisonPush(JObject receiveData) { var data = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"].ToString()); if (data.Result == 0) { var garrison = GarrisonMode.None; //在家布防 if (data.ModeId == 1) { garrison = GarrisonMode.AtHome; } //离家布防 else if (data.ModeId == 2) { garrison = GarrisonMode.RemoveHome; } else { return; } //保存报警信息然后推送到界面上 HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(garrison); if (UserCenterResourse.DicActionForm.ContainsKey("SafetyManagementMainForm") == true) { //推送 var form = (Safety.SafetyManagementMainForm)UserCenterResourse.DicActionForm["SafetyManagementMainForm"]; form?.GarrisonModePush(garrison); } //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } } #endregion #region ■ 撤防_______________________________ /// /// 撤防推送 /// /// private void RemoveSafetyGarrisonPush(JObject receiveData) { var data = Newtonsoft.Json.JsonConvert.DeserializeObject(receiveData["Data"].ToString()); if (data.Result == 0) { //保存报警信息然后推送到界面上 HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(GarrisonMode.RemoveGarrison); if (UserCenterResourse.DicActionForm.ContainsKey("SafetyManagementMainForm") == true) { //推送 var form = (Safety.SafetyManagementMainForm)UserCenterResourse.DicActionForm["SafetyManagementMainForm"]; form?.GarrisonModePush(GarrisonMode.RemoveGarrison); } //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } } #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); if (UserCenterResourse.DicActionForm.ContainsKey("SafetyManagementMainForm") == true) { //推送 var form = (Safety.SafetyManagementMainForm)UserCenterResourse.DicActionForm["SafetyManagementMainForm"]; form?.GarrisonModePush(garrison); } //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } /// /// 通过外部方式布防撤防的接收结果 /// private class SecurityEnOrWithdrawResult { /// /// 0:布防成功 1:撤防成功 /// public int EnOrWithdraw = -1; /// /// 安防模式id /// public int ModeId = -1; /// /// 外部布撤防方式-> 0:执行逻辑动作 1:按键操作 /// public int OperationWay = -1; } #endregion #region ■ 逻辑触发上报_______________________ /// /// 逻辑触发上报 /// /// private void LogicExecutePush(JObject receiveData) { //目前不处理逻辑上报内容 //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } #endregion #region ■ 场景触发上报_______________________ /// /// 场景触发上报 /// /// private void SceneExecPush(JObject receiveData) { //目前不处理场景上报内容 //显示有新消息的特效 this.ShowHadNewMessageAppeal(); } #endregion #region ■ 添加设备事件_______________________ /// /// 添加获取设备属性的事件(推送已经强制指定运行于主线程,属性上报的对象:device.DeviceStatusReport) /// /// 标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况) /// 命令区分 /// /// 当接收到网关回复之后的回调函数 /// 设备属性上报的对象:device.DeviceStatusReport /// 传感器上报的对象:ias.iASInfo /// 设备在线上报的对象:device.IsOnline public void AddAttributeEvent(string mainKeys, ReceiveComandDiv comand, Action action) { lock (this.dicDeviceEvent) { if (this.dicDeviceEvent.ContainsKey(mainKeys) == true) { this.RemoveEvent(mainKeys); } 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, ReceiveComandDiv comand) { if (this.dicDeviceEvent.Count == 0) { //没有添加监听 return; } lock (this.dicDeviceEvent) { var list = new List>(); foreach (string keys in this.dicDeviceEvent.Keys) { if (this.dicCommandDiv[keys] != comand) { //命令区分不一致,则不调用回调函数 continue; } //命令区分一致时,则调用回调函数 list.Add(this.dicDeviceEvent[keys]); } //有可能在回调函数中移除了事件,导致报错,所以先收集,再调用 foreach (var action in list) { Application.RunOnMainThread(() => { try { action?.Invoke(common); } catch (Exception ex) { //Log出力 string msg = "推送错误! 当前激活的界面[" + UserCenterResourse.NowActionFormID + "]"; HdlLogLogic.Current.WriteLog(ex, msg); } }); } } } /// /// 是否存在指定的事件 /// /// /// public bool IsEsixt(string mainkeys) { return this.dicCommandDiv.ContainsKey(mainkeys); } /// /// 显示有新消息的特效 /// private void ShowHadNewMessageAppeal() { //有新消息(特效还在时,不需要再处理) if (ControlCommonResourse.HadNewMessage == false) { HdlThreadLogic.Current.RunMain(() => { for (int i = 0; i < ControlCommonResourse.listMessageManaContr.Count; i++) { //显示角标特效 ControlCommonResourse.listMessageManaContr[i].IsSelected = true; } ControlCommonResourse.HadNewMessage = true; }); } } #endregion } /// /// 接收命令区分 /// public enum ReceiveComandDiv { /// /// 设备属性上报 /// A设备属性上报 = 1, /// /// 传感器上报 /// A传感器上报 = 2, /// /// 设备在线上报 /// A设备在线上报 = 3 } }