黄学彪
2020-07-20 2029e64ec0491f7e511dc15bffaf821bfbabe2de
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayLogic.cs
@@ -263,18 +263,7 @@
                return -1;
            }
            //获取网关的信息
            var result = await zbGateway.GetZbGwInfoAsync();
            //检测网关返回的共通错误状态码
            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
            if (error != null)
            {
                if (mode == ShowErrorMode.YES)
                {
                    this.ShowTipMsg(error);
                }
                return -1;
            }
            var result = this.GetGatewayInfo(zbGateway, true, mode);
            if (result == null)
            {
                if (mode == ShowErrorMode.YES)
@@ -286,28 +275,20 @@
                return -1;
            }
            if (result.getGwData == null)
            {
                if (mode == ShowErrorMode.YES)
                {
                    //获取网关信息失败
                    string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
                    this.ShowTipMsg(msg);
                }
                return -1;
            }
            //设置住宅ID到网关
            bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, mode);
            if (flage2 == false)
            if (result.HomeId != Common.Config.Instance.HomeId)
            {
                if (mode == ShowErrorMode.YES)
                bool flage2 = await this.SetHomeIdToGateway(zbGateway, Common.Config.Instance.HomeId, mode);
                if (flage2 == false)
                {
                    //向网关设置住宅ID失败
                    string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
                    this.ShowTipMsg(msg);
                    if (mode == ShowErrorMode.YES)
                    {
                        //向网关设置住宅ID失败
                        string msg = Language.StringByID(R.MyInternationalizationString.uSetHomeIdToGatewayFail);
                        this.ShowTipMsg(msg);
                    }
                    return -1;
                }
                return -1;
            }
            //更新云端数据库
