using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Shared.Common;
using ZigBee.Device;
namespace Shared.Phone.UserCenter
{
///
/// 报警类的逻辑
///
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 = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory, fileName);
if (System.IO.File.Exists(fullName) == true)
{
lock (listSafetyAlarmInfo)
{
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory);
var data = Global.ReadFileByDirectory(dir, fileName);
this.listSafetyAlarmInfo = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data));
if (this.listSafetyAlarmInfo == null)
{
this.listSafetyAlarmInfo = new List();
}
}
}
//门锁记录
fullName = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DoorLockAlarmDirectory, fileName);
if (System.IO.File.Exists(fullName) == true)
{
lock (listDoorLockAlarmInfo)
{
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DoorLockAlarmDirectory);
var data = Global.ReadFileByDirectory(dir, fileName);
this.listDoorLockAlarmInfo = JsonConvert.DeserializeObject>(System.Text.Encoding.UTF8.GetString(data));
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 > UserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount)
{
this.listSafetyAlarmInfo.RemoveAt(this.listSafetyAlarmInfo.Count - 1);
}
//保存到本地
var saveData = JsonConvert.SerializeObject(this.listSafetyAlarmInfo);
var byteData = System.Text.Encoding.UTF8.GetBytes(saveData);
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory);
Global.WriteFileToDirectoryByBytes(dir, fileName, byteData);
if (UserCenterResourse.DicActionForm.ContainsKey("SafetyManagementMainForm") == true)
{
var form = (Phone.UserCenter.Safety.SafetyManagementMainForm)UserCenterResourse.DicActionForm["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 > UserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount)
{
this.listSafetyAlarmInfo.RemoveAt(this.listSafetyAlarmInfo.Count - 1);
}
//保存到本地
var saveData = JsonConvert.SerializeObject(this.listSafetyAlarmInfo);
var byteData = System.Text.Encoding.UTF8.GetBytes(saveData);
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory);
Global.WriteFileToDirectoryByBytes(dir, fileName, byteData);
}
}
///
/// 获取保存安防信息的文件名字
///
///
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 = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory);
//借用一下自动备份获取指定目录下面的文件的函数
List listFile = HdlAutoBackupLogic.GetFileFromDirectory(fullPath);
//升序
listFile.Sort();
var dic = new Dictionary>();
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.SafeguardAlarmDirectory);
for (int i = listFile.Count - 1; i >= 0; i--)
{
var data = Global.ReadFileByDirectory(dir, 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 == UserCenterResourse.ResidenceOption.SafetyOnedayMaxAlarmMsgCount)
{
//每天最多三十条数据
break;
}
listInfo.Add(info[j]);
}
dic[listFile[i]] = listInfo;
if (dic.Count == UserCenterResourse.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 = Common.LocalDevice.Current.GetDeviceMainKeys(i_device);
//因为推送的是虚拟的设备,所以去获取真实物理设备
CommonDevice device = Common.LocalDevice.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 = Common.LocalDevice.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 > UserCenterResourse.ResidenceOption.DoorLockOnedayMaxAlarmMsgCount)
{
this.listDoorLockAlarmInfo.RemoveAt(this.listDoorLockAlarmInfo.Count - 1);
}
//保存到本地
var saveData = JsonConvert.SerializeObject(this.listDoorLockAlarmInfo);
var byteData = System.Text.Encoding.UTF8.GetBytes(saveData);
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DoorLockAlarmDirectory);
Global.WriteFileToDirectoryByBytes(dir, fileName, byteData);
return true;
}
}
///
/// 获取本地记录的门锁报警信息
///
///
public Dictionary> GetAllDoorLockAlarmInfo()
{
lock (listDoorLockAlarmInfo)
{
string fullPath = UserCenterLogic.CombinePath(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DoorLockAlarmDirectory);
//借用一下自动备份获取指定目录下面的文件的函数
List listFile = HdlAutoBackupLogic.GetFileFromDirectory(fullPath);
//升序
listFile.Sort();
var dic = new Dictionary>();
string dir = System.IO.Path.Combine(DirNameResourse.LocalMemoryDirectory, DirNameResourse.DoorLockAlarmDirectory);
for (int i = listFile.Count - 1; i >= 0; i--)
{
var data = Global.ReadFileByDirectory(dir, 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 == UserCenterResourse.ResidenceOption.DoorLockOnedayMaxAlarmMsgCount)
{
//每天最多三十条数据
break;
}
listInfo.Add(info[j]);
}
dic[listFile[i]] = listInfo;
if (dic.Count == UserCenterResourse.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
}
}