using System;
|
using System.Collections.Generic;
|
using Newtonsoft.Json;
|
using Shared.Common;
|
using ZigBee.Device;
|
|
namespace Shared.Phone
|
{
|
/// <summary>
|
/// 报警类的逻辑
|
/// </summary>
|
public class HdlAlarmsLogic
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 本地安防数据
|
/// </summary>
|
private static HdlAlarmsLogic m_Current = null;
|
/// <summary>
|
/// 本地安防数据
|
/// </summary>
|
public static HdlAlarmsLogic Current
|
{
|
get
|
{
|
if (m_Current == null)
|
{
|
m_Current = new HdlAlarmsLogic();
|
}
|
return m_Current;
|
}
|
}
|
|
/// <summary>
|
/// 安防上报信息
|
/// </summary>
|
public List<SafeguardAlarmInfo> listSafetyAlarmInfo = new List<SafeguardAlarmInfo>();
|
/// <summary>
|
/// 门锁上报信息
|
/// </summary>
|
public List<DeviceAlarmInfo> listDoorLockAlarmInfo = new List<DeviceAlarmInfo>();
|
/// <summary>
|
/// 上一次安防上报信息保存的文件名字(考虑到用户有可能24点的时候,不退出APP)
|
/// </summary>
|
private string oldDeviceAlarmFile = string.Empty;
|
|
#endregion
|
|
#region ■ 重新刷新报警信息___________________
|
|
/// <summary>
|
/// 重新刷新报警信息
|
/// </summary>
|
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<List<SafeguardAlarmInfo>>(System.Text.Encoding.UTF8.GetString(data1));
|
if (this.listSafetyAlarmInfo == null)
|
{
|
this.listSafetyAlarmInfo = new List<SafeguardAlarmInfo>();
|
}
|
}
|
|
//门锁记录
|
fullName = System.IO.Path.Combine(HdlFileNameResourse.DoorLockAlarmDirectory, fileName);
|
var data2 = HdlFileLogic.Current.ReadFileByteContent(fullName);
|
if (data2 != null)
|
{
|
this.listDoorLockAlarmInfo = JsonConvert.DeserializeObject<List<DeviceAlarmInfo>>(System.Text.Encoding.UTF8.GetString(data2));
|
if (this.listDoorLockAlarmInfo == null)
|
{
|
this.listDoorLockAlarmInfo = new List<DeviceAlarmInfo>();
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 安防报警保存_______________________
|
|
/// <summary>
|
/// 保存安防报警信息到本地
|
/// </summary>
|
/// <param name="device"></param>
|
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;
|
}
|
}
|
|
/// <summary>
|
/// 保存布防操作信息到本地
|
/// </summary>
|
/// <param name="garrison">布防模式</param>
|
/// <param name="appendText">附加文本</param>
|
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);
|
}
|
}
|
|
/// <summary>
|
/// 获取保存安防信息的文件名字
|
/// </summary>
|
/// <returns></returns>
|
private string GetSafeguardAlarmFileName()
|
{
|
string fileName = DateTime.Now.ToString("yyyyMMdd");
|
if (fileName != oldDeviceAlarmFile)
|
{
|
//考虑到用户有可能24点的时候不退出APP,这个时候直接刷新
|
this.RefreshAlarmInfo();
|
}
|
oldDeviceAlarmFile = fileName;
|
return fileName;
|
}
|
|
/// <summary>
|
/// 获取本地记录的安防报警信息
|
/// </summary>
|
/// <returns></returns>
|
public Dictionary<string, List<SafeguardAlarmInfo>> GetSafeguardAlarmInfo()
|
{
|
lock (listSafetyAlarmInfo)
|
{
|
string fullPath = HdlFileNameResourse.SafeguardAlarmDirectory;
|
//获取指定目录下面的文件
|
List<string> listFile = HdlFileLogic.Current.GetFileFromDirectory(fullPath);
|
//升序
|
listFile.Sort();
|
var dic = new Dictionary<string, List<SafeguardAlarmInfo>>();
|
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<List<SafeguardAlarmInfo>>(System.Text.Encoding.UTF8.GetString(data));
|
if (info == null)
|
{
|
continue;
|
}
|
var listInfo = new List<SafeguardAlarmInfo>();
|
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 ■ 传感器报警的信息翻译文本___________
|
|
/// <summary>
|
/// 获取传感器报警的信息翻译文本(返回null则表示没有达成报警条件,停止报警则返回空字符串)
|
/// </summary>
|
/// <param name="i_device"></param>
|
/// <returns></returns>
|
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;
|
}
|
|
/// <summary>
|
/// 获取单个Json数据里面,包含的全部报警信息条数
|
/// </summary>
|
/// <param name="alarmInfo"></param>
|
/// <returns></returns>
|
public List<string> GetSensorListAlarmMsg(SafeguardAlarmInfo alarmInfo)
|
{
|
var listMsg = new List<string>();
|
//一条信息里面,它可能包含多个报警
|
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 ■ 门锁报警保存_______________________
|
|
/// <summary>
|
/// 保存门锁报警信息到本地
|
/// </summary>
|
/// <param name="jobject"></param>
|
public bool SaveDoorLockAlarmInfo(Newtonsoft.Json.Linq.JObject jobject)
|
{
|
var device = HdlDeviceCommonLogic.Current.GetDevice(jobject.Value<string>("DeviceAddr"), jobject.Value<int>("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;
|
}
|
}
|
|
/// <summary>
|
/// 获取本地记录的门锁报警信息
|
/// </summary>
|
/// <returns></returns>
|
public Dictionary<string, List<DeviceAlarmInfo>> GetAllDoorLockAlarmInfo()
|
{
|
lock (listDoorLockAlarmInfo)
|
{
|
string fullPath = HdlFileNameResourse.DoorLockAlarmDirectory;
|
//获取指定目录下面的文件
|
List<string> listFile = HdlFileLogic.Current.GetFileFromDirectory(fullPath);
|
//升序
|
listFile.Sort();
|
var dic = new Dictionary<string, List<DeviceAlarmInfo>>();
|
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<List<DeviceAlarmInfo>>(System.Text.Encoding.UTF8.GetString(data));
|
if (info == null)
|
{
|
continue;
|
}
|
var listInfo = new List<DeviceAlarmInfo>();
|
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 ■ 门锁报警的信息翻译文本_____________
|
|
/// <summary>
|
/// 获取门锁报警的信息翻译文本(返回null则表示条件未达成)
|
/// </summary>
|
/// <param name="jobject"></param>
|
/// <returns></returns>
|
public DeviceAlarmInfo GetDoorLockAlarmInfo(Newtonsoft.Json.Linq.JObject jobject)
|
{
|
var info = JsonConvert.DeserializeObject<DoorLockAlarmsResult>(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 ■ 一般方法___________________________
|
|
/// <summary>
|
/// 获取报警信息的文件名字
|
/// </summary>
|
/// <returns></returns>
|
private string GetAlarmFileName()
|
{
|
string fileName = DateTime.Now.ToString("yyyyMMdd");
|
if (fileName != oldDeviceAlarmFile)
|
{
|
//考虑到用户有可能24点的时候不退出APP,这个时候直接刷新
|
this.RefreshAlarmInfo();
|
}
|
oldDeviceAlarmFile = fileName;
|
return fileName;
|
}
|
|
#endregion
|
}
|
}
|