JLChen
2020-04-22 fef8136ca77f03dc4fb8988da94dcaf9dcabc9e0
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -108,18 +108,17 @@
                    };
                    
                    var topicFilters = new TopicFilter [] { topicFilterCommon, topicFilterGateWayInfoChange, topicFilterNotifySqueeze, topicFilterNotifyGateWayOffline };
                    var result = await RemoteMqttClient.SubscribeAsync (topicFilters);
                    if (result.Items [0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) {
                        isSubscribeTopicSuccess = true;
                    }
                }
            } catch (Exception e) {
            } catch (Exception ex) {
            }
        }
        /// <summary>
@@ -149,9 +148,6 @@
        /// 推送标识
        /// </summary>
        static string PushSignStr = System.DateTime.Now.Ticks.ToString ();
        /// <summary>
@@ -224,16 +220,6 @@
                            Utlis.WriteLine ($"============>Mqtt远程连接断开");
                            isSubscribeTopicSuccess = false;
                            await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
                            //await StartRemoteMqtt();
                            //if (thisShowTip) {
                            //    if (CommonPage.IsRemote) {
                            //        Application.RunOnMainThread (() => {
                            //            MainPage.Loading.Hide ();
                            //        });
                            //    }
                            //} else {
                            //    thisShowTip = true;
                            //}
                        });
                    }
                    if (RemoteMqttClient.ConnectedHandler == null) {
@@ -258,9 +244,7 @@
                                    MainPage.AddTip ("Remote failed,gateway offline");
                                } else {
                                    //Remote Connection Succeeded
                                    //网关在线
                                    //重新一次所有设备状态
                                    IfNeedReadAllDeviceStatus = false;
                                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
@@ -271,81 +255,21 @@
                                        MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
                                    }
                                }
                                //if (CurRemoteMACInfo.isValid == "InValid") {
                                //    MainPage.AddTip ("Remote failed,gateway offline");
                                //} else {
                                //    MqttRemoteSend (new byte [] { 0 }, 3);
                                //}
                            }
                        });
                    }
                    #endregion
                    //}
                    //正在获取连接参数..."
                    //提示正在获取连接参数..."
                    ShowStartTip ();
                    mqttRequestParToken = MainPage.LoginUser.LoginTokenString;
                    //--第一步:获取mqtt链接参数
                    var mqttInfoRequestResult = new ResponsePack () { StateCode = "" };
                    //--判断是当前是否分享的住宅
                    if (!UserConfig.Instance.CurrentRegion.IsOthreShare) {
                        var mqttInfoUrl = $"{MainPage.RequestHttpsHost}/EmqMqtt/GetConnMqttInfo";//获取连接远程云端Emq Mqtt 服务器连接信息
                        var mqttInfoRequestPar = new GetConnMqttInfoObj () {
                            LoginAccessToken = mqttRequestParToken,
                            PlatformStr = "L1",
                            PublishPayloadJsonStr = PushSignStr,
                        };
                        mqttInfoRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar), mqttInfoUrl);
                        if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                            var mqttInfoRequestResult_info = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                            if (mqttInfoRequestResult_info != null) {
                                mMqttInfo = mqttInfoRequestResult_info;
                                //----第二步:读取账号下面的网关列表
                                var gatewayListUrl = $"{MainPage.RequestHttpsHostMqtt}/Center/Center/GetGatewayPagger"; //App、Buspro软件登录后获取网关列表 http 请求
                                var gatewayListRequestPar = new RemoteRequestParameters () { LoginAccessToken = mqttRequestParToken, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
                                var gatewayListRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (gatewayListRequestPar), gatewayListUrl);
                                var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
                                //--找出是否存在匹配当前住宅的mac,存在再进行远程。
                                if (UserConfig.Instance.CheckHomeGatewaysNotEmpty ()) {
                                    CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.HomeGateways [0].GatewayUniqueId);
                                    //CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData [0];
                                    await MQTTConnectAsync ();
                                } else {
                                    Utlis.WriteLine ("============>Mqtt 取消连接,当前住宅没绑定网关");
                                }
                            } else {
                                Utlis.WriteLine ("============>Mqtt GetGatewayPagger 失败");
                            }
                        } else {
                            Utlis.WriteLine ("============>Mqtt GetInfo 失败");
                        }
                        //主账号获取MQTT 远程链接信息,并连接
                        await GetMqttInfoAndMQTTConnectAsync ();
                    } else {
                        //如果是分享过来的住宅 走下面流程
                        var mqttInfoRequestPar = new ShareMemberConnMqttInfoObj () {
                            LoginAccessToken = mqttRequestParToken,
                            PlatformStr = "L1",
                            PublishPayloadJsonStr = PushSignStr,
                            MainUserDistributedMark = UserConfig.Instance.CurrentRegion.MainUserDistributedMark,
                            HomeId = UserConfig.Instance.CurrentRegion.Id
                        };
                        mqttInfoRequestResult = MainPage.RequestHttps (API.ShareMemberConnMqttInfo, Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar));
                        //--第一步:获取mqtt链接参数
                        if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                            var mqttInfoRequestResult_info = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                            if (mqttInfoRequestResult_info != null) {
                                mMqttInfo = mqttInfoRequestResult_info;
                                //--第二步:获取当前住分享宅网关信息并连接MQTT
                                await GetSingleHomeGatewayPaggerAndMQTTConnectAsync ();
                            }
                        }
                        await GetShareMqttInfoAndMQTTConnectAsync ();
                    }
                } catch (Exception ex) {
@@ -358,45 +282,159 @@
        }
        /// <summary>
        /// 主账号获取MQTT 远程链接信息,并连接
        /// </summary>
        /// <returns></returns>
        static async Task GetMqttInfoAndMQTTConnectAsync ()
        {
            var mqttInfoRequestPar = new GetConnMqttInfoObj () {
                LoginAccessToken = MainPage.LoginUser.LoginTokenString,
                PlatformStr = "L1",
                PublishPayloadJsonStr = PushSignStr,
                Mac = UserConfig.Instance.GatewayMAC,
            };
            //----第一步:获取mqtt链接参数
            var mqttInfoRequestResult = MainPage.RequestHttps (API.GetConnMqttInfo, Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar));
            if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                try {
                    var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                    if (mqttInfoRequestResult_Obj != null) {
                        mMqttInfo = mqttInfoRequestResult_Obj;
                        string url = mqttInfoRequestResult_Obj.connEmqDomainPort;
                        string clientId = mqttInfoRequestResult_Obj.connEmqClientId;
                        string username = mqttInfoRequestResult_Obj.connEmqUserName;
                        string passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
                        if (mqttInfoRequestResult_Obj.AccountAllGateways != null && mqttInfoRequestResult_Obj.AccountAllGateways.Count > 0) {
                            //----第二步找出是否存在匹配当前住宅的mac,存在再进行远程。
                            CurRemoteMACInfo = mqttInfoRequestResult_Obj.AccountAllGateways.Find ((obj) => obj.mac == UserConfig.Instance.GatewayMAC);
                            if (CurRemoteMACInfo != null) {
                                CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                                CurRemoteMACInfo.clientId = clientId;
                                //----第三步 开始连接
                                await MQTTConnectAsync ();
                            } else {
                                Utlis.WriteLine ("============>Mqtt CurRemoteMACInfo null");
                            }
                        }
                    } else {
                        Utlis.WriteLine ("============>Mqtt mqttInfoRequestResult_Obj null");
                    }
                } catch { }
            } else {
                Utlis.WriteLine ("============>Mqtt GetInfo 失败");
            }
        }
        /// <summary>
        /// 子账号获取MQTT 远程链接信息,并连接
        /// </summary>
        /// <returns></returns>
        static async Task GetShareMqttInfoAndMQTTConnectAsync ()
        {
            var mqttInfoRequestPar = new ShareMemberConnMqttInfoObj () {
                LoginAccessToken = mqttRequestParToken,
                PlatformStr = "L1",
                PublishPayloadJsonStr = PushSignStr,
                MainUserDistributedMark = UserConfig.Instance.CurrentRegion.MainUserDistributedMark,
                HomeId = UserConfig.Instance.CurrentRegion.Id
            };
            var mqttInfoRequestResult = MainPage.RequestHttps (API.ShareMemberConnMqttInfo, Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar));
            //--第一步:获取mqtt链接参数
            if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                var mqttInfoRequestResult_info = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                if (mqttInfoRequestResult_info != null) {
                    mMqttInfo = mqttInfoRequestResult_info;
                    //--第二步:获取当前住分享宅网关信息并连接MQTT
                    await GetSingleHomeGatewayPaggerAndMQTTConnectAsync ();
                }
            }
        }
        /// <summary>
        /// 连接MQTT
        /// </summary>
        static async Task MQTTConnectAsync ()
        {
            if (CurRemoteMACInfo != null && mMqttInfo != null) {
                //获取参数成功,开始连接...
                MainPage.AddTip ("Successfully obtained parameters, starting to connect...");
                //try {
                //    var url = mMqttInfo.connEmqDomainPort;
                //    var clientId = mMqttInfo.connEmqClientId;
                //    var username = mMqttInfo.connEmqUserName;
                //    var passwordRemote = mMqttInfo.connEmqPwd;
                //    CurRemoteMACInfo.clientId = clientId;
                //    CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                //    mqttEncryptKey = CurRemoteMACInfo.isNewBusproGateway ? CurRemoteMACInfo.aesKey : "";
                //    //mqttEncryptKey = CurRemoteMACInfo.aesKey;
                //    var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
                //                        .WithClientId (clientId)
                //                        .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
                //                        .WithCredentials (username, passwordRemote)
                //                        .WithCleanSession ()
                //                        // .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
                //                        .Build ();
                //    await DisConnectRemoteMqttClient ("StartRemoteMqtt");
                //    await RemoteMqttClient.ConnectAsync (options1);
                //    remoteIsConnected = true;
                //    IsDisConnectingWithSendCatch = false;
                //} catch (Exception ex) {
                //    Console.WriteLine ("Connect error: " + ex.Message);
                //}
                var url = mMqttInfo.connEmqDomainPort;
                var clientId = mMqttInfo.connEmqClientId;
                var username = mMqttInfo.connEmqUserName;
                var passwordRemote = mMqttInfo.connEmqPwd;
                string mes = "";
                try {
                CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                mqttEncryptKey = CurRemoteMACInfo.aesKey;
                var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
                                    .WithClientId (clientId)
                                    .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
                                    .WithCredentials (username, passwordRemote)
                                    .WithCleanSession ()
                                   // .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
                                    .Build ();
                    var url = mMqttInfo.connEmqDomainPort;
                    var clientId = mMqttInfo.connEmqClientId;
                    var username = mMqttInfo.connEmqUserName;
                    var passwordRemote = mMqttInfo.connEmqPwd;
                await DisConnectRemoteMqttClient ("StartRemoteMqtt");
                await RemoteMqttClient.ConnectAsync (options1);
                remoteIsConnected = true;
                IsDisConnectingWithSendCatch = false;
                //await MqttRemoteSend (new byte [] { 0 }, 1);
                //await MqttRemoteSend (new byte [] { 0 }, 2);
                //await MqttRemoteSend (new byte [] { 0 }, 4);
                    mes = "step1.Set Data";
                    CurRemoteMACInfo.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                    mqttEncryptKey = CurRemoteMACInfo.aesKey;
                    var options1 = new MQTTnet.Client.Options.MqttClientOptionsBuilder ()
                                        .WithClientId (clientId)
                                        .WithTcpServer (url.Split (':') [1].Substring ("//".Length), int.Parse (url.Split (':') [2]))
                                        .WithCredentials (username, passwordRemote)
                                        .WithCleanSession ()
                                        // .WithCommunicationTimeout (new TimeSpan (0, 0, 20))
                                        .Build ();
                    mes = "step2.DisConnect";
                    await DisConnectRemoteMqttClient ("StartRemoteMqtt");
                    //MainPage.AddTip ("Start to connect...");
                    mes = "step3.Start to connect";
                    await RemoteMqttClient.ConnectAsync (options1);
                    mes = "step4.Connected Success";
                    remoteIsConnected = true;
                    IsDisConnectingWithSendCatch = false;
                    //MainPage.AddTip ("Connection succeeded!");
                    //await MqttRemoteSend (new byte [] { 0 }, 1);
                    //await MqttRemoteSend (new byte [] { 0 }, 2);
                    //await MqttRemoteSend (new byte [] { 0 }, 4);
                } catch (Exception ex) {
                    mes = ex.Message;
                    //options1 异常提示
                    //Console.WriteLine("Connect error: " + ex.Message);
                    //MainPage.ShowAlertOnMainThread ("Connect error: " + ex.Message);
                } finally {
                    MainPage.ShowAlertOnMainThread ("finally: " + mes);
                    //MainPage.AddTip ("finally: " + mes);
                }
            }
        }
