gxc
2019-10-29 081ea8d273048fd03756718ac6fb48a3c09218e9
ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
@@ -10,7 +11,7 @@
namespace ZigBee.Device
{
    public class DoorLock : CommonDevice
    public class DoorLock : Shared.Phone.UserCenter.DoorLock.DoorLockCommonInfo
    {
        public DoorLock()
        {
@@ -29,43 +30,41 @@
        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
@@ -96,6 +95,11 @@
            /// 门锁本地用户Id -->键名 : DoorLockLocalUserId
            /// </summary>
            public string DoorLockLocalUserId = "";
            /// <summary>
            /// IsOtherAccountCtrl 是否为子帐号控制过来 -->键名 : IsOtherAccountCtrl
            /// </summary>
            public bool IsOtherAccountCtrl = false;
        }
        #endregion
@@ -210,6 +214,263 @@
        }
        #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>
        ///  获取门锁
@@ -220,10 +481,6 @@
            /// 云端帐号Id -->键名 : CloudAccountId (可选)
            /// </summary>
            public string CloudAccountId = "";
            /// <summary>
            /// OpenLockMode 开锁方式(密码、指纹、IC卡) -->键名 : OpenLockMode (可选)
            /// </summary>
            //public int OpenLockMode = 0;
        }
        [Serializable]
@@ -241,23 +498,23 @@
        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>
@@ -277,11 +534,11 @@
            /// </summary>
            public bool IsTempUnlockAuthority;
            /// <summary>
            /// 录入时间
            /// 录入时间
            /// </summary>
            public DateTime EntryTime;
            /// <summary>
            /// 最后更新时间
            /// 最后更新时间
            /// </summary>
            public string LastChangeTime;
            /// <summary>
@@ -295,8 +552,8 @@
        }
        /// <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 () =>
@@ -309,7 +566,6 @@
                    if (result != null)
                    {
                        listInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetDoorLockDataRes>(result);
                        int i = 0;
                    }
                }
                return listInfo;
@@ -329,10 +585,27 @@
            {
                //序列化对象
                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)
            {
@@ -343,7 +616,7 @@
        /// <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()
        {
@@ -370,6 +643,7 @@
        }
        #endregion
        #region  与网关通讯接口
        #region 门锁操作事件通知
        /// <summary>
        /// 门锁操作事件通知
@@ -644,7 +918,7 @@
            ///  保留
            /// </summary>
            public int UserStatus;
            /// <summary>
            /// <summary>
            /// 编程事件触发源
            /// 常用:
            /// 0:Keypad(键盘/密码);3:RFID(射频卡);15:指纹
@@ -657,7 +931,7 @@
            /// 常用:
            /// 键盘/密码,指纹、感应卡:1:Lock命令成功事件;2:Unlock命令成功事件
            ///不常用:
            /// 请查看枚举
            /// 请查看枚举
            /// </summary>
            public int ProgramEventCode;
            /// <summary>
@@ -671,29 +945,137 @@
        }
        #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 >
@@ -750,10 +1132,10 @@
                                    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}");
                                    }
                                }
                            }
@@ -782,7 +1164,7 @@
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)
                {
                    result = new DefaultControlResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
@@ -882,7 +1264,7 @@
            /// <summary>
            ///响应操作码(0-ffff)
            /// </summary>
            public int command = -1;
            public string command = "";
            /// <summary>
            /// 状态值
            /// <para>默认响应结果:
@@ -892,7 +1274,7 @@
            ///<para>32 冻结成功</para>
            ///<para>34 冻结失败</para>
            ///<para>33 解冻成功</para>
            ///<para>35 解冻失败</para>
            ///<para>35 解冻失败</para>
            /// </summary>
            public int status = -1;
        }
@@ -921,7 +1303,7 @@
        #region 验证门锁密码
        ///<summary >
        ///验证门锁密码
        ///<para>inputPassword:输入的门锁密码</para>
        ///<para>inputPassword:输入的门锁密码</para>
        /// </summary>
        public async System.Threading.Tasks.Task<VerifyPasswordResponseAllData> VerifyPasswordAsync(string inputPassword)
        {
@@ -974,7 +1356,7 @@
                                    {
                                        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}");
                                    }
                                }
                            }
@@ -1000,7 +1382,7 @@
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    if (result != null && result.result == 0)
                    {
                        break;
                    }
@@ -1068,17 +1450,17 @@
        }
        #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 () =>
@@ -1095,12 +1477,12 @@
                        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")
@@ -1110,7 +1492,7 @@
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                            result = new TempPasswordResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
@@ -1122,11 +1504,11 @@
                                    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}");
                                    }
                                }
                            }
@@ -1152,14 +1534,15 @@
                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());
@@ -1199,8 +1582,8 @@
        #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")
        {
@@ -1252,10 +1635,10 @@
                                    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}");
                                    }
                                }
                            }
@@ -1281,12 +1664,12 @@
                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 = " 回复超时,请重新操作" };
@@ -1318,21 +1701,26 @@
                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;
        }
@@ -1367,7 +1755,7 @@
            /// <summary>
            ///响应操作码(0-ffff)
            /// </summary>
            public int command = -1;
            public string command = "";
            /// <summary>
            /// 状态值
            /// <para>0--注册成功</para>
@@ -1390,7 +1778,7 @@
        {
            string passwordStr = "";
            var result = await GetKeyPassworAsync();
            //返回小端
            //返回小端
            if (result == null || result.keyPassword == null)
            {
                return 0;
@@ -1702,7 +2090,7 @@
        public class DoorLockUserDetailData
        {
            /// <summary>
            /// 类型
            /// 类型(读取锁上已有用户)
            /// </summary>
            public int userType;
            /// <summary>
@@ -1734,30 +2122,6 @@
        }
        #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
    }
}