JLChen
2020-01-12 ac2ee45fadc64fe840bbba6264df3ca4622adb15
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -68,13 +68,13 @@
        public static async System.Threading.Tasks.Task StartCloudMqtt ()
        {
                Application.RunOnMainThread (() => {
                    if (5 < (DateTime.Now - dateTime).TotalSeconds) {
                        return;
                    }
                    //MainPage.Loading.Start (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Connecting));
                    dateTime = DateTime.Now;
                });
                //Application.RunOnMainThread (() => {
                //    if (5 < (DateTime.Now - dateTime).TotalSeconds) {
                //        return;
                //    }
                //    //MainPage.Loading.Start (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Connecting));
                //    dateTime = DateTime.Now;
                //});
                if (!MainPage.LoginUser.IsLogin) {
                    return;
                }
@@ -101,13 +101,17 @@
                                        }
                                        var aesDecryptTopic = e.ApplicationMessage.Topic;
                                        var aesDecryptPayload = e.ApplicationMessage.Payload;
                                        //Console.WriteLine ("Topic={0}", aesDecryptTopic);
                                        Console.WriteLine ("Topic={0}", aesDecryptTopic);
                                        if (aesDecryptTopic == $"NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}") {//网关上线,需要更新aeskey
                                                                                                                                 //----第二步:读取账号下面的网关列表
                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/Center/Center/GetGatewayPagger"; //App、Buspro软件登录后获取网关列表 http 请求
                                        //if (aesDecryptTopic == $"NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}") {//网关上线,需要更新aeskey
                                        //2020-01-11 修改订阅主题地址
                                        if (aesDecryptTopic == $"BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayInfoChange") {//网关上线,需要更新aeskey
                                            Console.WriteLine ("网关上线,需要更新aeskey");
                                            //----第二步:读取账号下面的网关列表
                                            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), false, false, gatewayListUrl);
                                            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) {
                                                CurRemoteMACInfo.aesKey = gatewayListRequestResult_Obj.pageData [0].aesKey;
@@ -116,6 +120,7 @@
                                        }
                                        if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/CheckGateway") {
                                            MainPage.WiFiStatus = "CrabtreeAdd/CloudUnlink.png";
                                            // = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
                                            var ss = CommonPage.MyEncodingUTF8.GetString (aesDecryptPayload);
                                            var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<ResponsePack> (ss);
@@ -127,34 +132,35 @@
                                            case "NoOnline":
                                            case "NetworkAnomaly"://不在线
                                                MainPage.AddTip ("Gateway offline");
                                                Application.RunOnMainThread (() => {
                                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                                });
                                                //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;
                                                });
                                                //Application.RunOnMainThread (() => {
                                                //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                                //});
                                                break;
                                            case "Success":
                                                MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
                                                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;
                                                });
                                                //Application.RunOnMainThread (() => {
                                                //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                                //});
                                                break;
                                            }
                                            Application.RunOnMainThread (() => {
                                                UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
                                            });
                                        } else {
                                            if (!string.IsNullOrEmpty (mqttEncryptKey)) {
                                                aesDecryptTopic = Shared.Securitys.EncryptionService.AesDecryptTopic (e.ApplicationMessage.Topic, mqttEncryptKey);
                                                aesDecryptPayload = Shared.Securitys.EncryptionService.AesDecryptPayload (e.ApplicationMessage.Payload, mqttEncryptKey);
                                            } else {
                                                aesDecryptTopic = e.ApplicationMessage.Topic;
                                                aesDecryptPayload = e.ApplicationMessage.Payload;
                                            }
                                        }
                                        var packet = new Packet ();
                                        packet.Bytes = aesDecryptPayload;