//        571=Starting remote connection mode...
//572=Getting remote connection parameters...
//573=Successfully obtained parameters, starting to connect...
        /// <summary>
        /// 从开始到连接成功,只提示1次
        /// </summary>
@@ -412,68 +450,7 @@
                    MainPage.AddTip ("Getting remote connection parameters...");
                }
            }
        }
        ///// <summary>
        /////
        ///// </summary>
        ///// <param name="message">附加数据包</param>
        ///// <param name="optionType">操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据;3=订阅网关是否在线主题  4=订阅挤下线主题 </param>
        ///// <returns></returns>
        //public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
        //{
        //    try {
        //        if (!remoteIsConnected) {
        //            Utlis.WriteLine ($"============>Mqtt 未连接 取消发送");
        //            return;
        //        }
        //        var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
        //        switch (optionType) {
        //        case 0:
        //            var messageSend = message;
        //            if (string.IsNullOrEmpty (mqttEncryptKey)) {
        //                topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
        //            } else {
        //                topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/NewON";
        //                messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (message, mqttEncryptKey);
        //            }
        //            //base64加密
        //            var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
        //            //if (remoteIsConnected) {
        //            try {
        //                RemoteMqttClient.PublishAsync (m);
        //            } catch (Exception e) {
        //                //await DisConnectRemoteMqttClient (e.Message);
        //                //await StartCloudMqtt ();
        //                //if (remoteIsConnected) {
        //                //    RemoteMqttClient.PublishAsync (m);
        //                //}
        //            }
        //            //}
        //            break;
        //        case 3:
        //            topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway";
        //            var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
        //            try {
        //                Utlis.WriteLine ("CheckGateway");
        //                RemoteMqttClient.PublishAsync (m1);
        //            } catch (Exception e) {
        //                Utlis.WriteLine ($"CheckGateway Fail:{e.Message}");
        //                //await DisConnectRemoteMqttClient (e.Message);
        //                //await StartCloudMqtt ();
        //            }
        //            break;
        //        }
        //    } catch (Exception e) {
        //    }
        //}
        /// <summary>
        /// 
