JLChen
2020-08-12 b4bb337bdce4d09473a45610e09350056326c87a
2020-08-12 1.去掉加密相关代码,解决客户反馈Google Play上架不了。
6个文件已修改
2084 ■■■■ 已修改文件
Crabtree/.vs/SmartHome/xs/UserPrefs.xml 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/.vs/SmartHome/xs/sqlite3/storage.ide 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/ON/Properties/AndroidManifest.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/HDL/Operation/Control.cs 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/UI/SimpleControl/MainPage.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs 1990 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Crabtree/.vs/SmartHome/xs/UserPrefs.xml
@@ -1,32 +1,22 @@
<Properties StartupConfiguration="{9D9EF20B-6E65-4A65-92BF-567EBF1E1443}|Default">
<Properties StartupConfiguration="{1D83BF28-BA88-4152-BA41-D7EFE90A5437}|Default">
  <MonoDevelop.Ide.ItemProperties.ON.Droid PreferredExecutionTarget="Android.Android_Accelerated_Oreo" />
  <MonoDevelop.Ide.Workbench>
    <Files>
      <File FileName="SmartHome/UI/SimpleControl/Phone/User/UserSettingView.cs" Line="1" Column="1" />
      <File FileName="ON/Properties/AndroidManifest.xml" />
      <File FileName="SmartHome/UI/SimpleControl/MainPage.cs" />
      <File FileName="SmartHome/UI/SimpleControl/Phone/User/UserMiddle.cs" />
      <File FileName="SmartHome/UI/SimpleControl/MqttCommon.cs" />
      <File FileName="SmartHome/HDL/Operation/UserConfig.cs" />
      <File FileName="ON.Ios/Info.plist" />
      <File FileName="SmartHome/UI/SimpleControl/MainPage.cs" Line="1" Column="1" />
      <File FileName="SmartHome/UI/SimpleControl/MqttCommon.cs" Line="1082" Column="43" />
      <File FileName="SmartHome/UI/SimpleControl/Phone/Register/AccountLogin.cs" Line="14" Column="10" />
    </Files>
    <Pads>
      <Pad Id="ProjectPad">
        <State name="__root__">
          <Node name="SmartHome" expanded="True">
            <Node name="ON.Ios" expanded="True" selected="True" />
            <Node name="Shared" expanded="True">
              <Node name="HDL" expanded="True">
                <Node name="Operation" expanded="True" />
              </Node>
              <Node name="UI" expanded="True">
                <Node name="SimpleControl" expanded="True">
                  <Node name="Phone" expanded="True">
                    <Node name="Alexa" expanded="True" />
                    <Node name="Guide" expanded="True" />
                    <Node name="Register" expanded="True" />
                    <Node name="System" expanded="True" />
                    <Node name="User" expanded="True" />
                    <Node name="Register" expanded="True">
                      <Node name="AccountLogin.cs" selected="True" />
                    </Node>
                  </Node>
                </Node>
              </Node>
Crabtree/.vs/SmartHome/xs/sqlite3/storage.ide
Binary files differ
Crabtree/ON/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hdl.crabtree" android:versionCode="202007231" android:versionName="2.507231">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.hdl.crabtree" android:versionCode="202007271" android:versionName="2.507271">
    <uses-sdk android:minSdkVersion="26" android:targetSdkVersion="28" />
    <!-- 在安卓P版本之后,必须要授予FOREGROUND_SERVICE权限,才能够使用前台服务 -->
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
Crabtree/SmartHome/HDL/Operation/Control.cs
@@ -394,41 +394,41 @@
                }
            }
            return;
            if (Shared.SimpleControl.CommonPage.IsRemote && !isLocal) {
                System.Console.WriteLine ("远程发送数据:" + SendFlag);
                SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
                Packet.FlagDateTime = DateTime.Now;
                Packet.HaveSendCount--;
                //这里是重发两次
                while (Packet.HaveSendCount < 3) {
                    if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
                        SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
                        System.Console.WriteLine ("重发远程发送数据:" + SendFlag);
                        Packet.FlagDateTime = DateTime.Now;
                        Packet.HaveSendCount++;
                    }
                    System.Threading.Thread.Sleep (100);
                }
                allDone.Set ();
            } else {
                try {
                    System.Console.WriteLine ("发送数据:" + SendFlag);
                    BusSocket.AsyncBeginSend (Packet);
                    Packet.HaveSendCount--;
            //if (Shared.SimpleControl.CommonPage.IsRemote && !isLocal) {
            //    System.Console.WriteLine ("远程发送数据:" + SendFlag);
            //    SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
            //    Packet.FlagDateTime = DateTime.Now;
            //    Packet.HaveSendCount--;
            //    //这里是重发两次
            //    while (Packet.HaveSendCount < 3) {
            //        if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
            //            SmartHome.MqttCommon.MqttRemoteSend (Packet.Bytes);
            //            System.Console.WriteLine ("重发远程发送数据:" + SendFlag);
            //            Packet.FlagDateTime = DateTime.Now;
            //            Packet.HaveSendCount++;
            //        }
            //        System.Threading.Thread.Sleep (100);
            //    }
            //    allDone.Set ();
            //} else {
            //    try {
            //        System.Console.WriteLine ("发送数据:" + SendFlag);
            //        BusSocket.AsyncBeginSend (Packet);
            //        Packet.HaveSendCount--;
                    //这里是重发两次
                    while (Packet.HaveSendCount < 3) {
                        if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
                            System.Console.WriteLine ("重发数据:" + SendFlag);
                            BusSocket.AsyncBeginSend (Packet);
                        }
                        System.Threading.Thread.Sleep (100);
                    }
            //        //这里是重发两次
            //        while (Packet.HaveSendCount < 3) {
            //            if (Packet.FlagDateTime.AddMilliseconds (1000).Ticks <= System.DateTime.Now.Ticks) {
            //                System.Console.WriteLine ("重发数据:" + SendFlag);
            //                BusSocket.AsyncBeginSend (Packet);
            //            }
            //            System.Threading.Thread.Sleep (100);
            //        }
                } catch (Exception ex) {
                    Console.WriteLine ("managerSendCount:" + ex.ToString ());
                } finally {
                    allDone.Set ();
                }
            }
            //    } catch (Exception ex) {
            //        Console.WriteLine ("managerSendCount:" + ex.ToString ());
            //    } finally {
            //        allDone.Set ();
            //    }
            //}
        }
        /// <summary>
        /// 当前数据包