@@ -337,9 +318,9 @@
            //刷新的是缓存,不刷新真实物理网关
            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
            //将网关的数据设置到本地缓存中
            this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result.getGwData);
            this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result);
            //顺便这个变量也设置一下
            this.SetGatewayDataToLocalMemmory(zbGateway, result.getGwData, false);
            this.SetGatewayDataToLocalMemmory(zbGateway, result, false);
            if (isEsist == false)
            {
@@ -492,12 +473,12 @@
            await Task.Delay(8000);
            //获取网关的信息
            ZbGatewayData.GetGwAllData result = null;
            ZbGatewayData.GetGwData result = null;
            int count = 5;
            while (count >= 0)
            {
                result = await zbGateway.GetZbGwInfoAsync();
                if (result != null && result.getGwData != null)
                result = this.GetGatewayInfo(zbGateway, true, ShowErrorMode.NO);
                if (result != null)
                {
                    break;
                }
@@ -505,15 +486,7 @@
                //最多再等20秒
                await Task.Delay(4000);
            }
            //检测网关返回的共通错误状态码
            string error = HdlCheckLogic.Current.CheckCommonErrorCode(result);
            if (error != null)
            {
                this.ShowTipMsg(error);
                return -1;
            }
            if (result == null || result.getGwData == null)
            if (result == null)
            {
                //获取网关信息失败
                string msg = Language.StringByID(R.MyInternationalizationString.uGetGatewayInfoFail);
@@ -535,9 +508,9 @@
            //刷新的是缓存,不刷新真实物理网关
            this.dicGateway[gwID].GatewayOnlineFlage = zbGateway.GatewayOnlineFlage;
            //将网关的数据设置到本地缓存中
            this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result.getGwData);
            this.SetGatewayDataToLocalMemmory(this.dicGateway[gwID], result);
            //顺便这个变量也设置一下
            this.SetGatewayDataToLocalMemmory(zbGateway, result.getGwData, false);
            this.SetGatewayDataToLocalMemmory(zbGateway, result, false);
            if (isEsist == false)
            {
@@ -609,15 +582,14 @@
        public async Task<bool> DoSwitchGateway(string gatewayId)
        {
            var zbGateway = this.GetLocalGateway(gatewayId);
            if (this.CheckGatewayOnlineByFlag(zbGateway) == true)
            //重新获取在线网关的信息
            var result = await this.GetOnlineGatewayInfo(gatewayId);
            if (result == false)
            {
                //重新获取在线网关的信息
                var result = await this.GetOnlineGatewayInfo(gatewayId);
                if (result == false)
                {
                    return false;
                }
                return false;
            }
            //切换网关,保存缓存
            this.SaveGatewayIdToLocation(gatewayId);
            //切换网关的话,主页需要重新刷新
@@ -666,7 +638,7 @@
            if (getGatewayInfo == true)
            {
                //获取网关信息
                var info = this.GetGatewayInfo(realWay);
                var info = this.GetGatewayInfo(realWay, false);
                if (info == null)
                {
                    //关闭进度条
@@ -676,7 +648,7 @@
            }
            //获取全部设备
            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay);
            int result = LocalDevice.Current.SetDeviceToMemmoryByGateway(realWay, false);
            //关闭进度条
            ProgressBar.Close();
            if (result == -1)
@@ -717,20 +689,11 @@
        public async Task<bool> DeleteGateway(string zbGatewayID)
        {
            ZbGateway realWay = null;
            bool hadReal = this.GetRealGateway(ref realWay, zbGatewayID);
            //暂不支持分享
            if (hadReal == true && realWay.GatewayOnlineFlage == true)
            this.GetRealGateway(ref realWay, zbGatewayID);
            //清空网关的住宅ID 网关解绑失败  不理它,因为网关可以按按键强制搜索得到
            if (realWay != null)
            {
                //清空网关的住宅ID
                bool result = await this.SetHomeIdToGateway(realWay, string.Empty, ShowErrorMode.YES);
                if (result == false)
                {
                    //网关解绑失败  不理它,因为网关可以按按键强制搜索得到
                    string msg = Language.StringByID(R.MyInternationalizationString.uGatewayUnBindFail);
                    //this.ShowErrorMsg(msg);
                    //return false;
                }
                await this.SetHomeIdToGateway(realWay, string.Empty, ShowErrorMode.NO);
            }
            //删除云端的网关
@@ -742,7 +705,10 @@
            //移除
            ZbGateway.GateWayList.RemoveAll((obj) => obj.GwId == zbGatewayID);
            //断开mqtt连接
            realWay.DisConnectLocalMqttClient("GD");
            if (realWay != null)
            {
                realWay.DisConnectLocalMqttClient("GD");
            }
            return true;
        }
@@ -1308,6 +1274,8 @@
        /// <returns></returns>
        public string GetGatewayName(ZbGateway zbGateway)
        {
            if (zbGateway == null) { return string.Empty; }
            string gwId = zbGateway.GwId;
            if (this.dicGateway.ContainsKey(gwId) == false)
            {
@@ -1321,11 +1289,10 @@
                return name;
            }
            string keyName = Common.LocalDevice.deviceModelIdName + localWay.LinuxImageType;
            if (LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
            var nameContent = LocalDevice.Current.GetDeviceModelIdNameInfo(localWay.LinuxImageType.ToString());
            if (nameContent != null)
            {
                //没有名称时,则使用R文件里面设置的默认设备名称
                return Language.StringByID(LocalDevice.Current.dicDeviceAllNameID[keyName] + 20000);
                return nameContent.A备注名字;
            }
            return string.Empty;
@@ -1362,11 +1329,10 @@
                //如果这个网关没有信息,则从新获取
                if (zbGateway.LinuxImageType != -1)
                {
                    string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.LinuxImageType;
                    if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
                    var nameContent = LocalDevice.Current.GetDeviceModelIdNameInfo(zbGateway.LinuxImageType.ToString());
                    if (nameContent != null)
                    {
                        //使用R文件里面设置的东西
                        button.TextID = LocalDevice.Current.dicDeviceAllNameID[keyName];
                        button.Text = nameContent.A官方名字;
                    }
                }
                else
@@ -1374,7 +1340,7 @@
                    //给一个线程去获取它的镜像类型
                    HdlThreadLogic.Current.RunThread(() =>
                    {
                        var result = this.GetGatewayInfo(zbGateway, ShowErrorMode.NO);
                        var result = this.GetGatewayInfo(zbGateway, false, ShowErrorMode.NO);
                        if (result != null)
                        {
                            //将网关的数据设置到本地缓存中
@@ -1382,11 +1348,10 @@
                            HdlThreadLogic.Current.RunMain(() =>
                            {
                                string keyName = Common.LocalDevice.deviceModelIdName + zbGateway.LinuxImageType;
                                if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
                                var nameContent = LocalDevice.Current.GetDeviceModelIdNameInfo(zbGateway.LinuxImageType.ToString());
                                if (nameContent != null)
                                {
                                    //使用R文件里面设置的东西
                                    button.TextID = LocalDevice.Current.dicDeviceAllNameID[keyName];
                                    button.Text = nameContent.A官方名字;
                                }
                            });
                        }
@@ -1395,11 +1360,10 @@
            }
            else
            {
                string keyName = Common.LocalDevice.deviceModelIdName + this.dicGateway[gwId].LinuxImageType;
                if (Common.LocalDevice.Current.dicDeviceAllNameID.ContainsKey(keyName) == true)
                var nameContent = LocalDevice.Current.GetDeviceModelIdNameInfo(zbGateway.LinuxImageType.ToString());
                if (nameContent != null)
                {
                    //使用R文件里面设置的东西
                    button.TextID = Common.LocalDevice.Current.dicDeviceAllNameID[keyName];
                    button.Text = nameContent.A官方名字;
                }
            }
        }
@@ -1412,13 +1376,14 @@
        /// 获取网关信息(版本信息,镜像类型,基本信息等。只刷新本地网关的缓存)
        /// </summary>
        /// <param name="zbGateway"></param>
        /// <param name="useLocalConnect">是否强制使用本地连接发送</param>
        /// <param name="mode"></param>
        /// <returns></returns>
        public ZbGatewayData.GetGwData GetGatewayInfo(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
        public ZbGatewayData.GetGwData GetGatewayInfo(ZbGateway zbGateway, bool useLocalConnect, ShowErrorMode mode = ShowErrorMode.YES)
        {
            //获取网关版本信息
            var jObject = new Newtonsoft.Json.Linq.JObject { { "Cluster_ID", 0 }, { "Command", 95 } };
            var result = this.SendJobjectDataToGateway(zbGateway, "GetZbGwInfo", jObject.ToString(), "GetZbGwInfo_Respon");
            var result = this.SendJobjectDataToGateway(zbGateway, "GetZbGwInfo", jObject.ToString(), "GetZbGwInfo_Respon", 5, useLocalConnect);
            if (result.ErrorMsgDiv != 1)
            {
@@ -1467,6 +1432,7 @@
            localWay.CoordinatorFirmwareVersion = data.ZbFWVersion;
            localWay.CoordinatorImageId = data.ZbImageType;
            localWay.DriveCodeList = data.DriveCodeList;
            localWay.GwVersionDate = data.AppVersion;
            if (saveFile == true)
            {
                localWay.ReSave();
@@ -1554,7 +1520,7 @@
        public List<FirmwareVersionInfo> GetGatewayAllNewVersion(ZbGateway zbGateway, ShowErrorMode mode = ShowErrorMode.YES)
        {
            //获取网关版本信息
            var result = this.GetGatewayInfo(zbGateway, mode);
            var result = this.GetGatewayInfo(zbGateway, false, mode);
            if (result == null)
            {
                return null;
@@ -1704,7 +1670,7 @@
                    //给一个线程去获取它的镜像类型
                    HdlThreadLogic.Current.RunThread(() =>
                    {
                        var result = this.GetGatewayInfo(zbGateway, ShowErrorMode.NO);
                        var result = this.GetGatewayInfo(zbGateway, true, ShowErrorMode.NO);
                        if (result != null)
                        {
                            //将网关的数据设置到本地缓存中
@@ -1742,7 +1708,7 @@
                    //给一个线程去获取它的镜像类型
                    HdlThreadLogic.Current.RunThread(() =>
                    {
                        var result = this.GetGatewayInfo(zbGateway, ShowErrorMode.NO);
                        var result = this.GetGatewayInfo(zbGateway, true, ShowErrorMode.NO);
                        if (result != null)
                        {
                            //将网关的数据设置到本地缓存中
@@ -2070,8 +2036,9 @@
        /// <param name="sendData">需要发送的数据  JObject.ToString()的东西</param>
        /// <param name="receiptTopic">指定接收哪个主题</param>
        /// <param name="waitTime">超时时间(秒)</param>
        /// <param name="useLocalConnect">是否强制使用本地连接发送</param>
        /// <returns>网关返回的数据</returns>
        public ReceiptGatewayResult SendJobjectDataToGateway(ZbGateway gateway, string sendTopic, string sendData, string receiptTopic, int waitTime = 5)
        public ReceiptGatewayResult SendJobjectDataToGateway(ZbGateway gateway, string sendTopic, string sendData, string receiptTopic, int waitTime = 5, bool useLocalConnect = false)
        {
            var reResult = new ReceiptGatewayResult();
@@ -2108,7 +2075,14 @@
            };
            myGateway.Actions += receiptAction;
            //发送数据
            myGateway.Send(sendTopic, sendData);
            if (useLocalConnect == false)
            {
                myGateway.Send(sendTopic, sendData);
            }
            else
            {
                myGateway.SendLocation(sendTopic, System.Text.Encoding.UTF8.GetBytes(sendData));
            }
            //超时时间
            int TimeOut = 0;