using System;
|
using System.Collections.Generic;
|
using System.Text;
|
using Newtonsoft.Json.Linq;
|
using ZigBee.Device;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// 全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作)
|
/// </summary>
|
public class HdlGatewayReceiveLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 全局接收网关推送的的逻辑
|
/// </summary>
|
private static HdlGatewayReceiveLogic m_Current = null;
|
/// <summary>
|
/// 全局接收网关推送的的逻辑
|
/// </summary>
|
public static HdlGatewayReceiveLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlGatewayReceiveLogic();
|
}
|
return m_Current;
|
}
|
}
|
|
/// <summary>
|
/// 设备推送事件集合
|
/// </summary>
|
private Dictionary<string, Action<CommonDevice>> dicDeviceEvent = new Dictionary<string, Action<CommonDevice>>();
|
/// <summary>
|
/// 命令区分
|
/// </summary>
|
private Dictionary<string, ReceiveComandDiv> dicCommandDiv = new Dictionary<string, ReceiveComandDiv>();
|
|
#endregion
|
|
#region ■ 全局接收___________________________
|
|
/// <summary>
|
/// 全局接收网关推送的的逻辑(为了执行速度,尽可能的别加耗时的操作)
|
/// </summary>
|
/// <param name="gatewayId">网关ID</param>
|
/// <param name="topic">整个主题</param>
|
/// <param name="reportTopic">上报数据的主题</param>
|
/// <param name="receiveData">接收的数据</param>
|
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 ■ 设备属性上报_______________________
|
|
/// <summary>
|
/// 设备属性上报
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void DeviceAttributeReportPush(JObject receiveData)
|
{
|
var deviceAddr = receiveData.Value<string>("DeviceAddr");
|
var deviceEpoint = receiveData.Value<int>("Epoint");
|
|
var tempDevice = new CommonDevice { DeviceAddr = deviceAddr, DeviceEpoint = deviceEpoint };
|
tempDevice.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.DeviceStatusReportData>(receiveData["Data"].ToString());
|
|
this.DeviceReportPush(tempDevice, ReceiveComandDiv.A设备属性上报);
|
}
|
|
#endregion
|
|
#region ■ 传感器上报_________________________
|
|
/// <summary>
|
/// 传感器设备上报
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void SensorDeviceReportPush(JObject receiveData)
|
{
|
var ias = new IASZone() { DeviceAddr = receiveData.Value<string>("DeviceAddr"), DeviceEpoint = receiveData.Value<int>("Epoint") };
|
ias.iASInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<IASZone.IASInfoData>(receiveData["Data"].ToString());
|
|
//如果没有添加入安防
|
if (HdlSafeguardLogic.Current.GetZoneIdByIASZone(ias) != -1)
|
{
|
//保存安防报警信息到本地
|
HdlAlarmsLogic.Current.SaveSafeguardAlarmInfo(ias);
|
}
|
|
this.DeviceReportPush(ias, ReceiveComandDiv.A传感器上报);
|
|
//显示有新消息的特效
|
this.ShowHadNewMessageAppeal();
|
}
|
|
#endregion
|
|
#region ■ 门锁上报___________________________
|
|
/// <summary>
|
/// 门锁上报
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void DoorLockDeviceReportPush(JObject receiveData)
|
{
|
//保存门锁信息到本地
|
HdlAlarmsLogic.Current.SaveDoorLockAlarmInfo(receiveData);
|
|
//显示有新消息的特效
|
this.ShowHadNewMessageAppeal();
|
}
|
|
#endregion
|
|
#region ■ 设备在线状态更新反馈_______________
|
|
/// <summary>
|
/// 设备在线状态更新反馈
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void DeviceOnlineChangePush (JObject receiveData)
|
{
|
var tempDevice = new CommonDevice() { DeviceAddr = receiveData.Value<string>("DeviceAddr"), DeviceEpoint = receiveData.Value<int>("Epoint") };
|
tempDevice.IsOnline = Newtonsoft.Json.JsonConvert.DeserializeObject<int>(receiveData["Data"]["IsOnline"].ToString());
|
|
this.DeviceReportPush(tempDevice, ReceiveComandDiv.A设备在线上报);
|
}
|
|
#endregion
|
|
#region ■ 布防_______________________________
|
|
/// <summary>
|
/// 布防推送
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void SetSafetyGarrisonPush(JObject receiveData)
|
{
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Safeguard.EnableModeResponseData>(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 ■ 撤防_______________________________
|
|
/// <summary>
|
/// 撤防推送
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void RemoveSafetyGarrisonPush(JObject receiveData)
|
{
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<Safeguard.WithdrawModeResponseData>(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 ■ 通过外部方式布防撤防_______________
|
|
/// <summary>
|
/// 通过外部方式布防撤防
|
/// </summary>
|
/// <param name="receiveData">接收的数据</param>
|
private void SecurityEnOrWithdrawSucceedReport(JObject receiveData)
|
{
|
var data = Newtonsoft.Json.JsonConvert.DeserializeObject<SecurityEnOrWithdrawResult>(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();
|
}
|
|
/// <summary>
|
/// 通过外部方式布防撤防的接收结果
|
/// </summary>
|
private class SecurityEnOrWithdrawResult
|
{
|
/// <summary>
|
/// 0:布防成功 1:撤防成功
|
/// </summary>
|
public int EnOrWithdraw = -1;
|
/// <summary>
|
/// 安防模式id
|
/// </summary>
|
public int ModeId = -1;
|
/// <summary>
|
/// 外部布撤防方式-> 0:执行逻辑动作 1:按键操作
|
/// </summary>
|
public int OperationWay = -1;
|
}
|
|
#endregion
|
|
#region ■ 逻辑触发上报_______________________
|
|
/// <summary>
|
/// 逻辑触发上报
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void LogicExecutePush(JObject receiveData)
|
{
|
//目前不处理逻辑上报内容
|
|
//显示有新消息的特效
|
this.ShowHadNewMessageAppeal();
|
}
|
|
#endregion
|
|
#region ■ 场景触发上报_______________________
|
|
/// <summary>
|
/// 场景触发上报
|
/// </summary>
|
/// <param name="receiveData"></param>
|
private void SceneExecPush(JObject receiveData)
|
{
|
//目前不处理场景上报内容
|
|
//显示有新消息的特效
|
this.ShowHadNewMessageAppeal();
|
}
|
|
#endregion
|
|
#region ■ 添加设备事件_______________________
|
|
/// <summary>
|
/// 添加获取设备属性的事件(推送已经强制指定运行于主线程,属性上报的对象:device.DeviceStatusReport)
|
/// </summary>
|
/// <param name="mainKeys">标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况)</param>
|
/// <param name="comand">命令区分</param>
|
/// <param name="action">
|
/// <para>当接收到网关回复之后的回调函数</para>
|
/// <para>设备属性上报的对象:device.DeviceStatusReport</para>
|
/// <para>传感器上报的对象:ias.iASInfo</para>
|
/// <para>设备在线上报的对象:device.IsOnline</para></param>
|
public void AddAttributeEvent(string mainKeys, ReceiveComandDiv comand, Action<CommonDevice> action)
|
{
|
lock (this.dicDeviceEvent)
|
{
|
if (this.dicDeviceEvent.ContainsKey(mainKeys) == true)
|
{
|
this.RemoveEvent(mainKeys);
|
}
|
this.dicDeviceEvent[mainKeys] = action;
|
this.dicCommandDiv[mainKeys] = comand;
|
}
|
}
|
|
#endregion
|
|
#region ■ 移除设备监听_______________________
|
|
/// <summary>
|
/// 移除事件
|
/// </summary>
|
/// <param name="mainKeys">标识事件的主键(可以随便填,主要是针对多个界面一起使用的情况)</param>
|
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;
|
}
|
}
|
}
|
|
/// <summary>
|
/// 移除全部的事件
|
/// </summary>
|
public void RemoveAllEvent()
|
{
|
lock (this.dicDeviceEvent)
|
{
|
var list = new HashSet<string>();
|
foreach (var keys in this.dicDeviceEvent.Keys)
|
{
|
list.Add(keys);
|
}
|
foreach (var keys in list)
|
{
|
//需要慢慢一个一个的释放Action,听说
|
this.RemoveEvent(keys);
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 设备上报推送
|
/// </summary>
|
/// <param name="common"></param>
|
/// <param name="comand"></param>
|
private void DeviceReportPush(CommonDevice common, ReceiveComandDiv comand)
|
{
|
lock (this.dicDeviceEvent)
|
{
|
if (this.dicDeviceEvent.Count == 0)
|
{
|
//没有添加监听
|
return;
|
}
|
|
var list = new List<Action<CommonDevice>>();
|
foreach (string keys in this.dicDeviceEvent.Keys)
|
{
|
if (this.dicCommandDiv[keys] != comand)
|
{
|
//命令区分不一致,则不调用回调函数
|
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);
|
}
|
}
|
});
|
}
|
}
|
|
/// <summary>
|
/// 是否存在指定的事件
|
/// </summary>
|
/// <param name="mainkeys"></param>
|
/// <returns></returns>
|
public bool IsEsixt(string mainkeys)
|
{
|
return this.dicCommandDiv.ContainsKey(mainkeys);
|
}
|
|
/// <summary>
|
/// 显示有新消息的特效
|
/// </summary>
|
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
|
}
|
|
/// <summary>
|
/// 接收命令区分
|
/// </summary>
|
public enum ReceiveComandDiv
|
{
|
/// <summary>
|
/// 设备属性上报
|
/// </summary>
|
A设备属性上报 = 1,
|
/// <summary>
|
/// 传感器上报
|
/// </summary>
|
A传感器上报 = 2,
|
/// <summary>
|
/// 设备在线上报
|
/// </summary>
|
A设备在线上报 = 3
|
}
|
}
|