@@ -518,8 +495,6 @@
        /// SendCatch 后执行一次断开操作
        /// </summary>
        static bool IsDisConnectingWithSendCatch = false;
        /// <summary>
        /// 分享住宅 获取当前住宅网关信息并且连接MQTT 或者刷新  
@@ -600,25 +575,8 @@
                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
                }
            }
            //当前住宅不是分享来
            if (!UserConfig.Instance.CurrentRegion.IsOthreShare) {
                var gatewayListUrl = $"{MainPage.RequestHttpsHostMqtt}/Center/Center/GetGatewayPagger"; //App、Buspro软件登录后获取网关列表 http 请求
                var gatewayListRequestPar = new RemoteRequestParameters () { Mac = CurRemoteMACInfo.mac, LoginAccessToken = mqttRequestParToken, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
                var gatewayListRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (gatewayListRequestPar), gatewayListUrl);
                var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
                if (gatewayListRequestResult_Obj != null && gatewayListRequestResult_Obj.pageData.Count > 0) {
                    var mData = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.HomeGateways [0].GatewayUniqueId);
                    if (mData != null) {
                        CurRemoteMACInfo.aesKey = mData.aesKey;
                        mqttEncryptKey = CurRemoteMACInfo.aesKey;
                    }
                }
            } else {
                GetSingleHomeGatewayPaggerAndMQTTConnectAsync (false);
            }
            //请求刷新一次 网关加密Key
            await GetSingleHomeGatewayPaggerAndMQTTConnectAsync (false);
        }
        /// <summary>
        /// 收到网关掉线信息