Crabtree/SmartHome/UI/SimpleControl/MainPage.cs
@@ -39,7 +39,7 @@
        //public static Button LogoButton = new Button ();
        public static string CodeIDString = "20200723";
        public static string CodeIDString = "20200727";
        public static UserInfo LoginUser;
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -1,1100 +1,1100 @@
/*
更新了EMQ连接方式
*/
using System.Collections.Generic;
using System;
using MQTTnet.Client;
using System.Threading.Tasks;
using Shared;
using Shared.SimpleControl;
using MQTTnet;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using Shared.SimpleControl.Phone;
///*
//更新了EMQ连接方式
//*/
//using System.Collections.Generic;
//using System;
//using MQTTnet.Client;
//using System.Threading.Tasks;
//using Shared;
//using Shared.SimpleControl;
//using MQTTnet;
//using System.Text;
//using System.Security.Cryptography;
//using System.IO;
//using Shared.SimpleControl.Phone;
namespace SmartHome
{
    public static class MqttCommon
    {
        static string mqttEncryptKey = "";
        static string checkGatewayTopicBase64 = "";
        static RemoteMACInfo CurRemoteMACInfo = null;
//namespace SmartHome
//{
//    public static class MqttCommon
//    {
//        static string mqttEncryptKey = "";
//        static string checkGatewayTopicBase64 = "";
//        static RemoteMACInfo CurRemoteMACInfo = null;
        /// <summary>
        /// 手机标识
        /// </summary>
        static Guid currentGuid = Guid.NewGuid ();
//        /// <summary>
//        /// 手机标识
//        /// </summary>
//        static Guid currentGuid = Guid.NewGuid ();
        /// <summary>
        /// 外网的MQTT是否正在连接
        /// </summary>
        /// <summary>
        /// 远程MqttClient
        /// </summary>
        /// <summary>
        /// 远程MqttClient
        /// </summary>
        public static IMqttClient RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
//        /// <summary>
//        /// 外网的MQTT是否正在连接
//        /// </summary>
//        /// <summary>
//        /// 远程MqttClient
//        /// </summary>
//        /// <summary>
//        /// 远程MqttClient
//        /// </summary>
//        public static IMqttClient RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
        static bool thisShowTip = true;
        static string mqttRequestParToken="";
//        static bool thisShowTip = true;
//        static string mqttRequestParToken="";
        /// <summary>
        /// 断开远程Mqtt的链接
        /// </summary>
        public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
        {
            try {
                if (remoteIsConnected) {
                    remoteIsConnected = false;
                    System.Console.WriteLine ($"Remote主动断开_{s}");
                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
                    await RemoteMqttClient.DisconnectAsync ();
                }
            } catch (Exception e) {
                System.Console.WriteLine ($"Remote断开通讯连接出异常:{e.Message}");
            }
        }
        static DateTime dateTime = DateTime.MinValue;
        /// <summary>
        /// 外网的MQTT是否正在连接
        /// </summary>
        static bool remoteMqttIsConnecting;
        static bool remoteIsConnected;
        /// <summary>
        /// 启动远程Mqtt
        /// </summary>
        public static async System.Threading.Tasks.Task StartCloudMqtt ()
        {
//        /// <summary>
//        /// 断开远程Mqtt的链接
//        /// </summary>
//        public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
//        {
//            try {
//                if (remoteIsConnected) {
//                    remoteIsConnected = false;
//                    System.Console.WriteLine ($"Remote主动断开_{s}");
//                    //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
//                    await RemoteMqttClient.DisconnectAsync ();
//                }
//            } catch (Exception e) {
//                System.Console.WriteLine ($"Remote断开通讯连接出异常:{e.Message}");
//            }
//        }
//        static DateTime dateTime = DateTime.MinValue;
//        /// <summary>
//        /// 外网的MQTT是否正在连接
//        /// </summary>
//        static bool remoteMqttIsConnecting;
//        static bool remoteIsConnected;
//        /// <summary>
//        /// 启动远程Mqtt
//        /// </summary>
//        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;
                });
                if (!MainPage.LoginUser.IsLogin) {
                    return;
                }
                //追加:没有远程连接的权限
                if (remoteMqttIsConnecting
                   || remoteIsConnected) {
                    return;
                }
//                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;
//                }
//                //追加:没有远程连接的权限
//                if (remoteMqttIsConnecting
//                   || remoteIsConnected) {
//                    return;
//                }
                await System.Threading.Tasks.Task.Factory.StartNew (async () =>
                {
                    try {
                        lock (RemoteMqttClient) {
                            //表示后面将进行连接
                            remoteMqttIsConnecting = true;
//                await System.Threading.Tasks.Task.Factory.StartNew (async () =>
//                {
//                    try {
//                        lock (RemoteMqttClient) {
//                            //表示后面将进行连接
//                            remoteMqttIsConnecting = true;
                            #region 初始化远程Mqtt
                            //(3)当[连接云端的Mqtt成功后]或者[以及后面App通过云端Mqtt转发数据给网关成功后],处理接收到云端数据包响应时在mqttServerClient_ApplicationMessageReceived这个方法处理
                            if (RemoteMqttClient.ApplicationMessageReceivedHandler == null) {
                                RemoteMqttClient.UseApplicationMessageReceivedHandler ((e) => {
                                    try {
                                        if (!RemoteMqttClient.IsConnected || !CommonPage.IsRemote) {
                                            return;
                                        }
                                        var aesDecryptTopic = e.ApplicationMessage.Topic;
                                        var aesDecryptPayload = e.ApplicationMessage.Payload;
                                        //Console.WriteLine ("Topic={0}", aesDecryptTopic);
//                            #region 初始化远程Mqtt
//                            //(3)当[连接云端的Mqtt成功后]或者[以及后面App通过云端Mqtt转发数据给网关成功后],处理接收到云端数据包响应时在mqttServerClient_ApplicationMessageReceived这个方法处理
//                            if (RemoteMqttClient.ApplicationMessageReceivedHandler == null) {
//                                RemoteMqttClient.UseApplicationMessageReceivedHandler ((e) => {
//                                    try {
//                                        if (!RemoteMqttClient.IsConnected || !CommonPage.IsRemote) {
//                                            return;
//                                        }
//                                        var aesDecryptTopic = e.ApplicationMessage.Topic;
//                                        var aesDecryptPayload = e.ApplicationMessage.Payload;
//                                        //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 请求
                                            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_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;
                                                mqttEncryptKey = CurRemoteMACInfo.aesKey;
                                            }
                                        }
//                                        if (aesDecryptTopic == $"NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}") {//网关上线,需要更新aeskey
//                                                                                                                                 //----第二步:读取账号下面的网关列表
//                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/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_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;
//                                                mqttEncryptKey = CurRemoteMACInfo.aesKey;
//                                            }
//                                        }
                                        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);
                                            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.RegionName + ":" + 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;
                                            });
                                        } 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;
                                        packet.Manager ();
                                    } catch { }
                                });
                            }
//                                        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);
//                                            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.RegionName + ":" + 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;
//                                            });
//                                        } 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;
//                                        packet.Manager ();
//                                    } catch { }
//                                });
//                            }
                            if (RemoteMqttClient.DisconnectedHandler == null) {
                                RemoteMqttClient.UseDisconnectedHandler (async (e) => {
                                    System.Console.WriteLine ($"远程连接断开");
                                    await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
                                    //await StartRemoteMqtt();
                                    if (thisShowTip) {
                                        if (CommonPage.IsRemote) {
                                            Application.RunOnMainThread (() => {
                                                MainPage.Loading.Hide ();
                                                //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                            });
                                        }
                                    } else {
                                        thisShowTip = true;
                                    }
                                });
                            }
                            if (RemoteMqttClient.ConnectedHandler == null) {
                                RemoteMqttClient.UseConnectedHandler (async (e) => {
                                    //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 (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;
                                            });
                                        } else {
                                            MqttRemoteSend (new byte [] { 0 }, 3);
                                            //Application.RunOnMainThread (() => {
                                            //    MainPage.Loading.Hide ();
                                            //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
                                            //    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
                                            //});
                                            //MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
                                        }
                                    }
//                            if (RemoteMqttClient.DisconnectedHandler == null) {
//                                RemoteMqttClient.UseDisconnectedHandler (async (e) => {
//                                    System.Console.WriteLine ($"远程连接断开");
//                                    await DisConnectRemoteMqttClient ("StartRemoteMqtt.DisconnectedHandler");
//                                    //await StartRemoteMqtt();
//                                    if (thisShowTip) {
//                                        if (CommonPage.IsRemote) {
//                                            Application.RunOnMainThread (() => {
//                                                MainPage.Loading.Hide ();
//                                                //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                            });
//                                        }
//                                    } else {
//                                        thisShowTip = true;
//                                    }
//                                });
//                            }
//                            if (RemoteMqttClient.ConnectedHandler == null) {
//                                RemoteMqttClient.UseConnectedHandler (async (e) => {
//                                    //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 (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;
//                                            });
//                                        } else {
//                                            MqttRemoteSend (new byte [] { 0 }, 3);
//                                            //Application.RunOnMainThread (() => {
//                                            //    MainPage.Loading.Hide ();
//                                            //    Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
//                                            //    Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
//                                            //});
//                                            //MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
//                                        }
//                                    }
                                });
                            }
                            #endregion
                        }
