| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | |
| | | |
| | | namespace ZigBee.Device |
| | | { |
| | | public class DoorLock : CommonDevice |
| | | public class DoorLock : Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo |
| | | { |
| | | public DoorLock() |
| | | { |
| | |
| | | public static string RemoteUnlockPassword = string.Empty;//远程开锁密码 |
| | | public static DateTime maxValue = DateTime.MaxValue; |
| | | public static DateTime minValue = DateTime.MinValue; |
| | | public string LocalTempPassword = string.Empty;//本地生成的临时密码 |
| | | |
| | | #region 临时密码信息 |
| | | /// <summary> |
| | | /// 门锁编程事件通知 |
| | | /// 用户管理发送数据回复 |
| | | /// </summary> |
| | | public TempPasswordObject tempPasswordObject; |
| | | /// <summary> |
| | | /// 临时密码本地对象 |
| | | /// </summary> |
| | | [System.Serializable] |
| | | public class LocaDoorLockObj |
| | | public class TempPasswordObject |
| | | { |
| | | /// <summary> |
| | | /// 用户id |
| | | ///门锁本地录入的密码、指纹、感应卡都有唯一对应的用户Id |
| | | /// 临时密码ID |
| | | /// </summary> |
| | | public int UserID; |
| | | /// <summary> |
| | | /// 开锁类型 |
| | | /// 常用: |
| | | /// 0:Keypad(键盘/密码);3:RFID(射频卡);15:指纹 |
| | | ///不常用: |
| | | /// 1:RF(Zigbee无线);2:Manual(手动);255:Indeterminate(不确定) |
| | | /// </summary> |
| | | public int UnlockType; |
| | | /// <summary> |
| | | /// 关联账户的ID |
| | | /// </summary> |
| | | public string ConnectedAccount = string.Empty; |
| | | /// <summary> |
| | | /// 门锁用户名 |
| | | /// </summary> |
| | | public string UserName = string.Empty; |
| | | /// <summary> |
| | | /// 门锁录入的时 |
| | | /// </summary> |
| | | public DateTime EntryTime = System.DateTime.MinValue; |
| | | public int UserId; |
| | | /// <summary> |
| | | /// PrimaryId 门锁云端主 键(非更新字段,以下均为更新字段) -->键名 : PrimaryId默认值: null |
| | | /// </summary> |
| | | public string PrimaryId = ""; |
| | | //public string PrimaryId; |
| | | /// <summary> |
| | | /// 6位有动态临时密码 |
| | | /// </summary> |
| | | public string TempPassword; |
| | | /// <summary> |
| | | /// 门锁有效时间 |
| | | /// </summary> |
| | | public DateTime ValidTime; |
| | | /// <summary> |
| | | /// 门锁失效时间 |
| | | /// </summary> |
| | | public DateTime InValidTime; |
| | | } |
| | | #endregion |
| | | |
| | | #endregion |
| | | |
| | |
| | | /// 门锁本地用户Id -->键名 : DoorLockLocalUserId |
| | | /// </summary> |
| | | public string DoorLockLocalUserId = ""; |
| | | |
| | | /// <summary> |
| | | /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl |
| | | /// </summary> |
| | | public bool IsOtherAccountCtrl = false; |
| | | } |
| | | #endregion |
| | | |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region 添加门锁临时密码 |
| | | /// <summary> |
| | | /// 添加门锁 |
| | | /// </summary> |
| | | public class AddDoorLockTempPasswordData |
| | | { |
| | | /// <summary> |
| | | /// RequestVersion |
| | | /// </summary> |
| | | public string RequestVersion = Shared.Common.CommonPage.RequestVersion; |
| | | /// <summary> |
| | | /// LoginAccessToken |
| | | /// </summary> |
| | | public string LoginAccessToken = Shared.Common.Config.Instance.Token; |
| | | /// <summary> |
| | | /// 住宅Id -->键名 : HomeId |
| | | /// </summary> |
| | | public string HomeId = Shared.Common.Config.Instance.HomeId; |
| | | /// <summary> |
| | | /// 门锁Id -->键名 : DoorLockId |
| | | /// </summary> |
| | | public string LocalDoorLockId = ""; |
| | | /// <summary> |
| | | /// 临时密码Id -->键名 : TempPwdId |
| | | /// </summary> |
| | | public string TempPwdId = ""; |
| | | /// <summary> |
| | | /// 临时密码 -->键名 : TempPwd |
| | | /// </summary> |
| | | public string TempPwd = ""; |
| | | /// <summary> |
| | | /// 0:00:00] ValidBeginTime 有效开始时间 -->键名 : ValidBeginTime 默认值: 0001/1/1 |
| | | /// </summary> |
| | | public DateTime ValidBeginTime; |
| | | /// <summary> |
| | | /// 0:00:00] ValidEndTime 有效结束时间 -->键名 : ValidEndTime |
| | | /// </summary> |
| | | public DateTime ValidEndTime; |
| | | /// <summary> |
| | | /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl |
| | | /// </summary> |
| | | public bool IsOtherAccountCtrl = false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 添加门锁结果 |
| | | /// </summary> |
| | | public class AddDoorLockTempPasswordDataRes : AddDoorLockDataRes |
| | | { |
| | | } |
| | | #endregion |
| | | |
| | | #region 删除门锁临时密码 |
| | | /// <summary> |
| | | /// 删除门锁 |
| | | /// </summary> |
| | | public class DelDoorLockTempPasswordData |
| | | { |
| | | /// <summary> |
| | | /// RequestVersion |
| | | /// </summary> |
| | | public string RequestVersion = Shared.Common.CommonPage.RequestVersion; |
| | | /// <summary> |
| | | /// LoginAccessToken |
| | | /// </summary> |
| | | public string LoginAccessToken = Shared.Common.Config.Instance.Token; |
| | | /// <summary> |
| | | /// 住宅Id -->键名 : HomeId |
| | | /// </summary> |
| | | public string HomeId = Shared.Common.Config.Instance.HomeId; |
| | | /// <summary> |
| | | /// LocalDoorLockId 搜索本地门锁Id -->键名 : LocalDoorLockId 默认值: null |
| | | /// </summary> |
| | | public string LocalDoorLockId = ""; |
| | | /// <summary> |
| | | /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl |
| | | /// </summary> |
| | | public bool IsOtherAccountCtrl = false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 删除门锁结果 |
| | | /// </summary> |
| | | public class DelDoorLockTempPasswordDataRes : AddDoorLockDataRes |
| | | { |
| | | } |
| | | #endregion |
| | | |
| | | #region 更新门锁临时密码 |
| | | /// <summary> |
| | | /// 更新门锁 |
| | | /// </summary> |
| | | public class ModifyDoorLockTempPasswordData |
| | | { |
| | | /// <summary> |
| | | /// RequestVersion |
| | | /// </summary> |
| | | public string RequestVersion = Shared.Common.CommonPage.RequestVersion; |
| | | /// <summary> |
| | | /// LoginAccessToken |
| | | /// </summary> |
| | | public string LoginAccessToken = Shared.Common.Config.Instance.Token; |
| | | /// <summary> |
| | | /// 住宅Id -->键名 : HomeId |
| | | /// </summary> |
| | | public string HomeId = Shared.Common.Config.Instance.HomeId; |
| | | /// <summary> |
| | | /// 门锁密码主键(获取门锁密码分页中的Id) -->键名 : DoorLockPwdId |
| | | /// </summary> |
| | | public string DoorLockPwdId = ""; |
| | | /// <summary> |
| | | /// 门锁Id -->键名 : DoorLockId |
| | | /// </summary> |
| | | public string LocalDoorLockId = ""; |
| | | /// <summary> |
| | | /// 临时密码Id -->键名 : TempPwdId |
| | | /// </summary> |
| | | public string TempPwdId = ""; |
| | | /// <summary> |
| | | /// 临时密码 -->键名 : TempPwd |
| | | /// </summary> |
| | | public string TempPwd = ""; |
| | | /// <summary> |
| | | /// 0:00:00] ValidBeginTime 有效开始时间 -->键名 : ValidBeginTime 默认值: 0001/1/1 |
| | | /// </summary> |
| | | public DateTime ValidBeginTime; |
| | | /// <summary> |
| | | /// 0:00:00] ValidEndTime 有效结束时间 -->键名 : ValidEndTime |
| | | /// </summary> |
| | | public DateTime ValidEndTime; |
| | | /// <summary> |
| | | /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl |
| | | /// </summary> |
| | | public bool IsOtherAccountCtrl = false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 添加门锁结果 |
| | | /// </summary> |
| | | public class ModigDoorLockTempPasswordDataRes : AddDoorLockDataRes |
| | | { |
| | | } |
| | | #endregion |
| | | |
| | | #region 获取门锁临时密码 |
| | | /// <summary> |
| | | /// 获取门锁 |
| | | /// </summary> |
| | | public class GetDoorLockTempPasswordData |
| | | { |
| | | /// <summary> |
| | | /// RequestVersion |
| | | /// </summary> |
| | | public string RequestVersion = Shared.Common.CommonPage.RequestVersion; |
| | | /// <summary> |
| | | /// LoginAccessToken |
| | | /// </summary> |
| | | public string LoginAccessToken = Shared.Common.Config.Instance.Token; |
| | | /// <summary> |
| | | /// 住宅Id -->键名 : HomeId |
| | | /// </summary> |
| | | public string HomeId = Shared.Common.Config.Instance.HomeId; |
| | | /// <summary> |
| | | /// 门锁Id -->键名 : DoorLockId |
| | | /// </summary> |
| | | public string LocalDoorLockId = ""; |
| | | /// <summary> |
| | | /// 临时密码Id -->键名 : TempPwdId |
| | | /// </summary> |
| | | public string TempPwdId = ""; |
| | | /// <summary> |
| | | /// 临时密码 -->键名 : TempPwd |
| | | /// </summary> |
| | | public string TempPwd = ""; |
| | | /// <summary> |
| | | /// 0:00:00] ValidBeginTime 有效开始时间 -->键名 : ValidBeginTime 默认值: 0001/1/1 |
| | | /// </summary> |
| | | public DateTime? ValidBeginTime; |
| | | /// <summary> |
| | | /// 0:00:00] ValidEndTime 有效结束时间 -->键名 : ValidEndTime |
| | | /// </summary> |
| | | public DateTime? ValidEndTime; |
| | | /// <summary> |
| | | /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl |
| | | /// </summary> |
| | | public bool IsOtherAccountCtrl = false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取门锁临时密码结果 |
| | | /// </summary> |
| | | [Serializable] |
| | | public class GetDoorLockTempPasswordDataRes |
| | | { |
| | | public List<CloudDoorLockTempPasswordObj> PageData = new List<CloudDoorLockTempPasswordObj>(); |
| | | public int PageIndex; |
| | | public int PageSize; |
| | | public int TotalCount; |
| | | public int TotalPages; |
| | | public bool HasPreviousPage; |
| | | public bool HasNextPage; |
| | | } |
| | | [Serializable] |
| | | public class CloudDoorLockTempPasswordObj |
| | | { |
| | | /// <summary> |
| | | /// 门锁Id -->键名 : DoorLockId |
| | | /// </summary> |
| | | public string LocalDoorLockId = ""; |
| | | /// <summary> |
| | | /// 临时密码Id -->键名 : TempPwdId |
| | | /// </summary> |
| | | public string TempPwdId = ""; |
| | | /// <summary> |
| | | /// 临时密码 -->键名 : TempPwd |
| | | /// </summary> |
| | | public string TempPwd = ""; |
| | | /// <summary> |
| | | /// 0:00:00] ValidBeginTime 有效开始时间 -->键名 : ValidBeginTime 默认值: 0001/1/1 |
| | | /// </summary> |
| | | public DateTime ValidBeginTime; |
| | | /// <summary> |
| | | /// 0:00:00] ValidEndTime 有效结束时间 -->键名 : ValidEndTime |
| | | /// </summary> |
| | | public DateTime ValidEndTime; |
| | | /// <summary> |
| | | /// 【门锁云端主键】,用于【添加门锁历史】接口中的DoorLockId参数及【删除门锁】接口中的PrimaryId参数,注意不是网关中的【门锁Id |
| | | /// </summary> |
| | | public string Id; |
| | | /// <summary> |
| | | /// 创建时间 |
| | | /// </summary> |
| | | public DateTime CreatedOnUtc; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 从云服务器中获取门锁临时密码 |
| | | /// </summary> |
| | | public static async System.Threading.Tasks.Task<GetDoorLockTempPasswordDataRes> GetDoorLockTempPasswordFromServer(string RequestName, GetDoorLockTempPasswordData getDoorLockTempPasswordData) |
| | | { |
| | | return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<GetDoorLockTempPasswordDataRes>>)(async () => |
| | | { |
| | | GetDoorLockTempPasswordDataRes listInfo = null; |
| | | var revertObj = await SendDoorLockToServer(RequestName, getDoorLockTempPasswordData); |
| | | if (revertObj != null && revertObj.ResponseData != null) |
| | | { |
| | | var result = revertObj.ResponseData.ToString(); |
| | | if (result != null) |
| | | { |
| | | listInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetDoorLockTempPasswordDataRes>(result); |
| | | } |
| | | } |
| | | return listInfo; |
| | | })); |
| | | } |
| | | #endregion |
| | | |
| | | #region 获取门锁 |
| | | /// <summary> |
| | | /// 获取门锁 |
| | |
| | | /// 云端帐号Id -->键名 : CloudAccountId (可选) |
| | | /// </summary> |
| | | public string CloudAccountId = ""; |
| | | /// <summary> |
| | | /// OpenLockMode 开锁方式(密码、指纹、IC卡) -->键名 : OpenLockMode (可选) |
| | | /// </summary> |
| | | //public int OpenLockMode = 0; |
| | | } |
| | | |
| | | [Serializable] |
| | |
| | | public class CloudDoorLockObj |
| | | { |
| | | /// <summary> |
| | | /// 门锁Id |
| | | /// 门锁Id |
| | | /// </summary> |
| | | public string DoorLockId; |
| | | /// <summary> |
| | | /// 云端帐号Id |
| | | /// 云端帐号Id |
| | | /// </summary> |
| | | public string CloudAccountId; |
| | | /// <summary> |
| | | /// OpenLockMode 开锁方式(密码、指纹、IC卡) |
| | | /// OpenLockMode 开锁方式(密码、指纹、IC卡) |
| | | /// </summary> |
| | | public int OpenLockMode; |
| | | /// <summary> |
| | | /// 门锁本地用户Id |
| | | /// 门锁本地用户Id |
| | | /// </summary> |
| | | public string DoorLockLocalUserId; |
| | | /// <summary> |
| | | /// 住宅Id |
| | | /// 住宅Id |
| | | /// </summary> |
| | | public byte[] Data; |
| | | /// <summary> |
| | |
| | | /// </summary> |
| | | public bool IsTempUnlockAuthority; |
| | | /// <summary> |
| | | /// 录入时间 |
| | | /// 录入时间 |
| | | /// </summary> |
| | | public DateTime EntryTime; |
| | | /// <summary> |
| | | /// 最后更新时间 |
| | | /// 最后更新时间 |
| | | /// </summary> |
| | | public string LastChangeTime; |
| | | /// <summary> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取门锁给云服务器 |
| | | /// </summary> |
| | | /// 获取门锁云服务器 |
| | | /// </summary> |
| | | public static async System.Threading.Tasks.Task<GetDoorLockDataRes> GetDoorLockInfoFromServer(string RequestName, GetDoorLockData getDoorLockData) |
| | | { |
| | | return await System.Threading.Tasks.Task.Run((Func<System.Threading.Tasks.Task<GetDoorLockDataRes>>)(async () => |
| | |
| | | if (result != null) |
| | | { |
| | | listInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetDoorLockDataRes>(result); |
| | | int i = 0; |
| | | } |
| | | } |
| | | return listInfo; |
| | |
| | | { |
| | | //序列化对象 |
| | | var requestJson = JsonConvert.SerializeObject(obj); |
| | | var byteData = System.Text.Encoding.UTF8.GetBytes(requestJson); |
| | | byte[] result1 = null; |
| | | //访问接口 |
| | | var result = await CommonPage.Instance.RequestHttpsZigbeeAsync(RequestName, System.Text.Encoding.UTF8.GetBytes(requestJson)); |
| | | |
| | | return result; |
| | | if (UserCenterResourse.UserInfo.AuthorityNo == 1) |
| | | { |
| | | result1 = await CommonPage.Instance.RequestHttpsZigbeeBytesResultAsync(RequestName, byteData); |
| | | } |
| | | else |
| | | { |
| | | result1 = await CommonPage.Instance.RequestZigbeeHttpsByAdmin(RequestName, byteData); |
| | | } |
| | | if (result1 != null) |
| | | { |
| | | var result2 = Encoding.UTF8.GetString(result1); |
| | | if (result2 != null) |
| | | { |
| | | var result = Newtonsoft.Json.JsonConvert.DeserializeObject<Shared.Common.ResponseEntity.ResponsePack>(result2); |
| | | return result; |
| | | } |
| | | } |
| | | return null; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | |
| | | /// <summary> |
| | | /// 获取子账户信息 |
| | | /// </summary> |
| | | /// </summary> |
| | | static List<Shared.Phone.UserCenter.MemberInfoRes> DoorLockAccountList = new List<Shared.Phone.UserCenter.MemberInfoRes> { }; |
| | | public static async System.Threading.Tasks.Task<List<Shared.Phone.UserCenter.MemberInfoRes>> GetSubAccountByDistributedMark() |
| | | { |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region 与网关通讯接口 |
| | | #region 门锁操作事件通知 |
| | | /// <summary> |
| | | /// 门锁操作事件通知 |
| | |
| | | /// 保留 |
| | | /// </summary> |
| | | public int UserStatus; |
| | | /// <summary> |
| | | /// <summary> |
| | | /// 编程事件触发源 |
| | | /// 常用: |
| | | /// 0:Keypad(键盘/密码);3:RFID(射频卡);15:指纹 |
| | |
| | | /// 常用: |
| | | /// 键盘/密码,指纹、感应卡:1:Lock命令成功事件;2:Unlock命令成功事件 |
| | | ///不常用: |
| | | /// 请查看枚举 |
| | | /// 请查看枚举 |
| | | /// </summary> |
| | | public int ProgramEventCode; |
| | | /// <summary> |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region 临时密码信息 |
| | | #region 矫正门锁时间 |
| | | /// <summary> |
| | | /// 临时密码本地存储对象 |
| | | /// 矫正门锁时间 |
| | | /// </summary> |
| | | public TempPasswordObj tempPasswordObj = new TempPasswordObj(); |
| | | /// <returns>The writable value async.</returns> |
| | | /// <param name="timestamp">矫正门锁的时间</param> |
| | | public async System.Threading.Tasks.Task<SetWritableValueResponAllData> RectifyDoorLockTimeAsync(int timestamp) |
| | | { |
| | | if (Gateway == null) |
| | | { |
| | | return null; |
| | | } |
| | | return await System.Threading.Tasks.Task.Run(async () => |
| | | { |
| | | SetWritableValueResponAllData d = null; |
| | | Action<string, string> action = (topic, message) => |
| | | { |
| | | var gatewayID = topic.Split('/')[0]; |
| | | var jobject = Newtonsoft.Json.Linq.JObject.Parse(message); |
| | | |
| | | if (topic == gatewayID + "/" + "Error_Respon") |
| | | { |
| | | var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; |
| | | var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString()); |
| | | |
| | | if (temp == null) |
| | | { |
| | | d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" }; |
| | | } |
| | | else |
| | | { |
| | | d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; |
| | | } |
| | | } |
| | | |
| | | if (topic == gatewayID + "/" + "SetWritableValue_Respon") |
| | | { |
| | | var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value<int>("Device_ID"), DeviceAddr = jobject.Value<string>("DeviceAddr"), DeviceEpoint = jobject.Value<int>("Epoint"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID }; |
| | | var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<SetWritableValueResponData>(jobject["Data"].ToString()); |
| | | |
| | | if (tempData == null) |
| | | { |
| | | d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" }; |
| | | } |
| | | else |
| | | { |
| | | d = new SetWritableValueResponAllData { setWritableValueResponData = tempData }; |
| | | DebugPrintLog($"UI收到通知后的主题_{ topic}"); |
| | | } |
| | | } |
| | | }; |
| | | Gateway.Actions += action; |
| | | DebugPrintLog("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString()); |
| | | |
| | | try |
| | | { |
| | | var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 10 }, { "Command", 120 } }; |
| | | var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0 }, { "AttributeDataType", 226 }, { "AttributeData", timestamp } }; |
| | | jObject.Add("Data", data); |
| | | Gateway.Send("SetWritableValue", jObject.ToString()); |
| | | } |
| | | catch { } |
| | | |
| | | var dateTime = DateTime.Now; |
| | | while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime) |
| | | { |
| | | await System.Threading.Tasks.Task.Delay(10); |
| | | if (d != null) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) |
| | | { |
| | | d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" }; |
| | | } |
| | | Gateway.Actions -= action; |
| | | DebugPrintLog("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString()); |
| | | |
| | | return d; |
| | | }); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 临时密码本地对象 |
| | | /// 网关版本信息,网关反馈信息 |
| | | /// </summary> |
| | | public SetWritableValueResponAllData setWritableValueResponAllData; |
| | | /// <summary> |
| | | /// 网关版本信息,网关反馈信息 |
| | | /// </summary> |
| | | [System.Serializable] |
| | | public class TempPasswordObj |
| | | public class SetWritableValueResponAllData |
| | | { |
| | | /// <summary> |
| | | /// 门锁有效时间 |
| | | /// 错误信息 |
| | | /// </summary> |
| | | public int validTime; |
| | | public string errorMessageBase; |
| | | /// <summary> |
| | | /// 门锁时间 |
| | | /// 网关信息错误反馈 |
| | | /// <para>当网关接收到客户端信息后,出现以下异常情况将反馈错误。</para> |
| | | /// </summary> |
| | | public int times; |
| | | public ErrorResponData errorResponData; |
| | | /// <summary> |
| | | /// 网关版本信息 |
| | | /// </summary> |
| | | public SetWritableValueResponData setWritableValueResponData; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置可写属性的值的数据 |
| | | /// </summary> |
| | | [System.Serializable] |
| | | public class SetWritableValueResponData |
| | | { |
| | | /// <summary> |
| | | /// 配置属性所在的cluster |
| | | /// </summary> |
| | | public int Cluster; |
| | | /// <summary> |
| | | /// 0:配置成功(若配置成功,下面的AttributeId字段不存在) |
| | | ///<para>134:不支持该属性</para> |
| | | ///<para>135:无效的属性值</para> |
| | | ///<para>141:无效的数据类型</para> |
| | | /// </summary> |
| | | public int Status; |
| | | |
| | | } |
| | | #endregion |
| | | #endregion |
| | | |
| | | #region 私有命令 |
| | | #region 与设备通讯接口(私有命令) |
| | | |
| | | #region 用户管理控制 |
| | | ///<summary > |
| | |
| | | if (command == "0002") |
| | | { |
| | | var tempD = new DefaultControlResponseData(); |
| | | tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); |
| | | tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); |
| | | tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); |
| | | result = new DefaultControlResponseAllData { defaultControlResponseData = tempD }; |
| | | DebugPrintLog($"UI收到通知后的主题_command:0402_{ topic}"); |
| | | DebugPrintLog($"UI收到通知后的主题_command:0450_{ topic}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | break; |
| | | } |
| | | } |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > 9000) |
| | | { |
| | | result = new DefaultControlResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; |
| | | } |
| | |
| | | /// <summary> |
| | | ///响应操作码(0-ffff) |
| | | /// </summary> |
| | | public int command = -1; |
| | | public string command = ""; |
| | | /// <summary> |
| | | /// 状态值 |
| | | /// <para>默认响应结果: |
| | |
| | | ///<para>32 冻结成功</para> |
| | | ///<para>34 冻结失败</para> |
| | | ///<para>33 解冻成功</para> |
| | | ///<para>35 解冻失败</para> |
| | | ///<para>35 解冻失败</para> |
| | | /// </summary> |
| | | public int status = -1; |
| | | } |
| | |
| | | #region 验证门锁密码 |
| | | ///<summary > |
| | | ///验证门锁密码 |
| | | ///<para>inputPassword:输入的门锁密码</para> |
| | | ///<para>inputPassword:输入的门锁密码</para> |
| | | /// </summary> |
| | | public async System.Threading.Tasks.Task<VerifyPasswordResponseAllData> VerifyPasswordAsync(string inputPassword) |
| | | { |
| | |
| | | { |
| | | var result1 = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16); |
| | | result = new VerifyPasswordResponseAllData { result = result1 }; |
| | | DebugPrintLog($"UI收到通知后的主题_command:0402_{ topic}"); |
| | | DebugPrintLog($"UI收到通知后的主题_command:0454_{ topic}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime) |
| | | { |
| | | await System.Threading.Tasks.Task.Delay(10); |
| | | if (result != null) |
| | | if (result != null && result.result == 0) |
| | | { |
| | | break; |
| | | } |
| | |
| | | } |
| | | #endregion |
| | | |
| | | #region 远程开锁 |
| | | #region 远程开锁 |
| | | ///<summary > |
| | | ///远程开锁 |
| | | ///<para>inputPassword: 输入密码/para> |
| | | ///远程开锁 |
| | | ///<para>inputPassword: 输入密码/para> |
| | | /// </summary> |
| | | public async System.Threading.Tasks.Task<ResponseAllData> RemoteControlAsync(string inputPassword) |
| | | public async System.Threading.Tasks.Task<TempPasswordResponseAllData> RemoteControlAsync(string inputPassword) |
| | | { |
| | | ResponseAllData result = null; |
| | | TempPasswordResponseAllData result = null; |
| | | if (Gateway == null) |
| | | { |
| | | result = new ResponseAllData { errorMessageBase = "当前没有网关" }; |
| | | result = new TempPasswordResponseAllData { errorMessageBase = "当前没有网关" }; |
| | | return result; |
| | | } |
| | | return await System.Threading.Tasks.Task.Run(async () => |
| | |
| | | |
| | | if (temp == null) |
| | | { |
| | | result = new ResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; |
| | | result = new TempPasswordResponseAllData { errorMessageBase = "网关错误回复,且数据是空" }; |
| | | } |
| | | |
| | | else |
| | | { |
| | | result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; |
| | | result = new TempPasswordResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) }; |
| | | } |
| | | } |
| | | if (topic == gatewayID + "/" + "ZbDataPassthrough") |
| | |
| | | |
| | | if (gatewayTemp.clientDataPassthroughResponseData == null) |
| | | { |
| | | result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" }; |
| | | result = new TempPasswordResponseAllData { errorMessageBase = "网关返回的数据为空" }; |
| | | } |
| | | else |
| | | { |
| | |
| | | var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString(); |
| | | if (command == "0002") |
| | | { |
| | | var tempD = new ResponseData(); |
| | | tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); |
| | | var tempD = new TempPasswordResponseData(); |
| | | tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); |
| | | tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); |
| | | result = new ResponseAllData { responseData = tempD }; |
| | | System.Console.WriteLine($"UI收到通知后的主题_command:0400_{ topic}"); |
| | | result = new TempPasswordResponseAllData { responseData = tempD }; |
| | | DebugPrintLog($"UI收到通知后的主题_command:0462_{ topic}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime) |
| | | { |
| | | await System.Threading.Tasks.Task.Delay(10); |
| | | if (result != null) |
| | | if (result != null && result.responseData != null && result.responseData.command == "0462") |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) |
| | | { |
| | | result = new ResponseAllData { errorMessageBase = " 回复超时,请重新操作" }; |
| | | result = new TempPasswordResponseAllData |
| | | { errorMessageBase = " 回复超时,请重新操作" }; |
| | | } |
| | | Gateway.Actions -= action; |
| | | DebugPrintLog("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString()); |
| | |
| | | |
| | | #region 临时密码发送数据 |
| | | ///<summary > |
| | | ///远程开锁 |
| | | ///<para>inputPassword: 输入密码/para> |
| | | ///远程开锁 |
| | | ///<para>inputPassword: 输入密码/para> |
| | | /// </summary> |
| | | public async System.Threading.Tasks.Task<TempPasswordResponseAllData> TempPasswordAsync(string inputPassword, System.DateTime startTime, System.DateTime endTime, string fixedPassword = "190605") |
| | | { |
| | |
| | | if (command == "0002") |
| | | { |
| | | var tempD = new TempPasswordResponseData(); |
| | | tempD.command = Convert.ToInt32(data[10].ToString() + data[11].ToString() + data[12].ToString() + data[13].ToString(), 16); |
| | | tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); |
| | | tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); |
| | | result = new TempPasswordResponseAllData { responseData = tempD }; |
| | | System.Console.WriteLine($"UI收到通知后的主题_command:0400_{ topic}"); |
| | | DebugPrintLog($"UI收到通知后的主题_command:0463_{ topic}"); |
| | | } |
| | | } |
| | | } |
| | |
| | | while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime) |
| | | { |
| | | await System.Threading.Tasks.Task.Delay(10); |
| | | if (result != null) |
| | | if (result != null && result.responseData != null && result.responseData.command == "0463") |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime) |
| | | if ((DateTime.Now - dateTime).TotalMilliseconds > 9000) |
| | | { |
| | | result = new TempPasswordResponseAllData |
| | | { errorMessageBase = " 回复超时,请重新操作" }; |
| | |
| | | pawStr = pawStr.PadLeft(8, '0'); |
| | | for (int i = 6; i >= 0; i = i - 2) |
| | | { |
| | | passwordStr += passwordStr.Substring(i, 2); |
| | | passwordStr += pawStr.Substring(i, 2); |
| | | } |
| | | var startTimeStr = System.Convert.ToString(GetUnixTimeStamp(startTime, false), 16); |
| | | var endTimeStr = System.Convert.ToString(GetUnixTimeStamp(endTime, false), 16); |
| | | |
| | | var startTimeStr = Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetUnixTimeStamp(startTime); |
| | | var endTimeStr = Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo.GetUnixTimeStamp(endTime); |
| | | startTimeStr = string.Format("{0:X}", System.Convert.ToInt64(startTimeStr)); |
| | | endTimeStr = string.Format("{0:X}", System.Convert.ToInt64(endTimeStr)); |
| | | for (int i = 6; i >= 0; i = i - 2) |
| | | { |
| | | vaildTimeStr += startTimeStr.Substring(i, 2); |
| | | invalidTimeStr += endTimeStr.Substring(i, 2); |
| | | } |
| | | data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + |
| | | passwordStr + vaildTimeStr + vaildTimeStr; |
| | | } |
| | | catch { }; |
| | | |
| | | data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + |
| | | passwordStr + vaildTimeStr + invalidTimeStr; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | var mess = ex.Message; |
| | | }; |
| | | return data; |
| | | } |
| | | |
| | |
| | | /// <summary> |
| | | ///响应操作码(0-ffff) |
| | | /// </summary> |
| | | public int command = -1; |
| | | public string command = ""; |
| | | /// <summary> |
| | | /// 状态值 |
| | | /// <para>0--注册成功</para> |
| | |
| | | { |
| | | string passwordStr = ""; |
| | | var result = await GetKeyPassworAsync(); |
| | | //返回小端 |
| | | //返回小端 |
| | | if (result == null || result.keyPassword == null) |
| | | { |
| | | return 0; |
| | |
| | | public class DoorLockUserDetailData |
| | | { |
| | | /// <summary> |
| | | /// 类型 |
| | | /// 类型(读取锁上已有用户) |
| | | /// </summary> |
| | | public int userType; |
| | | /// <summary> |
| | |
| | | } |
| | | #endregion |
| | | |
| | | /// <summary> |
| | | /// 获取从格林威治时间到当前某一时刻的总毫秒数 |
| | | /// </summary> |
| | | /// <param name="dateTime">北京时间</param> |
| | | /// <param name="accurateToMilliseconds">精确到毫秒,否到秒</param> |
| | | /// <returns>返回一个长整数时间戳</returns> |
| | | public static long GetUnixTimeStamp(DateTime dateTime, bool accurateToMilliseconds) |
| | | { |
| | | DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0));//北京所在东八区 |
| | | DateTime endTime = TimeZoneInfo.ConvertTimeToUtc(dateTime); |
| | | return (long)(accurateToMilliseconds ? (endTime - startTime).TotalMilliseconds : (endTime - startTime).TotalSeconds); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 将UNIX时间戳转为北京时间 |
| | | /// </summary> |
| | | /// <param name="unixTimeStamp">时间戳</param> |
| | | /// <param name="accurateToMilliseconds">精确到毫秒,佛为秒</param> |
| | | /// <returns></returns> |
| | | public static DateTime GetLocalTime(int unixTimeStamp, bool accurateToMilliseconds) |
| | | { |
| | | DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(1970, 1, 1, 8, 0, 0));//北京所在东八区 |
| | | return (accurateToMilliseconds ? startTime.AddMilliseconds(unixTimeStamp) : startTime.AddSeconds(unixTimeStamp)).ToLocalTime(); |
| | | } |
| | | #endregion |
| | | } |
| | | } |