@@ -172,7 +178,7 @@
                                        if (CommonPage.IsRemote) {
                                            Application.RunOnMainThread (() => {
                                                MainPage.Loading.Hide ();
                                                Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                                //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                            });
                                        }
                                    } else {
@@ -182,19 +188,23 @@
                            }
                            if (RemoteMqttClient.ConnectedHandler == null) {
                                RemoteMqttClient.UseConnectedHandler (async (e) => {
                                    Shared.Application.RunOnMainThread (() => {
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
                                    });
                                    //Shared.Application.RunOnMainThread (() => {
                                    //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
                                    //});
                                    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
                                    System.Console.WriteLine ($"远程连接成功");
                                    MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
                                    UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
                                    if (CommonPage.IsRemote) {
                                        Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
                                    }
                                    //MainPage.WiFiStatus = "CrabtreeAdd/CloudLink.png";
                                    //UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
                                    if (CurRemoteMACInfo != null) {
                                        if (CurRemoteMACInfo.isValid == "InValid") {
                                            MainPage.AddTip ("Remote failed,gateway offline");
                                            Application.RunOnMainThread (() => {
                                                MainPage.Loading.Hide ();
                                                Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                                //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                            });
                                        } else {
                                            MqttRemoteSend (new byte [] { 0 }, 3);
@@ -215,13 +225,13 @@
                        try {
                            try {
                                //断开后重新链接需要重新登录获取连接的密码
                                var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
                                var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password };
                                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                                var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
                                var tempResult = MainPage.RequestHttps (API.Login, requestJson);
                                if (tempResult == null) {
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    return;
                                }
@@ -240,33 +250,43 @@
                                    return;
                                }
                                var requestObj3 = new GatewayByRegionListObj () { RegionID = UserConfig.Instance.CurrentRegion.RegionID };
                                var requestObj3 = new GetSingleHomeGatewayPaggerObj ();
                                requestObj3.ReqDto.LoginAccessToken = MainPage.LoginUser.LoginTokenString;
                                requestObj3.ReqDto.HomeId = UserConfig.Instance.CurrentRegion.Id;
                                requestObj3.ReqDto.PageSetting.Page = 1;
                                requestObj3.ReqDto.PageSetting.PageSize = 10;
                                string urlHead = MainPage.RequestHttpsHost;
                                if (requestObj3.IsOtherAccountCtrl) {
                                    urlHead = UserConfig.Instance.MasterAccountRequestBaseUrl;
                                    requestObj3.ReqDto.LoginAccessToken = UserConfig.Instance.MasterAccountToken;
                                }
                                //var requestObj3 = new GatewayByRegionListObj () { RegionID = UserConfig.Instance.CurrentRegion.Id };
                                var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3);
                                var revertObj3 = MainPage.RequestHttps ("GatewayByRegionList", requestJson3, true, false);
                                if (revertObj3.StateCode == "SUCCESS") {
                                    var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GatewayRes>> (revertObj3.ResponseData.ToString ());
                                    var gatewayList = responseDataObj;
                                    if (gatewayList != null && gatewayList.Count > 0) {
                                        UserConfig.Instance.CurrentRegion.MAC = gatewayList [0].MAC;
                                        UserConfig.Instance.SaveUserConfig ();
                                        Console.WriteLine ("Remote mqtt get Region MAC : " + gatewayList [0].MAC);
                                    }
                                var revertObj3 = MainPage.RequestHttps (API.GetSingleHomeGatewayPagger, requestJson3, urlHead);
                                if (revertObj3.StateCode.ToUpper() == "SUCCESS") {
                                    var infoResult = Newtonsoft.Json.JsonConvert.DeserializeObject<GetGatewayResult> (revertObj3.ResponseData.ToString ());
                                    //2020-01-11
                                    UserConfig.Instance.SetNowHomeGateways (infoResult.PageData);
                                } else {
                                    //提示错误
                                    //GetSingleHomeGatewayPagger
                                }
                                if (tempResult == null) {
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    return;
                                }
                                //--第一步:获取mqtt链接参数
                                var mqttInfoUrl = @"https://developer.hdlcontrol.com/Center/Center/GetConnMqttInfo";//获取连接远程云端Emq Mqtt 服务器连接信息
                                var mqttInfoRequestPar = new RemoteRequestParameters () { LoginAccessToken = mqttRequestParToken, RequestVersion = MainPage.CodeIDString, RequestProtocolType = 0, RequestSource = 1 };
                                var mqttInfoRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar), false, false, mqttInfoUrl);
                                if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                                    try {
                                try {
                                    //--第一步:获取mqtt链接参数
                                    var mqttInfoUrl = $"{MainPage.RequestHttpsHostMqtt}/Center/Center/GetConnMqttInfo";//获取连接远程云端Emq Mqtt 服务器连接信息
                                    var mqttInfoRequestPar = new RemoteRequestParameters () { LoginAccessToken = mqttRequestParToken, RequestVersion = MainPage.RequestVersion, RequestProtocolType = 0, RequestSource = 1 };
                                    var mqttInfoRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (mqttInfoRequestPar), mqttInfoUrl);
                                    if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) {
                                        var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                                        if (mqttInfoRequestResult_Obj != null) {
                                            url = mqttInfoRequestResult_Obj.connEmqDomainPort;
@@ -274,31 +294,38 @@
                                            username = mqttInfoRequestResult_Obj.connEmqUserName;
                                            passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
                                            //----第二步:读取账号下面的网关列表
                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/Center/Center/GetGatewayPagger"; //App、Buspro软件登录后获取网关列表 http 请求
                                            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), false, false, gatewayListUrl);
                                            var gatewayListRequestResult = MainPage.RequestHttps ("", Newtonsoft.Json.JsonConvert.SerializeObject (gatewayListRequestPar), gatewayListUrl);
                                            var gatewayListRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
                                            //--找出是否存在匹配当前住宅的mac,存在再进行远程。
                                            CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.MAC);
                                            if (CurRemoteMACInfo != null) {
                                                CurRemoteMACInfo.LoginAccessToken = mqttRequestPar.Token;
                                                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 ();
                                            if (UserConfig.Instance.CheckHomeGateways ()) {
                                                CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.HomeGateways[0].GatewayUniqueId);
                                                CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData [0];
                                                if (CurRemoteMACInfo != null) {
                                                    CurRemoteMACInfo.LoginAccessToken = mqttRequestPar.Token;
                                                    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;
                                                await MqttRemoteSend (new byte [] { 0 }, 1);
                                                await MqttRemoteSend (new byte [] { 0 }, 2);
                                                    await DisConnectRemoteMqttClient ("StartRemoteMqtt");
                                                    await RemoteMqttClient.ConnectAsync (options1);
                                                    remoteIsConnected = true;
                                                    await MqttRemoteSend (new byte [] { 0 }, 1);
                                                    await MqttRemoteSend (new byte [] { 0 }, 2);
                                                }
                                            }
                                        }
                                    } catch { }
                                    }
                                } catch (Exception ex) {
                                    Console.WriteLine (ex.Message);
                                }
                            } catch (Exception ex) {
                                System.Console.WriteLine ("============>" + ex.Message);
@@ -306,7 +333,7 @@
                                    //MainPage.Loading.Hide ();
                                    //isConnecting = false.ToString ();
                                    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
#if DEBUG
                                Alert a = new Alert (remoteMqttIsConnecting.ToString (), ex.Message, "Close");
                                a.Show ();
@@ -348,7 +375,7 @@
                    }
                    //base64加密
                    var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
                    if (remoteIsConnected) {
                    //if (remoteIsConnected) {
                        try {
                            await RemoteMqttClient.PublishAsync (m);
                        } catch (Exception e) {
@@ -358,11 +385,11 @@
                                await RemoteMqttClient.PublishAsync (m);
                            }
                        }
                    }
                    //}
                    break;
                case 1:
                    topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#";
                    if (remoteIsConnected) {
                    //if (remoteIsConnected) {
                        try {
                            await RemoteMqttClient.SubscribeAsync (topicName);
                        } catch (Exception e) {
@@ -372,7 +399,7 @@
                                await RemoteMqttClient.SubscribeAsync (topicName);
                            }
                        }
                    }
                   // }
                    break;
                case 2:
                    var macStr = CurRemoteMACInfo.mac.ToUpper ();