//                                });
//                            }
//                            #endregion
//                        }
                        try {
                            try {
                                //断开后重新链接需要重新登录获取连接的密码
                                var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
                                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                                var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
                                if (tempResult == null) {
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    return;
                                }
                                var responsePack = tempResult.ResponseData;
                                var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
                                var mqttRequestPar = Newtonsoft.Json.JsonConvert.DeserializeObject<UserLoginRes> (tempResult.ResponseData.ToString ());
                                mqttRequestParToken = mqttRequestPar.Token;
                                //还有种情况是同一个ID 有多个设备用这个id连接(会导致中断)
                                //mqttEncryptKey = dictrionaryResult ["HdlOnMqttKey"]?.ToString ();
                                var url = dictrionaryResult ["ConnectMqttBrokerLoadSubDomain"]?.ToString ();
                                var clientId = dictrionaryResult ["ConnectMqttClientId"]?.ToString ();
                                var username = dictrionaryResult ["ConnectMqttBrokerUserName"]?.ToString ();
                                var passwordRemote = dictrionaryResult ["ConnectMqttBrokerPwd"]?.ToString ();
//                        try {
//                            try {
//                                //断开后重新链接需要重新登录获取连接的密码
//                                var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
//                                var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
//                                var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
//                                if (tempResult == null) {
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                    return;
//                                }
//                                var responsePack = tempResult.ResponseData;
//                                var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
//                                var mqttRequestPar = Newtonsoft.Json.JsonConvert.DeserializeObject<UserLoginRes> (tempResult.ResponseData.ToString ());
//                                mqttRequestParToken = mqttRequestPar.Token;
//                                //还有种情况是同一个ID 有多个设备用这个id连接(会导致中断)
//                                //mqttEncryptKey = dictrionaryResult ["HdlOnMqttKey"]?.ToString ();
//                                var url = dictrionaryResult ["ConnectMqttBrokerLoadSubDomain"]?.ToString ();
//                                var clientId = dictrionaryResult ["ConnectMqttClientId"]?.ToString ();
//                                var username = dictrionaryResult ["ConnectMqttBrokerUserName"]?.ToString ();
//                                var passwordRemote = dictrionaryResult ["ConnectMqttBrokerPwd"]?.ToString ();
                                if (clientId == null || username == null || passwordRemote == null) {
                                    return;
                                }
//                                if (clientId == null || username == null || passwordRemote == null) {
//                                    return;
//                                }
                                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") {
                                    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 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") {
//                                    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);
//                                    }
//                                }
                                if (tempResult == null) {
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    return;
                                }
                                try {
                                    //--第一步:获取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) {
                                        var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
                                        if (mqttInfoRequestResult_Obj != null) {
                                            url = mqttInfoRequestResult_Obj.connEmqDomainPort;
                                            clientId = mqttInfoRequestResult_Obj.connEmqClientId;
                                            username = mqttInfoRequestResult_Obj.connEmqUserName;
                                            passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
                                            //----第二步:读取账号下面的网关列表
                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/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_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
                                            //--找出是否存在匹配当前住宅的mac,存在再进行远程。
                                            CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.MAC);
                                            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 ();
//                                if (tempResult == null) {
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                    return;
//                                }
//                                try {
//                                    //--第一步:获取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) {
//                                        var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttInfo> (mqttInfoRequestResult.ResponseData.ToString ());
//                                        if (mqttInfoRequestResult_Obj != null) {
//                                            url = mqttInfoRequestResult_Obj.connEmqDomainPort;
//                                            clientId = mqttInfoRequestResult_Obj.connEmqClientId;
//                                            username = mqttInfoRequestResult_Obj.connEmqUserName;
//                                            passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd;
//                                            //----第二步:读取账号下面的网关列表
//                                            var gatewayListUrl = @"https://developer.hdlcontrol.com/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_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject<MqttRemoteInfo> (gatewayListRequestResult.ResponseData.ToString ());
//                                            //--找出是否存在匹配当前住宅的mac,存在再进行远程。
//                                            CurRemoteMACInfo = gatewayListRequestResult_Obj.pageData.Find ((obj) => obj.mac == UserConfig.Instance.CurrentRegion.MAC);
//                                            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 (Exception ex) {
                                    Console.WriteLine (ex.Message);
                                }
                            } catch (Exception ex) {
                                System.Console.WriteLine ("============>" + ex.Message);
                                Application.RunOnMainThread (() => {
                                    //MainPage.Loading.Hide ();
                                    //isConnecting = false.ToString ();
//                                    }
//                                } catch (Exception ex) {
//                                    Console.WriteLine (ex.Message);
//                                }
//                            } catch (Exception ex) {
//                                System.Console.WriteLine ("============>" + ex.Message);
//                                Application.RunOnMainThread (() => {
//                                    //MainPage.Loading.Hide ();
//                                    //isConnecting = false.ToString ();
                                    //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
#if DEBUG
                                Alert a = new Alert (remoteMqttIsConnecting.ToString (), ex.Message, "Close");
                                a.Show ();
#endif
                                });
                            } finally {
                                Application.RunOnMainThread (() => {
                                    MainPage.Loading.Hide ();
                                });
                            }
                        } catch { } finally {
                            //最终要释放连接状态
                            remoteMqttIsConnecting = false;
                        }
                    } catch (Exception ex) {
                        System.Console.WriteLine ($"远程连接通讯连接出异常:{ex.Message}");
                    }
                });
        }