@@ -660,48 +618,48 @@
        //}
        /// <summary>
        /// 定时检测网关是否在线
        /// 1.线程休眠间隔5s
        /// 2.发送CheckGateway间隔为9S,收到主题刷新该时间,重置发送次数
        /// 3.发送次数到达3次以上,则判定网关为离线状态
        /// </summary>
        /// <returns></returns>
        static void InitCheckGateway ()
        {
            new System.Threading.Thread (async () => {
                while (true) {
                    try {
//        /// <summary>
//        /// 定时检测网关是否在线
//        /// 1.线程休眠间隔5s
//        /// 2.发送CheckGateway间隔为9S,收到主题刷新该时间,重置发送次数
//        /// 3.发送次数到达3次以上,则判定网关为离线状态
//        /// </summary>
//        /// <returns></returns>
//        static void InitCheckGateway ()
//        {
//            new System.Threading.Thread (async () => {
//                while (true) {
//                    try {
                        if (CommonPage.IsRemote && remoteIsConnected) {
                            if (CheckGatewayCount >= 3) {
                                //连续3次没回复,判定网关超时
                                if (MainPage.WiFiStatus == "CrabtreeAdd/CloudLink.png") {
                                    //IsGatewayOnline = false;
                                    Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
                                    MainPage.AddTip ("Gateway offline!");
                                }
                            }
//                        if (CommonPage.IsRemote && remoteIsConnected) {
//                            if (CheckGatewayCount >= 3) {
//                                //连续3次没回复,判定网关超时
//                                if (MainPage.WiFiStatus == "CrabtreeAdd/CloudLink.png") {
//                                    //IsGatewayOnline = false;
//                                    Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
//                                    MainPage.AddTip ("Gateway offline!");
//                                }
//                            }
                            if (mCheckGatewayTime.AddSeconds (10).Ticks <= System.DateTime.Now.Ticks) {
                                mCheckGatewayTime = DateTime.Now;
                                //CheckGateway
                                MqttRemoteSend (new byte [] { }, 3);
                                CheckGatewayCount++;
#if DEBUG
                                Utlis.WriteLine ("CheckGateway");
#endif
//                            if (mCheckGatewayTime.AddSeconds (10).Ticks <= System.DateTime.Now.Ticks) {
//                                mCheckGatewayTime = DateTime.Now;
//                                //CheckGateway
//                                MqttRemoteSend (new byte [] { }, 3);
//                                CheckGatewayCount++;
//#if DEBUG
//                                Utlis.WriteLine ("CheckGateway");
//#endif
                            }
                        }
//                            }
//                        }
                        System.Threading.Thread.Sleep (5500);
                    } catch { }
//                        System.Threading.Thread.Sleep (5500);
//                    } catch { }
                }
            }) { IsBackground = true }.Start ();
        }
