using System; using System.Collections.Generic; using Newtonsoft.Json; using Shared.Common; using ZigBee.Device; namespace Shared.Phone { /// /// 报警类的逻辑 /// public class HdlAlarmsLogic { #region ■ 变量声明___________________________ /// /// 本地安防数据 /// private static HdlAlarmsLogic m_Current = null; /// /// 本地安防数据 /// public static HdlAlarmsLogic Current { get { if (m_Current == null) { m_Current = new HdlAlarmsLogic(); } return m_Current; } } /// /// 安防上报信息 /// public List listSafetyAlarmInfo = new List(); /// /// 门锁上报信息 /// public List listDoorLockAlarmInfo = new List(); /// /// 上一次安防上报信息保存的文件名字(考虑到用户有可能24点的时候,不退出APP) /// private string oldDeviceAlarmFile = string.Empty; #endregion #region ■ 重新刷新报警信息___________________ /// /// 重新刷新报警信息 /// public void RefreshAlarmInfo() { this.listSafetyAlarmInfo.Clear(); this.listDoorLockAlarmInfo.Clear(); string fileName = DateTime.Now.ToString("yyyyMMdd"); //安防报警 string fullName = System.IO.Path.Combine(HdlFileNameResourse.SafeguardAlarmDirectory, fileName); var data1 = HdlFileLogic.Current.ReadFileByteContent(fullName); if (data1 != null) { this.listSafetyAlarmInfo = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data1)); if (this.listSafetyAlarmInfo == null) { this.listSafetyAlarmInfo = new List(); } } //门锁记录 fullName = System.IO.Path.Combine(HdlFileNameResourse.DoorLockAlarmDirectory, fileName); var data2 = HdlFileLogic.Current.ReadFileByteContent(fullName); if (data2 != null) { this.listDoorLockAlarmInfo = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data2)); if (this.listDoorLockAlarmInfo == null) { this.listDoorLockAlarmInfo = new List(); } } } #endregion #region ■ 安防报警保存_______________________ /// /// 保存安防报警信息到本地 /// /// public bool SaveSafeguardAlarmInfo(CommonDevice device) { int ZoneId = HdlSafeguardLogic.Current.GetZoneIdByIASZone(device); if (ZoneId == -1) { //这个传感器不存在于任何防区 return false; } var msgInfo = this.GetSensorAlarmInfo(device); if (msgInfo == null) { //异常?? return false; } lock (listSafetyAlarmInfo) { //获取保存安防信息的文件名字 string fileName = this.GetSafeguardAlarmFileName(); var data = new SafeguardAlarmInfo(); data.AlarmType = SafeguardAlarmType.Sensor; data.ZoneId = ZoneId; data.DeviceAddr = device.DeviceAddr; data.DeviceEpoint = device.DeviceEpoint; data.DeviceName = device.DeviceName; data.Time = DateTime.Now.ToString("HH:mm:ss"); data.RoomName = HdlRoomLogic.Current.GetRoomNameByDevice(device); //报警结束 data.AlarmMsg = msgInfo.AlarmMsg != string.Empty ? msgInfo.AlarmMsg : Language.StringByID(R.MyInternationalizationString.uAlarmFinish); //电池报警 data.BatteryMsg = msgInfo.BatteryMsg; //被拆报警 data.DemolishmentMsg = msgInfo.DemolishmenMsg; //限制它的长度 this.listSafetyAlarmInfo.Insert(0, data); if (this.listSafetyAlarmInfo.Count > HdlUserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount) { this.listSafetyAlarmInfo.RemoveAt(this.listSafetyAlarmInfo.Count - 1); } //保存到本地 string fullName = System.IO.Path.Combine(HdlFileNameResourse.SafeguardAlarmDirectory, fileName); HdlFileLogic.Current.SaveFileContent(fullName, this.listSafetyAlarmInfo); var form = HdlFormLogic.Current.GetFormByName("SafetyManagementMainForm"); if (form != null) { ((UserCenter.Safety.SafetyManagementMainForm)form).AddSafeguardLogPushRow(device); } return true; } } /// /// 保存布防操作信息到本地 /// /// 布防模式 /// 附加文本 public void SaveSafeguardAlarmInfo(GarrisonMode garrison, string appendText = "") { if (garrison == GarrisonMode.None) { return; } lock (listSafetyAlarmInfo) { //获取保存安防信息的文件名字 string fileName = this.GetSafeguardAlarmFileName(); var data = new SafeguardAlarmInfo(); data.Time = DateTime.Now.ToString("HH:mm:ss"); data.AlarmType = SafeguardAlarmType.None; if (garrison == GarrisonMode.AtHome) { data.AlarmType = SafeguardAlarmType.AtHome; //没有内部防区 if (HdlSafeguardLogic.Current.IsHadInternalDefenseArea() == false) { //布防已执行 data.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uExecuteGarrison); } else { //在家布防已执行 data.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uExecuteAtHomeGarrison); } } else if (garrison == GarrisonMode.RemoveHome) { //离家布防已执行 data.AlarmType = SafeguardAlarmType.RemoveHome; data.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uExecuteRemoveHomeGarrison); } else if (garrison == GarrisonMode.RemoveGarrison) { //撤防已执行 data.AlarmType = SafeguardAlarmType.RemoveGarrison; data.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uExecuteWithdrawGarrison); } else { return; } //添加附加文本 data.AlarmMsg = data.AlarmMsg + appendText; //限制它的长度 this.listSafetyAlarmInfo.Insert(0, data); if (this.listSafetyAlarmInfo.Count > HdlUserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount) { this.listSafetyAlarmInfo.RemoveAt(this.listSafetyAlarmInfo.Count - 1); } //保存到本地 string fullName = System.IO.Path.Combine(HdlFileNameResourse.SafeguardAlarmDirectory, fileName); HdlFileLogic.Current.SaveFileContent(fullName, this.listSafetyAlarmInfo); } } /// /// 获取保存安防信息的文件名字 /// /// private string GetSafeguardAlarmFileName() { string fileName = DateTime.Now.ToString("yyyyMMdd"); if (fileName != oldDeviceAlarmFile) { //考虑到用户有可能24点的时候不退出APP,这个时候直接刷新 this.RefreshAlarmInfo(); } oldDeviceAlarmFile = fileName; return fileName; } /// /// 获取本地记录的安防报警信息 /// /// public Dictionary> GetSafeguardAlarmInfo() { lock (listSafetyAlarmInfo) { string fullPath = HdlFileNameResourse.SafeguardAlarmDirectory; //获取指定目录下面的文件 List listFile = HdlFileLogic.Current.GetFileFromDirectory(fullPath); //升序 listFile.Sort(); var dic = new Dictionary>(); for (int i = listFile.Count - 1; i >= 0; i--) { var data = HdlFileLogic.Current.ReadFileByteContent(System.IO.Path.Combine(fullPath, listFile[i])); var info = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data)); if (info == null) { continue; } var listInfo = new List(); for (int j = 0; j < info.Count; j++) { if (j == HdlUserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount) { //每天最多三十条数据 break; } listInfo.Add(info[j]); } dic[listFile[i]] = listInfo; if (dic.Count == HdlUserCenterResourse.ResidenceOption.SafetyMaxAlarmMsgDay) { //只要三天的量 break; } } return dic; } } #endregion #region ■ 传感器报警的信息翻译文本___________ /// /// 获取传感器报警的信息翻译文本(返回null则表示没有达成报警条件,停止报警则返回空字符串) /// /// /// public IASZoneReportInfo GetSensorAlarmInfo(CommonDevice i_device) { //IAS安防信息上报 if ((i_device is IASZone) == false) { return null; } string mainkey = HdlDeviceCommonLogic.Current.GetDeviceMainKeys(i_device); //因为推送的是虚拟的设备,所以去获取真实物理设备 CommonDevice device = HdlDeviceCommonLogic.Current.GetDevice(mainkey); if (device == null) { return null; } IASZone iASZone = (IASZone)i_device; if (iASZone.iASInfo == null) { return null; } var alarmInfo = new IASZoneReportInfo(); if (iASZone.iASInfo.Battery == 1) { //电池电量低 alarmInfo.BatteryMsg = Language.StringByID(R.MyInternationalizationString.uLowElectricityConsumption); } if (iASZone.iASInfo.Tamper == 1) { //设备被拆除 alarmInfo.DemolishmenMsg = Language.StringByID(R.MyInternationalizationString.uDeviceWasDismantled); } //运动传感器 if (device.IasDeviceType == 13 || device.IasDeviceType == 541) { if (iASZone.iASInfo.Alarm1 == 1) { //有人经过 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uHadUnKnowObjectPassed); } } //烟雾传感器 else if (device.IasDeviceType == 40) { if (iASZone.iASInfo.Alarm1 == 1) { //烟雾报警 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uSmogAlarm); } } //水侵传感器 else if (device.IasDeviceType == 42) { if (iASZone.iASInfo.Alarm1 == 1) { //检测到漏水 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uWaterLeakageDetection); } } //燃气传感器 else if (device.IasDeviceType == 43) { if (iASZone.iASInfo.Alarm1 == 1) { //燃气泄漏 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uCarbonMonoxideRevealed); } } //紧急按钮 else if (device.IasDeviceType == 44) { //紧急按钮 if (iASZone.iASInfo.Alarm1 == 1) { //紧急按钮被按下 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uEmergencyButtonPressdown); } } //钥匙扣 else if (device.IasDeviceType == 277) { if (iASZone.iASInfo.Alarm1 == 1) { //钥匙扣触发报警 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uKeyFobAlarm); } } //门窗传感器 else if (device.IasDeviceType == 21 || device.IasDeviceType == 22) { if (iASZone.iASInfo.Alarm1 == 1) { //门窗被打开 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorOrWindowHadBeenOpen); } else { //门窗已关闭 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorOrWindowHadClosed); } } else { //传感器 if (iASZone.iASInfo.Alarm1 == 1) { //触发传感器报警 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uSensorAlarmHadTriggered); } } return alarmInfo; } /// /// 获取单个Json数据里面,包含的全部报警信息条数 /// /// /// public List GetSensorListAlarmMsg(SafeguardAlarmInfo alarmInfo) { var listMsg = new List(); //一条信息里面,它可能包含多个报警 if (string.IsNullOrEmpty(alarmInfo.AlarmMsg) == false) { //报警信息 listMsg.Add(alarmInfo.AlarmMsg); } if (alarmInfo.BatteryMsg != null) { //电池电量 listMsg.Add(alarmInfo.BatteryMsg); } if (alarmInfo.DemolishmentMsg != null) { //被拆报警 listMsg.Add(alarmInfo.DemolishmentMsg); } return listMsg; } #endregion #region ■ 门锁报警保存_______________________ /// /// 保存门锁报警信息到本地 /// /// public bool SaveDoorLockAlarmInfo(Newtonsoft.Json.Linq.JObject jobject) { var device = HdlDeviceCommonLogic.Current.GetDevice(jobject.Value("DeviceAddr"), jobject.Value("Epoint")); if ((device is ZigBee.Device.DoorLock) == false) { //它不是门锁 return false; } var msgInfo = this.GetDoorLockAlarmInfo(jobject); if (msgInfo == null) { //异常?? return false; } lock (listDoorLockAlarmInfo) { //获取保存安防信息的文件名字 string fileName = this.GetSafeguardAlarmFileName(); msgInfo.DeviceAddr = device.DeviceAddr; msgInfo.DeviceEpoint = device.DeviceEpoint; msgInfo.DeviceName = device.DeviceName; msgInfo.Time = DateTime.Now.ToString("HH:mm:ss"); msgInfo.RoomName = HdlRoomLogic.Current.GetRoomNameByDevice(device); //限制它的长度 this.listDoorLockAlarmInfo.Insert(0, msgInfo); if (this.listDoorLockAlarmInfo.Count > HdlUserCenterResourse.ResidenceOption.DoorLockOnedayMaxAlarmMsgCount) { this.listDoorLockAlarmInfo.RemoveAt(this.listDoorLockAlarmInfo.Count - 1); } //保存到本地 string fullName = System.IO.Path.Combine(HdlFileNameResourse.DoorLockAlarmDirectory, fileName); HdlFileLogic.Current.SaveFileContent(fullName, this.listDoorLockAlarmInfo); return true; } } /// /// 获取本地记录的门锁报警信息 /// /// public Dictionary> GetAllDoorLockAlarmInfo() { lock (listDoorLockAlarmInfo) { string fullPath = HdlFileNameResourse.DoorLockAlarmDirectory; //获取指定目录下面的文件 List listFile = HdlFileLogic.Current.GetFileFromDirectory(fullPath); //升序 listFile.Sort(); var dic = new Dictionary>(); for (int i = listFile.Count - 1; i >= 0; i--) { var data = HdlFileLogic.Current.ReadFileByteContent(System.IO.Path.Combine(fullPath, listFile[i])); var info = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data)); if (info == null) { continue; } var listInfo = new List(); for (int j = 0; j < info.Count; j++) { if (j == HdlUserCenterResourse.ResidenceOption.DoorLockOnedayMaxAlarmMsgCount) { //每天最多三十条数据 break; } listInfo.Add(info[j]); } dic[listFile[i]] = listInfo; if (dic.Count == HdlUserCenterResourse.ResidenceOption.DoorLockMaxAlarmMsgDay) { //只要三天的量 break; } } return dic; } } #endregion #region ■ 门锁报警的信息翻译文本_____________ /// /// 获取门锁报警的信息翻译文本(返回null则表示条件未达成) /// /// /// public DeviceAlarmInfo GetDoorLockAlarmInfo(Newtonsoft.Json.Linq.JObject jobject) { var info = JsonConvert.DeserializeObject(jobject["Data"].ToString()); var alarmInfo = new DeviceAlarmInfo(); if (info.Clusterid == 1) { if (info.AlarmCode == 16) { //电池电量低 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uLowElectricityConsumption); } } else if(info.Clusterid == 257) { if (info.AlarmCode == 0) { //门栓堵塞 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg1); } else if (info.AlarmCode == 1) { //门锁恢复出厂设置 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg2); } else if (info.AlarmCode == 3) { //模块更换电池 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg3); } else if (info.AlarmCode == 4) { //错误尝试开锁警报 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg4); } else if (info.AlarmCode == 6) { //暴力开门 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg5); } else if (info.AlarmCode == 216) { //常开模式开启(门锁触发) alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg6); alarmInfo.MsgDiv = 9000; } else if (info.AlarmCode == 217) { //常开模式结束(门锁触发) alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg7); alarmInfo.MsgDiv = 9000; } else if (info.AlarmCode == 218) { //常开模式开启(网关触发) alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg9); alarmInfo.MsgDiv = 9000; } else if (info.AlarmCode == 219) { //常开模式结束(网关触发) alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg10); alarmInfo.MsgDiv = 9000; } else if (info.AlarmCode == 232) { //有人访问 alarmInfo.AlarmMsg = Language.StringByID(R.MyInternationalizationString.uDoorLockAlarmMsg8); } } return alarmInfo.AlarmMsg == string.Empty ? null : alarmInfo; } #endregion #region ■ 一般方法___________________________ /// /// 获取报警信息的文件名字 /// /// private string GetAlarmFileName() { string fileName = DateTime.Now.ToString("yyyyMMdd"); if (fileName != oldDeviceAlarmFile) { //考虑到用户有可能24点的时候不退出APP,这个时候直接刷新 this.RefreshAlarmInfo(); } oldDeviceAlarmFile = fileName; return fileName; } #endregion } }