//                                    //Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//#if DEBUG
//                                Alert a = new Alert (remoteMqttIsConnecting.ToString (), ex.Message, "Close");
//                                a.Show ();
//#endif
//                                });
//                            } finally {
//                                Application.RunOnMainThread (() => {
//                                    MainPage.Loading.Hide ();
//                                });
//                            }
//                        } catch { } finally {
//                            //最终要释放连接状态
//                            remoteMqttIsConnecting = false;
//                        }
//                    } catch (Exception ex) {
//                        System.Console.WriteLine ($"远程连接通讯连接出异常:{ex.Message}");
//                    }
//                });
//        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="message">附加数据包</param>
        /// <param name="optionType">操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据</param>
        /// <returns></returns>
        public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
        {
            try {
                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 {
                            await RemoteMqttClient.PublishAsync (m);
                        } catch (Exception e) {
                            await DisConnectRemoteMqttClient (e.Message);
                            await StartCloudMqtt ();
                            if (remoteIsConnected) {
                                await RemoteMqttClient.PublishAsync (m);
                            }
                        }
                    }
                    break;
                case 1:
                    topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#";
                    if (remoteIsConnected) {
                        try {
                            await RemoteMqttClient.SubscribeAsync (topicName);
                        } catch (Exception e) {
                            await DisConnectRemoteMqttClient (e.Message);
                            await StartCloudMqtt ();
                            if (remoteIsConnected) {
                                await RemoteMqttClient.SubscribeAsync (topicName);
                            }
                        }
                    }
                    break;
                case 2:
                    var macStr = CurRemoteMACInfo.mac.ToUpper ();
                    char [] cArrs = macStr.ToCharArray ();
                    Array.Reverse (cArrs);
                    var sss = string.Join (string.Empty, cArrs);
//        /// <summary>
//        ///
//        /// </summary>
//        /// <param name="message">附加数据包</param>
//        /// <param name="optionType">操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据</param>
//        /// <returns></returns>
//        public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
//        {
//            try {
//                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 {
//                            await RemoteMqttClient.PublishAsync (m);
//                        } catch (Exception e) {
//                            await DisConnectRemoteMqttClient (e.Message);
//                            await StartCloudMqtt ();
//                            if (remoteIsConnected) {
//                                await RemoteMqttClient.PublishAsync (m);
//                            }
//                        }
//                    }
//                    break;
//                case 1:
//                    topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#";
//                    if (remoteIsConnected) {
//                        try {
//                            await RemoteMqttClient.SubscribeAsync (topicName);
//                        } catch (Exception e) {
//                            await DisConnectRemoteMqttClient (e.Message);
//                            await StartCloudMqtt ();
//                            if (remoteIsConnected) {
//                                await RemoteMqttClient.SubscribeAsync (topicName);
//                            }
//                        }
//                    }
//                    break;
//                case 2:
//                    var macStr = CurRemoteMACInfo.mac.ToUpper ();
//                    char [] cArrs = macStr.ToCharArray ();
//                    Array.Reverse (cArrs);
//                    var sss = string.Join (string.Empty, cArrs);
                    using (var provider = new MD5CryptoServiceProvider ()) {
                        byte [] buffer = provider.ComputeHash (Encoding.Default.GetBytes (sss));
                        StringBuilder builder = new StringBuilder ();
                        for (int i = 0; i < buffer.Length; i++) {
                            builder.Append (buffer [i].ToString ("x2"));
                        }
                        CurRemoteMACInfo.md5_mac_string = builder.ToString ().ToUpper ();
                    }
//                    using (var provider = new MD5CryptoServiceProvider ()) {
//                        byte [] buffer = provider.ComputeHash (Encoding.Default.GetBytes (sss));
//                        StringBuilder builder = new StringBuilder ();
//                        for (int i = 0; i < buffer.Length; i++) {
//                            builder.Append (buffer [i].ToString ("x2"));
//                        }
//                        CurRemoteMACInfo.md5_mac_string = builder.ToString ().ToUpper ();
//                    }
                    topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
                    if (remoteIsConnected) {
                        try {
                            await RemoteMqttClient.SubscribeAsync (topicName);
                        } catch (Exception e) {
                            await DisConnectRemoteMqttClient (e.Message);
                            await StartCloudMqtt ();
                            if (remoteIsConnected) {
                                await RemoteMqttClient.SubscribeAsync (topicName);
                            }
                        }
                    }
                    break;
//                    topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
//                    if (remoteIsConnected) {
//                        try {
//                            await RemoteMqttClient.SubscribeAsync (topicName);
//                        } catch (Exception e) {
//                            await DisConnectRemoteMqttClient (e.Message);
//                            await StartCloudMqtt ();
//                            if (remoteIsConnected) {
//                                await RemoteMqttClient.SubscribeAsync (topicName);
//                            }
//                        }
//                    }
//                    break;
                case 3:
                    topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway";
//                case 3:
//                    topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway";
    
                    var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
//                    var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
                    try {
                        Console.WriteLine ("CheckGateway");
                        await RemoteMqttClient.PublishAsync (m1);
                    } catch (Exception e) {
                        Console.WriteLine ($"CheckGateway Fail:{e.Message}");
                        await DisConnectRemoteMqttClient (e.Message);
                        await StartCloudMqtt ();
                    }
                    break;
                }
            } catch (Exception e) {
//                    try {
//                        Console.WriteLine ("CheckGateway");
//                        await RemoteMqttClient.PublishAsync (m1);
//                    } catch (Exception e) {
//                        Console.WriteLine ($"CheckGateway Fail:{e.Message}");
//                        await DisConnectRemoteMqttClient (e.Message);
//                        await StartCloudMqtt ();
//                    }
//                    break;
//                }
//            } catch (Exception e) {
            }
        }
    }
}
//            }
//        }
//    }
//}
public class RemoteRequestParameters
{
    public string RequestVersion;
    public int RequestSource;
    public string LoginAccessToken;
    public int RequestProtocolType;
//public class RemoteRequestParameters
//{
//    public string RequestVersion;
//    public int RequestSource;
//    public string LoginAccessToken;
//    public int RequestProtocolType;
    public string Mac = "";
    public string GroupName = "";
}
//    public string Mac = "";
//    public string GroupName = "";
//}
public class MqttRemoteInfo
{
    public List<RemoteMACInfo> pageData;
//public class MqttRemoteInfo
//{
//    public List<RemoteMACInfo> pageData;
    public int pageIndex = 0;
    public int pageSize = 10;
    public int totalCount = 3;
    public int totalPages = 1;
    public bool hasPreviousPage = false;
    public bool hasNextPage = false;
}
//    public int pageIndex = 0;
//    public int pageSize = 10;
//    public int totalCount = 3;
//    public int totalPages = 1;
//    public bool hasPreviousPage = false;
//    public bool hasNextPage = false;
//}
public class MqttInfo
{
    public string connEmqDomainPort;
    public string connEmqClientId;
    public string connEmqUserName;
    public string connEmqPwd;
}
//public class MqttInfo
//{
//    public string connEmqDomainPort;
//    public string connEmqClientId;
//    public string connEmqUserName;
//    public string connEmqPwd;
//}
public class RemoteMACInfo
{
    public string mac;
    public string macMark;
    public string isValid;
    public string aesKey;
    public bool isNewBusproGateway;
    public string groupName;
    public string projectName;
    public string userName;
//public class RemoteMACInfo
//{
//    public string mac;
//    public string macMark;
//    public string isValid;
//    public string aesKey;
//    public bool isNewBusproGateway;
//    public string groupName;
//    public string projectName;
//    public string userName;
    //app自定义数据
    public string md5_mac_string;
    public string LoginAccessToken;
}
//    //app自定义数据
//    public string md5_mac_string;
//    public string LoginAccessToken;
//}
namespace Shared.Securitys
{
    public partial class EncryptionService
    {
//namespace Shared.Securitys
//{
//    public partial class EncryptionService
//    {
        #region 加密
        /// <summary>
        /// 加密主题为Base64
        /// </summary>
        /// <param name="pToEncrypt"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string AesEncryptTopic (string pToEncrypt, string key)
        {
            if (string.IsNullOrEmpty (pToEncrypt)) return null;
            if (string.IsNullOrEmpty (key)) return pToEncrypt;
            //需要加密内容的明文流
            Byte [] toEncryptArray = Encoding.UTF8.GetBytes (pToEncrypt);
//        #region 加密
//        /// <summary>
//        /// 加密主题为Base64
//        /// </summary>
//        /// <param name="pToEncrypt"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static string AesEncryptTopic (string pToEncrypt, string key)
//        {
//            if (string.IsNullOrEmpty (pToEncrypt)) return null;
//            if (string.IsNullOrEmpty (key)) return pToEncrypt;
//            //需要加密内容的明文流
//            Byte [] toEncryptArray = Encoding.UTF8.GetBytes (pToEncrypt);
            //配置AES加密Key(密钥、向量、模式、填充)
            RijndaelManaged rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//            //配置AES加密Key(密钥、向量、模式、填充)
//            RijndaelManaged rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES加密器对象
            ICryptoTransform cTransform = rm.CreateEncryptor ();
//            //创建AES加密器对象
//            ICryptoTransform cTransform = rm.CreateEncryptor ();
            //使用AES将明文流转成密文字节数组
            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//            //使用AES将明文流转成密文字节数组
//            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
            //将AES生成的密文字节数组转成Base64字符串
            return Convert.ToBase64String (resultArray, 0, resultArray.Length);
        }
//            //将AES生成的密文字节数组转成Base64字符串
//            return Convert.ToBase64String (resultArray, 0, resultArray.Length);
//        }
        /// <summary>
        /// 加密负载为二进制流
        /// </summary>
        /// <param name="toEncryptArray"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte [] AesEncryptPayload (byte [] toEncryptArray, string key)
        {
            if (string.IsNullOrEmpty (key)) return toEncryptArray;
            //配置AES加密Key(密钥、向量、模式、填充)
            var rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//        /// <summary>
//        /// 加密负载为二进制流
//        /// </summary>
//        /// <param name="toEncryptArray"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static byte [] AesEncryptPayload (byte [] toEncryptArray, string key)
//        {
//            if (string.IsNullOrEmpty (key)) return toEncryptArray;
//            //配置AES加密Key(密钥、向量、模式、填充)
//            var rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES加密器对象
            var cTransform = rm.CreateEncryptor ();
            //使用AES将明文流转成密文字节数组
            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        }
        #endregion
//            //创建AES加密器对象
//            var cTransform = rm.CreateEncryptor ();
//            //使用AES将明文流转成密文字节数组
//            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//        }
//        #endregion
        #region 解密
        /// <summary>
        /// 解密主题数据
        /// </summary>
        /// <param name="pToDecrypt"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string AesDecryptTopic (string pToDecrypt, string key)
        {
            //AES密文Base64转成字符串
            Byte [] toEncryptArray = Convert.FromBase64String (pToDecrypt);
//        #region 解密
//        /// <summary>
//        /// 解密主题数据
//        /// </summary>
//        /// <param name="pToDecrypt"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static string AesDecryptTopic (string pToDecrypt, string key)
//        {
//            //AES密文Base64转成字符串
//            Byte [] toEncryptArray = Convert.FromBase64String (pToDecrypt);
            //配置AES加密Key(密钥、向量、模式、填充)
            RijndaelManaged rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//            //配置AES加密Key(密钥、向量、模式、填充)
//            RijndaelManaged rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES解密器对象
            ICryptoTransform cTransform = rm.CreateDecryptor ();
//            //创建AES解密器对象
//            ICryptoTransform cTransform = rm.CreateDecryptor ();
            //使用AES将密文流转成明文的字节数组
            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//            //使用AES将密文流转成明文的字节数组
//            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
            //转成字符串
            return Encoding.UTF8.GetString (resultArray);
        }
//            //转成字符串
//            return Encoding.UTF8.GetString (resultArray);
//        }
        /// <summary>
        /// 采用Aes解密负载数据
        /// </summary>
        /// <param name="toEncryptArray"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte [] AesDecryptPayload (byte [] toEncryptArray, string key)
        {
            //配置AES加密Key(密钥、向量、模式、填充)
            var rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//        /// <summary>
//        /// 采用Aes解密负载数据
//        /// </summary>
//        /// <param name="toEncryptArray"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static byte [] AesDecryptPayload (byte [] toEncryptArray, string key)
//        {
//            //配置AES加密Key(密钥、向量、模式、填充)
//            var rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES解密器对象
            var cTransform = rm.CreateDecryptor ();
//            //创建AES解密器对象
//            var cTransform = rm.CreateDecryptor ();
            //使用AES将密文流转成明文的字节数组
            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        }
        #endregion
//            //使用AES将密文流转成明文的字节数组
//            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//        }
//        #endregion
    }
}
//    }
//}
/*
using System.Collections.Generic;
using System;
using MQTTnet.Client;
using System.Threading.Tasks;
using Shared;
using Shared.SimpleControl;
using MQTTnet;
using System.Text;
using System.Security.Cryptography;
///*
//using System.Collections.Generic;
//using System;
//using MQTTnet.Client;
//using System.Threading.Tasks;
//using Shared;
//using Shared.SimpleControl;
//using MQTTnet;
//using System.Text;
//using System.Security.Cryptography;
namespace SmartHome
{
    public static class MqttCommon
    {
        static string mqttEncryptKey = "";
        static string checkGatewayTopicBase64 = "";
//namespace SmartHome
//{
//    public static class MqttCommon
//    {
//        static string mqttEncryptKey = "";
//        static string checkGatewayTopicBase64 = "";
        /// <summary>
        /// 手机标识
        /// </summary>
        static Guid currentGuid = Guid.NewGuid ();
//        /// <summary>
//        /// 手机标识
//        /// </summary>
//        static Guid currentGuid = Guid.NewGuid ();
        /// <summary>
        /// 外网的MQTT是否正在连接
        /// </summary>
        static object isConnecting = false.ToString ();
        /// <summary>
        /// 远程MqttClient
        /// </summary>
        public static IMqttClient RemoteMqttClient;
//        /// <summary>
//        /// 外网的MQTT是否正在连接
//        /// </summary>
//        static object isConnecting = false.ToString ();
//        /// <summary>
//        /// 远程MqttClient
//        /// </summary>
//        public static IMqttClient RemoteMqttClient;
        static bool thisShowTip = true;
//        static bool thisShowTip = true;
        public static async Task Close (bool RemoveRemoteMqttClient = false)
        {
            try {
                if (RemoteMqttClient != null) {
                    //thisShowTip = true;
                    await RemoteMqttClient.DisconnectAsync ();
                }
                if (RemoveRemoteMqttClient) {
                    RemoteMqttClient = null;
                }
                CommonPage.IsRemote = false;
                Console.WriteLine ("Close Mqtt!!!");
            } catch { }
        }
//        public static async Task Close (bool RemoveRemoteMqttClient = false)
//        {
//            try {
//                if (RemoteMqttClient != null) {
//                    //thisShowTip = true;
//                    await RemoteMqttClient.DisconnectAsync ();
//                }
//                if (RemoveRemoteMqttClient) {
//                    RemoteMqttClient = null;
//                }
//                CommonPage.IsRemote = false;
//                Console.WriteLine ("Close Mqtt!!!");
//            } catch { }
//        }
        static DateTime dateTime = DateTime.MinValue;
        static int startCount = 0;
//        static DateTime dateTime = DateTime.MinValue;
//        static int startCount = 0;
        //public static async Task ReSatart ()
        //{
        //    await Close ();
        //    await RemoteMqttClient.ConnectAsync (options);
        //}
//        //public static async Task ReSatart ()
//        //{
//        //    await Close ();
//        //    await RemoteMqttClient.ConnectAsync (options);
//        //}
        /// <summary>
        /// 启动远程Mqtt
        /// </summary>
        public static async System.Threading.Tasks.Task StartCloudMqtt ()
        {
//        /// <summary>
//        /// 启动远程Mqtt
//        /// </summary>
//        public static async System.Threading.Tasks.Task StartCloudMqtt ()
//        {
            Application.RunOnMainThread (() => {
                if (5 < (DateTime.Now - dateTime).TotalSeconds) {
                    return;
                }
                dateTime = DateTime.Now;
            });
            if (!MainPage.LoginUser.IsLogin) {
                isConnecting = false.ToString ();
                return;
            }
            while (isConnecting.ToString () == true.ToString ()) {
                if (5 < (DateTime.Now - dateTime).TotalSeconds) {
                    break;
                }
                await System.Threading.Tasks.Task.Delay (500);
            }
            lock (isConnecting) {
                if (isConnecting.ToString () == true.ToString ()) {
                    return;
                }
                isConnecting = true.ToString ();
                if (RemoteMqttClient != null && RemoteMqttClient.IsConnected) {
                    MqttCheckGateway ();
                    return;
                }
            }
            new System.Threading.Thread (async () => {
                try {
                    if (RemoteMqttClient == null) {
                        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") {
                            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 ();
                            }
                        } else {
                        }
//            Application.RunOnMainThread (() => {
//                if (5 < (DateTime.Now - dateTime).TotalSeconds) {
//                    return;
//                }
//                dateTime = DateTime.Now;
//            });
//            if (!MainPage.LoginUser.IsLogin) {
//                isConnecting = false.ToString ();
//                return;
//            }
//            while (isConnecting.ToString () == true.ToString ()) {
//                if (5 < (DateTime.Now - dateTime).TotalSeconds) {
//                    break;
//                }
//                await System.Threading.Tasks.Task.Delay (500);
//            }
//            lock (isConnecting) {
//                if (isConnecting.ToString () == true.ToString ()) {
//                    return;
//                }
//                isConnecting = true.ToString ();
//                if (RemoteMqttClient != null && RemoteMqttClient.IsConnected) {
//                    MqttCheckGateway ();
//                    return;
//                }
//            }
//            new System.Threading.Thread (async () => {
//                try {
//                    if (RemoteMqttClient == null) {
//                        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") {
//                            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 ();
//                            }
//                        } else {
//                        }
                        //(2)创建Mqtt客户端
                        RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
                        //(3)当[连接云端的Mqtt成功后]或者[以及后面App通过云端Mqtt转发数据给网关成功后],处理接收到云端数据包响应时在mqttServerClient_ApplicationMessageReceived这个方法处理
                        RemoteMqttClient.UseApplicationMessageReceivedHandler (async e => {
                            if (isConnecting.ToString () == true.ToString ())
                                isConnecting = false.ToString ();
                            var aesDecryptTopic = e.ApplicationMessage.Topic;
                            var aesDecryptPayload = e.ApplicationMessage.Payload;
                            if (aesDecryptTopic == "YouIpAndPortNoRecord" || aesDecryptTopic == "DecryptFail") {// -->   你当前的IP及端口在云端不存在,请重新登录连接下!
                                await Close (true);
                                await MqttCheckGateway ();
                            } else if (aesDecryptTopic == @"/BeingSqueezedOffline") {
                                try {
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Start ("");
                                        MainPage.LoginUser.LastTime = DateTime.MinValue;
                                        MainPage.LoginUser.SaveUserInfo ();
                                        Room.Lists.Clear ();
                                        new Shared.SimpleControl.Phone.AccountLogin (MainPage.LoginUser.AccountString.ToLower (), "").Show ();
                                        MainPage.LoginUser.LastTime = System.DateTime.MinValue;
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.LinkStatusTipColor;
                                        if (CommonPage.IsRemote) {
                                            SmartHome.MqttCommon.Close (true);
                                        }
                                        var webPush = new service.hdlcontrol.com_push.WebServicePush ();
                                        webPush.DeleteToken_Push (UserConfig.Instance.tokenID);
                                    });
                                } catch (Exception ex) {
                                    Console.WriteLine (ex.Message);
                                } finally {
                                    Application.RunOnMainThread (() => {
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.LinkStatusTipColor;
                                        MainPage.Loading.Hide ();
                                        new Alert (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LoggedOnOtherDevices),
                                            Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Close)).Show ();
                                    });
                                }
#if HDL
                                if (!String.IsNullOrEmpty (MainPage.LoginUser.AllVisionRegisterDevUserNameGuid)) {
                                    com.freeview.global.Video.Logout ();
                                }
#endif
                            } else {
                                aesDecryptTopic = Shared.Securitys.EncryptionService.AesDecryptTopic (e.ApplicationMessage.Topic, mqttEncryptKey);
                                aesDecryptPayload = Shared.Securitys.EncryptionService.AesDecryptPayload (e.ApplicationMessage.Payload, mqttEncryptKey);
                            }
                            if (aesDecryptTopic == @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/CheckGateway/" + UserConfig.Instance.GatewayMAC.Replace (".", "")) {
                                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 (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.RemoteFailedGatewayOffline));
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    break;
                                case "NoRecord"://MAC不正确
                                    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.MACError));
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    break;
                                case "Success":
                                    CommonPage.IsRemote = true;
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
                                        Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
                                    });
                                    MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
                                    break;
                                default:
                                    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                    break;
                                }
                            } else {
                                var packet = new Packet ();
                                packet.Bytes = aesDecryptPayload;
                                packet.Manager ();
                            }
                        });
//                        //(2)创建Mqtt客户端
//                        RemoteMqttClient = new MqttFactory ().CreateMqttClient ();
//                        //(3)当[连接云端的Mqtt成功后]或者[以及后面App通过云端Mqtt转发数据给网关成功后],处理接收到云端数据包响应时在mqttServerClient_ApplicationMessageReceived这个方法处理
//                        RemoteMqttClient.UseApplicationMessageReceivedHandler (async e => {
//                            if (isConnecting.ToString () == true.ToString ())
//                                isConnecting = false.ToString ();
//                            var aesDecryptTopic = e.ApplicationMessage.Topic;
//                            var aesDecryptPayload = e.ApplicationMessage.Payload;
//                            if (aesDecryptTopic == "YouIpAndPortNoRecord" || aesDecryptTopic == "DecryptFail") {// -->   你当前的IP及端口在云端不存在,请重新登录连接下!
//                                await Close (true);
//                                await MqttCheckGateway ();
//                            } else if (aesDecryptTopic == @"/BeingSqueezedOffline") {
//                                try {
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Start ("");
//                                        MainPage.LoginUser.LastTime = DateTime.MinValue;
//                                        MainPage.LoginUser.SaveUserInfo ();
//                                        Room.Lists.Clear ();
//                                        new Shared.SimpleControl.Phone.AccountLogin (MainPage.LoginUser.AccountString.ToLower (), "").Show ();
//                                        MainPage.LoginUser.LastTime = System.DateTime.MinValue;
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.LinkStatusTipColor;
//                                        if (CommonPage.IsRemote) {
//                                            SmartHome.MqttCommon.Close (true);
//                                        }
//                                        var webPush = new service.hdlcontrol.com_push.WebServicePush ();
//                                        webPush.DeleteToken_Push (UserConfig.Instance.tokenID);
//                                    });
//                                } catch (Exception ex) {
//                                    Console.WriteLine (ex.Message);
//                                } finally {
//                                    Application.RunOnMainThread (() => {
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.LinkStatusTipColor;
//                                        MainPage.Loading.Hide ();
//                                        new Alert (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Tip), Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LoggedOnOtherDevices),
//                                            Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.Close)).Show ();
//                                    });
//                                }
//#if HDL
//                                if (!String.IsNullOrEmpty (MainPage.LoginUser.AllVisionRegisterDevUserNameGuid)) {
//                                    com.freeview.global.Video.Logout ();
//                                }
//#endif
//                            } else {
//                                aesDecryptTopic = Shared.Securitys.EncryptionService.AesDecryptTopic (e.ApplicationMessage.Topic, mqttEncryptKey);
//                                aesDecryptPayload = Shared.Securitys.EncryptionService.AesDecryptPayload (e.ApplicationMessage.Payload, mqttEncryptKey);
//                            }
//                            if (aesDecryptTopic == @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/CheckGateway/" + UserConfig.Instance.GatewayMAC.Replace (".", "")) {
//                                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 (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.RemoteFailedGatewayOffline));
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                    break;
//                                case "NoRecord"://MAC不正确
//                                    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.MACError));
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                    break;
//                                case "Success":
//                                    CommonPage.IsRemote = true;
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = 0xAA69E64A;
//                                        Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
//                                    });
//                                    MainPage.AddTip (UserConfig.Instance.CurrentRegion.RegionName + ":" + Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkSuccess));
//                                    break;
//                                default:
//                                    MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.LinkLoser));
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                    break;
//                                }
//                            } else {
//                                var packet = new Packet ();
//                                packet.Bytes = aesDecryptPayload;
//                                packet.Manager ();
//                            }
//                        });
                        RemoteMqttClient.UseDisconnectedHandler (e => {
                            //Console.WriteLine ("RemoteMqttClient UseDisconnectedHandler");
                            if (thisShowTip) {
                                if (CommonPage.IsRemote) {
                                    //MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.RemoteConnectionDisconnected));
                                    Application.RunOnMainThread (() => {
                                        MainPage.Loading.Hide ();
                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                                    });
                                }
                            } else {
                                thisShowTip = true;
                            }
                        });
                        RemoteMqttClient.UseConnectedHandler (async e => {
                            //Console.WriteLine ("RemoteMqttClient IsRemote");
                            await MqttCheckGateway ();
                        });
                    }
//                        RemoteMqttClient.UseDisconnectedHandler (e => {
//                            //Console.WriteLine ("RemoteMqttClient UseDisconnectedHandler");
//                            if (thisShowTip) {
//                                if (CommonPage.IsRemote) {
//                                    //MainPage.AddTip (Language.StringByID (Shared.SimpleControl.R.MyInternationalizationString.RemoteConnectionDisconnected));
//                                    Application.RunOnMainThread (() => {
//                                        MainPage.Loading.Hide ();
//                                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                                    });
//                                }
//                            } else {
//                                thisShowTip = true;
//                            }
//                        });
//                        RemoteMqttClient.UseConnectedHandler (async e => {
//                            //Console.WriteLine ("RemoteMqttClient IsRemote");
//                            await MqttCheckGateway ();
//                        });
//                    }
                    var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
                    var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
                    if (tempResult == null) {
                        Application.RunOnMainThread (() => {
                            MainPage.Loading.Hide ();
                            Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
                        });
                        System.Console.WriteLine ($"重新连接远程通讯失败,因为获取新的KEY失败");
                        return;
                    }
                    //var messgae = System.Text.Encoding.UTF8.GetString (tempResult);
//                    var requestObj = new LoginObj () { Account = MainPage.LoginUser.AccountString.ToLower (), Password = MainPage.LoginUser.Password, Company = MainPage.SoftSmsType };
//                    var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject (requestObj);
//                    var tempResult = MainPage.RequestHttps ("Login", requestJson, false);
//                    if (tempResult == null) {
//                        Application.RunOnMainThread (() => {
//                            MainPage.Loading.Hide ();
//                            Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//                        });
//                        System.Console.WriteLine ($"重新连接远程通讯失败,因为获取新的KEY失败");
//                        return;
//                    }
//                    //var messgae = System.Text.Encoding.UTF8.GetString (tempResult);
                    var responsePack = tempResult.ResponseData;// Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (messgae);
                    //if (responsePack == null || responsePack ["ResponseData"] == null) {
                    //    Console.WriteLine ("断开后重新链接需要重新登录获取连接的密码失败");
                    //    return;
                    //}
                    var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
                    //var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (responsePack ["ResponseData"].ToString ());
                    //////还有种情况是同一个ID 有多个设备用这个id连接(会导致中断)
                    mqttEncryptKey = dictrionaryResult ["HdlOnMqttKey"]?.ToString ();
                    var url = dictrionaryResult ["ConnectMqttBrokerLoadSubDomain"]?.ToString ();
                    var clientId = dictrionaryResult ["ConnectMqttClientId"]?.ToString ();
                    var username = dictrionaryResult ["ConnectMqttBrokerUserName"]?.ToString ();
                    var passwordRemote = dictrionaryResult ["ConnectMqttBrokerPwd"]?.ToString ();
//                    var responsePack = tempResult.ResponseData;// Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (messgae);
//                    //if (responsePack == null || responsePack ["ResponseData"] == null) {
//                    //    Console.WriteLine ("断开后重新链接需要重新登录获取连接的密码失败");
//                    //    return;
//                    //}
//                    var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (tempResult.ResponseData.ToString ());
//                    //var dictrionaryResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>> (responsePack ["ResponseData"].ToString ());
//                    //////还有种情况是同一个ID 有多个设备用这个id连接(会导致中断)
//                    mqttEncryptKey = dictrionaryResult ["HdlOnMqttKey"]?.ToString ();
//                    var url = dictrionaryResult ["ConnectMqttBrokerLoadSubDomain"]?.ToString ();
//                    var clientId = dictrionaryResult ["ConnectMqttClientId"]?.ToString ();
//                    var username = dictrionaryResult ["ConnectMqttBrokerUserName"]?.ToString ();
//                    var passwordRemote = dictrionaryResult ["ConnectMqttBrokerPwd"]?.ToString ();
                    if (clientId == null || username == null || passwordRemote == null) {
                        return;
                    }
//                    if (clientId == null || username == null || passwordRemote == null) {
//                        return;
//                    }
                    ////(1)连接到云端的Mqtt客户端连接参数
                    var options = 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, 10))
                                 .Build ();
//                    ////(1)连接到云端的Mqtt客户端连接参数
//                    var options = 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, 10))
//                                 .Build ();
                    await Close ();
                    await RemoteMqttClient.ConnectAsync (options);
                } catch (Exception ex) {
                    System.Console.WriteLine ("============>" + ex.Message);
                    Application.RunOnMainThread (() => {
                        MainPage.Loading.Hide ();
                        isConnecting = false.ToString ();
//                    await Close ();
//                    await RemoteMqttClient.ConnectAsync (options);
//                } catch (Exception ex) {
//                    System.Console.WriteLine ("============>" + ex.Message);
//                    Application.RunOnMainThread (() => {
//                        MainPage.Loading.Hide ();
//                        isConnecting = false.ToString ();
                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
#if DEBUG
                        Alert a = new Alert (isConnecting.ToString (), ex.Message, "Close");
                        a.Show ();
#endif
                        if (MqttCommon.RemoteMqttClient != null) {
                            MqttCommon.RemoteMqttClient.Dispose ();
                        }
                        if (MqttCommon.RemoteMqttClient != null) {
                            MqttCommon.RemoteMqttClient = null;
                        }
                    });
                } finally {
                    isConnecting = false.ToString ();
                    Application.RunOnMainThread (() => {
                        MainPage.Loading.Hide ();
                    });
                }
            }) { IsBackground = true }.Start ();
        }
//                        Shared.SimpleControl.Phone.UserMiddle.LinkStatusTip.BackgroundColor = SkinStyle.Current.DelColor;
//#if DEBUG
//                        Alert a = new Alert (isConnecting.ToString (), ex.Message, "Close");
//                        a.Show ();
//#endif
//                        if (MqttCommon.RemoteMqttClient != null) {
//                            MqttCommon.RemoteMqttClient.Dispose ();
//                        }
//                        if (MqttCommon.RemoteMqttClient != null) {
//                            MqttCommon.RemoteMqttClient = null;
//                        }
//                    });
//                } finally {
//                    isConnecting = false.ToString ();
//                    Application.RunOnMainThread (() => {
//                        MainPage.Loading.Hide ();
//                    });
//                }
//            }) { IsBackground = true }.Start ();
//        }
        /// <summary>
        /// Logins the by PWDA sync.
        /// </summary>
        public static async System.Threading.Tasks.Task<byte []> LoginByPWDAsync (string account, string password, string source = "", int company = 0)
        {
            try {
                var result = await MainPage.RequestHttpsResultAsync ("Login",
                System.Text.Encoding.UTF8.GetBytes (Newtonsoft.Json.JsonConvert.SerializeObject (new Dictionary<string, object> {
                    ["Account"] = account,
                    ["Password"] = password,
                    ["Source"] = source,
                    ["Company"] = company
                })));
                return result;
            } catch {
                return null;
            }
        }
//        /// <summary>
//        /// Logins the by PWDA sync.
//        /// </summary>
//        public static async System.Threading.Tasks.Task<byte []> LoginByPWDAsync (string account, string password, string source = "", int company = 0)
//        {
//            try {
//                var result = await MainPage.RequestHttpsResultAsync ("Login",
//                System.Text.Encoding.UTF8.GetBytes (Newtonsoft.Json.JsonConvert.SerializeObject (new Dictionary<string, object> {
//                    ["Account"] = account,
//                    ["Password"] = password,
//                    ["Source"] = source,
//                    ["Company"] = company
//                })));
//                return result;
//            } catch {
//                return null;
//            }
//        }
        /// <summary>
        /// 将Base64字符串,转换成合法的Mqtt主题
        /// </summary>
        /// <param name="baseSexFourEncStr"></param>
        /// <returns></returns>
        public static string BaseSexFourStrToMqttTopic (string baseSexFourEncStr)
        {
            baseSexFourEncStr = baseSexFourEncStr.Replace ("+", "[[$-MQTT_PLUS_SYMBOL_REPLACE-$]]");
            baseSexFourEncStr = baseSexFourEncStr.Replace ("/", "[[$-MQTT_TILT_SYMBOL_REPLACE-$]]");
            return baseSexFourEncStr;
        }
//        /// <summary>
//        /// 将Base64字符串,转换成合法的Mqtt主题
//        /// </summary>
//        /// <param name="baseSexFourEncStr"></param>
//        /// <returns></returns>
//        public static string BaseSexFourStrToMqttTopic (string baseSexFourEncStr)
//        {
//            baseSexFourEncStr = baseSexFourEncStr.Replace ("+", "[[$-MQTT_PLUS_SYMBOL_REPLACE-$]]");
//            baseSexFourEncStr = baseSexFourEncStr.Replace ("/", "[[$-MQTT_TILT_SYMBOL_REPLACE-$]]");
//            return baseSexFourEncStr;
//        }
        public static async System.Threading.Tasks.Task MqttRemoteSend (byte [] message)
        {
            try {
                if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected) {
                    await StartCloudMqtt ();
                }
                if (!RemoteMqttClient.IsConnected) {
                    return;
                }
                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
//        public static async System.Threading.Tasks.Task MqttRemoteSend (byte [] message)
//        {
//            try {
//                if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected) {
//                    await StartCloudMqtt ();
//                }
//                if (!RemoteMqttClient.IsConnected) {
//                    return;
//                }
//                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/" + UserConfig.Instance.GatewayMAC.Replace (".", "") + @"/" + currentGuid;
                //base64加密主题
                checkGatewayTopicBase64 = Shared.Securitys.EncryptionService.AesEncryptTopic (topicName, mqttEncryptKey);
//                //base64加密主题
//                checkGatewayTopicBase64 = Shared.Securitys.EncryptionService.AesEncryptTopic (topicName, mqttEncryptKey);
                //BaseSexFourStrToMqttTopic
                var topicNameSend = BaseSexFourStrToMqttTopic (checkGatewayTopicBase64);
//                //BaseSexFourStrToMqttTopic
//                var topicNameSend = BaseSexFourStrToMqttTopic (checkGatewayTopicBase64);
                //base64加密主体
                var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (message, mqttEncryptKey);
//                //base64加密主体
//                var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (message, mqttEncryptKey);
                var m = new MqttApplicationMessage { Topic = topicNameSend, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
                await RemoteMqttClient?.PublishAsync (m);
            } catch (Exception e) {
                isConnecting = false.ToString ();
            }
        }
//                var m = new MqttApplicationMessage { Topic = topicNameSend, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
//                await RemoteMqttClient?.PublishAsync (m);
//            } catch (Exception e) {
//                isConnecting = false.ToString ();
//            }
//        }
        public static async Task MqttCheckGateway ()
        {
            try {
                if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected) {
                    await StartCloudMqtt ();
                }
                if (!RemoteMqttClient.IsConnected) {
                    return;
                }
                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/CheckGateway/" + UserConfig.Instance.GatewayMAC.Replace (".", "");
                Console.WriteLine ("MqttCheckGateway : " + topicName);
                //base64加密主题
                var topicNameBase64 = Shared.Securitys.EncryptionService.AesEncryptTopic (topicName, mqttEncryptKey);
//        public static async Task MqttCheckGateway ()
//        {
//            try {
//                if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected) {
//                    await StartCloudMqtt ();
//                }
//                if (!RemoteMqttClient.IsConnected) {
//                    return;
//                }
//                var topicName = @"/" + MainPage.LoginUser.AccountString.ToLower () + @"/CheckGateway/" + UserConfig.Instance.GatewayMAC.Replace (".", "");
//                Console.WriteLine ("MqttCheckGateway : " + topicName);
//                //base64加密主题
//                var topicNameBase64 = Shared.Securitys.EncryptionService.AesEncryptTopic (topicName, mqttEncryptKey);
                //BaseSexFourStrToMqttTopic
                var topicNameSend = BaseSexFourStrToMqttTopic (topicNameBase64);
//                //BaseSexFourStrToMqttTopic
//                var topicNameSend = BaseSexFourStrToMqttTopic (topicNameBase64);
                //base64加密主题
                var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (new byte [] { 2, 1 }, mqttEncryptKey);
//                //base64加密主题
//                var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload (new byte [] { 2, 1 }, mqttEncryptKey);
                var m = new MqttApplicationMessage { Topic = topicNameSend, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
                await RemoteMqttClient?.PublishAsync (m);
            } catch (Exception e) {
                isConnecting = false.ToString ();
            }
        }
    }
}
//                var m = new MqttApplicationMessage { Topic = topicNameSend, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
//                await RemoteMqttClient?.PublishAsync (m);
//            } catch (Exception e) {
//                isConnecting = false.ToString ();
//            }
//        }
//    }
//}
namespace Shared.Securitys
{
    public partial class EncryptionService
    {
//namespace Shared.Securitys
//{
//    public partial class EncryptionService
//    {
        #region 加密
        /// <summary>
        /// 加密主题为Base64
        /// </summary>
        /// <param name="pToEncrypt"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string AesEncryptTopic (string pToEncrypt, string key)
        {
            if (string.IsNullOrEmpty (pToEncrypt)) return null;
            //需要加密内容的明文流
            Byte [] toEncryptArray = Encoding.UTF8.GetBytes (pToEncrypt);
//        #region 加密
//        /// <summary>
//        /// 加密主题为Base64
//        /// </summary>
//        /// <param name="pToEncrypt"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static string AesEncryptTopic (string pToEncrypt, string key)
//        {
//            if (string.IsNullOrEmpty (pToEncrypt)) return null;
//            //需要加密内容的明文流
//            Byte [] toEncryptArray = Encoding.UTF8.GetBytes (pToEncrypt);
            //配置AES加密Key(密钥、向量、模式、填充)
            RijndaelManaged rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//            //配置AES加密Key(密钥、向量、模式、填充)
//            RijndaelManaged rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES加密器对象
            ICryptoTransform cTransform = rm.CreateEncryptor ();
//            //创建AES加密器对象
//            ICryptoTransform cTransform = rm.CreateEncryptor ();
            //使用AES将明文流转成密文字节数组
            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//            //使用AES将明文流转成密文字节数组
//            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
            //将AES生成的密文字节数组转成Base64字符串
            return Convert.ToBase64String (resultArray, 0, resultArray.Length);
        }
//            //将AES生成的密文字节数组转成Base64字符串
//            return Convert.ToBase64String (resultArray, 0, resultArray.Length);
//        }
        /// <summary>
        /// 加密负载为二进制流
        /// </summary>
        /// <param name="toEncryptArray"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte [] AesEncryptPayload (byte [] toEncryptArray, string key)
        {
            //配置AES加密Key(密钥、向量、模式、填充)
            var rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//        /// <summary>
//        /// 加密负载为二进制流
//        /// </summary>
//        /// <param name="toEncryptArray"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static byte [] AesEncryptPayload (byte [] toEncryptArray, string key)
//        {
//            //配置AES加密Key(密钥、向量、模式、填充)
//            var rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES加密器对象
            var cTransform = rm.CreateEncryptor ();
            //使用AES将明文流转成密文字节数组
            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        }
        #endregion
//            //创建AES加密器对象
//            var cTransform = rm.CreateEncryptor ();
//            //使用AES将明文流转成密文字节数组
//            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//        }
//        #endregion
        #region 解密
        /// <summary>
        /// 解密主题数据
        /// </summary>
        /// <param name="pToDecrypt"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string AesDecryptTopic (string pToDecrypt, string key)
        {
            //AES密文Base64转成字符串
            Byte [] toEncryptArray = Convert.FromBase64String (pToDecrypt);
//        #region 解密
//        /// <summary>
//        /// 解密主题数据
//        /// </summary>
//        /// <param name="pToDecrypt"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static string AesDecryptTopic (string pToDecrypt, string key)
//        {
//            //AES密文Base64转成字符串
//            Byte [] toEncryptArray = Convert.FromBase64String (pToDecrypt);
            //配置AES加密Key(密钥、向量、模式、填充)
            RijndaelManaged rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//            //配置AES加密Key(密钥、向量、模式、填充)
//            RijndaelManaged rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES解密器对象
            ICryptoTransform cTransform = rm.CreateDecryptor ();
//            //创建AES解密器对象
//            ICryptoTransform cTransform = rm.CreateDecryptor ();
            //使用AES将密文流转成明文的字节数组
            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//            //使用AES将密文流转成明文的字节数组
//            Byte [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
            //转成字符串
            return Encoding.UTF8.GetString (resultArray);
        }
//            //转成字符串
//            return Encoding.UTF8.GetString (resultArray);
//        }
        /// <summary>
        /// 采用Aes解密负载数据
        /// </summary>
        /// <param name="toEncryptArray"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        public static byte [] AesDecryptPayload (byte [] toEncryptArray, string key)
        {
            //配置AES加密Key(密钥、向量、模式、填充)
            var rm = new RijndaelManaged {
                Key = Encoding.UTF8.GetBytes (key),
                IV = Encoding.UTF8.GetBytes (key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
//        /// <summary>
//        /// 采用Aes解密负载数据
//        /// </summary>
//        /// <param name="toEncryptArray"></param>
//        /// <param name="key"></param>
//        /// <returns></returns>
//        public static byte [] AesDecryptPayload (byte [] toEncryptArray, string key)
//        {
//            //配置AES加密Key(密钥、向量、模式、填充)
//            var rm = new RijndaelManaged {
//                Key = Encoding.UTF8.GetBytes (key),
//                IV = Encoding.UTF8.GetBytes (key),
//                Mode = CipherMode.CBC,
//                Padding = PaddingMode.PKCS7
//            };
            //创建AES解密器对象
            var cTransform = rm.CreateDecryptor ();
//            //创建AES解密器对象
//            var cTransform = rm.CreateDecryptor ();
            //使用AES将密文流转成明文的字节数组
            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
        }
        #endregion
//            //使用AES将密文流转成明文的字节数组
//            return cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
//        }
//        #endregion
    }
}
*/
//    }
//}
//*/