//                }
//            }) { IsBackground = true }.Start ();
//        }
       
        /// <summary>
@@ -710,49 +668,8 @@
        static void ReceiveCheckGatewayTopic () {
            //Utlis.WriteLine ("============>Mqtt CheckGateway网关回复");
            SetGatewayOnlineResetCheck ();
            //旧网关方法
            //MainPage.WiFiStatus = "CrabtreeAdd/CloudUnlink.png";
            //// = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
            //var ss = CommonPage.MyEncodingUTF8.GetString (aesDecryptPayload);
            //var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack> (ss);
            //if (obj == null) {
            //    return;
            //}
            //switch (obj.StateCode) {
            //case "HDLUdpDataForwardServerMqttClientNoOnLine":
            //case "NoOnline":
            //case "NetworkAnomaly"://不在线
            //    MainPage.AddTip ("Gateway offline");
            //    //Application.RunOnMainThread (() => {
            //    //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
            //    //});
            //    break;
            //case "NoRecord"://MAC不正确
            //    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.MACError));
            //    //Application.RunOnMainThread (() => {
            //    //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
            //    //});
            //    break;
            //case "Success":
            //    MainPage.AddTip (UserConfig.Instance.CurrentRegion.Name + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
            //    MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
            //    break;
            //default:
            //    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
            //    //Application.RunOnMainThread (() => {
            //    //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
            //    //});
            //    break;
            //}
            //Application.RunOnMainThread (() => {
            //    UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
            //});
        }
        
        /// <summary>
        /// 收到挤下线推送
        /// </summary>
@@ -761,7 +678,6 @@
            Utlis.WriteLine ($"============>MqttNotifySqueeze: {ErrorCode.LoginInAnotherDevice}");
            var mMes = CommonPage.MyEncodingUTF8.GetString (mes);
            if (mMes == PushSignStr) return;//是自己的登录推送不处理
            CommonPage.IsRemote = false;
@@ -779,7 +695,6 @@
            MainPage.ShowAlertOnMainThread (ErrorCode.LoginInAnotherDevice);
            Application.RunOnMainThread (() => {
                MainPage.WiFiStatus = "CrabtreeAdd/WiFi.png";
                UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
                new AccountLogin ().Show ();
@@ -792,7 +707,6 @@
public class ShareMemberConnMqttInfoObj : GetConnMqttInfoObj
{
    /// <summary>
    /// 主人用户Id 
    /// </summary>
@@ -819,6 +733,10 @@
    /// 
    /// </summary>
    public string PublishPayloadJsonStr = "";
    /// <summary>
    /// Mac
    /// </summary>
    public string Mac = "";
}
public class RemoteRequestParameters
@@ -852,6 +770,8 @@
    public string connEmqClientId;
    public string connEmqUserName;
    public string connEmqPwd;
    public List<RemoteMACInfo> AccountAllGateways;
}
public class RemoteMACInfo
@@ -865,6 +785,8 @@
    public string projectName;
    public string userName;
    public string clientId;
    //app自定义数据
    public string md5_mac_string;
    public string LoginAccessToken;