@@ -389,9 +416,11 @@
                        CurRemoteMACInfo.md5_mac_string = builder.ToString ().ToUpper ();
                    }
                    topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
                    if (remoteIsConnected) {
                        try {
                    //topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
                    //2020-01-11 修改订阅主题地址
                    topicName = $"BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayInfoChange";
                    //if (remoteIsConnected) {
                    try {
                            await RemoteMqttClient.SubscribeAsync (topicName);
                        } catch (Exception e) {
                            await DisConnectRemoteMqttClient (e.Message);
@@ -400,7 +429,7 @@
                                await RemoteMqttClient.SubscribeAsync (topicName);
                            }
                        }
                    }
                    //}
                    break;
                case 3:
@@ -690,7 +719,7 @@
                        var requestObj3 = new GatewayByRegionListObj () { RegionID = UserConfig.Instance.CurrentRegion.RegionID };
                        var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj3);
                        var revertObj3 = MainPage.RequestHttps ("GatewayByRegionList", requestJson3, true, false);
                        if (revertObj3.StateCode == "SUCCESS") {
                        if (revertObj3.StateCode.ToUpper() == "SUCCESS") {
                            var responseDataObj = Newtonsoft.Json.JsonConvert.DeserializeObject<List<GatewayRes>> (revertObj3.ResponseData.ToString ());
                            var gatewayList = responseDataObj;
                            if (gatewayList != null && gatewayList.Count > 0) {
@@ -1089,4 +1118,4 @@
    }
}
*/
*/