wxr
2020-09-10 af1cb3ecd0f4b0589e00b28f7f9edccf39e6e12b
HDL_ON/DAL/Net/MqttCommon.cs
@@ -1,574 +1,196 @@
using System.Collections.Generic;
using System;
using MQTTnet.Client;
using System.Threading.Tasks;
using Shared;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using HDL_ON.DAL;
//using HDL_ON.UI;
using MQTTnet;
using HDL_ON.DAL.Server;
namespace HDL_ON.DAL.Net
{
    public static class MqttCommon
    public class RemoteRequestParameters
    {
        static string mqttEncryptKey = "";
        static string checkGatewayTopicBase64 = "";
        static RemoteMACInfo CurRemoteMACInfo = null;
        public string RequestVersion;
        public int RequestSource;
        public string LoginAccessToken;
        public int RequestProtocolType;
        public int HdlGatewayGatewayType = 0;
        public bool IsRedirectSelectEmqServer = false;
        /// <summary>
        /// 手机标识
        /// 平台类型字符串
        /// </summary>
        static Guid currentGuid = Guid.NewGuid();
        public string PlatformStr;
        /// <summary>
        /// 外网的MQTT是否正在连接
        /// 发布主题负载
        /// </summary>
        static object isConnecting = false.ToString();
        /// <summary>
        /// 远程MqttClient
        /// </summary>
        public static IMqttClient RemoteMqttClient;
        public string PublishPayloadJsonStr;
        static bool thisShowTip = true;
        public static async System.Threading.Tasks.Task Close(bool RemoveRemoteMqttClient = false)
        {
            try
            {
                if (RemoteMqttClient != null)
                {
                    //thisShowTip = true;
                    await RemoteMqttClient.DisconnectAsync();
                }
                if (RemoveRemoteMqttClient)
                {
                    RemoteMqttClient = null;
                }
                CommonPage.IsRemote = false;
            }
            catch { }
        }
        static DateTime dateTime = DateTime.MinValue;
        /// <summary>
        /// 启动远程Mqtt
        /// </summary>
        public static async Task StartCloudMqtt()
        {
            /*
            try
            {
                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)
                    {
                        MainPage.Log($"RemoteMqttClient.IsConnected: {RemoteMqttClient.IsConnected}");
                    }
                    //if (RemoteMqttClient != null && RemoteMqttClient.IsConnected) {
                    //    return;
                    //}
                    new System.Threading.Thread(async () =>
                    {
                        try
                        {
                            //断开后重新链接需要重新登录获取连接的密码
                            var requestObj = new LoginObj() { Account = MainPage.LoginUser.AccountString.ToLower(), Password = MainPage.LoginUser.Password, Company = 1 };
                            var requestJson = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj);
                            var tempResult = HttpServerRequest.RequestHttps("Login", requestJson, "");
                            if (tempResult == null)
                            {
                                //----------
                                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());
                            //还有种情况是同一个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 (RemoteMqttClient == null)
                            {
                                var requestObj3 = new GatewayByRegionListObj() { RegionID = UserConfig.Instance.CurrentRegion.RegionID };
                                MainPage.Log("Remote mqtt get Region MAC : " + UserConfig.Instance.CurrentRegion.RegionID);
                                var requestJson3 = Newtonsoft.Json.JsonConvert.SerializeObject(requestObj3);
                                var revertObj3 = HttpServerRequest.RequestHttps("GatewayByRegionList", requestJson3, true);
                                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();
                                        MainPage.Log("Remote mqtt get Region MAC : " + gatewayList[0].MAC);
                                    }
                                }
                                else
                                {
                                    MainPage.Log("Remote mqtt get Region MAC Erorr !!");
                                }
                                //(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;
                                    MainPage.Log(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 = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
                                        var gatewayListRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(gatewayListRequestPar), 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 == "YouIpAndPortNoRecord" || aesDecryptTopic == "DecryptFail")
                                    {// -->   你当前的IP及端口在云端不存在,请重新登录连接下!
                                        await Close(true);
                                        //await MqttCheckGateway ();
                                    }
                                    else if (aesDecryptTopic == @"/BeingSqueezedOffline")
                                    {
                                        try
                                        {
                                        }
                                        catch (Exception ex)
                                        {
                                            MainPage.Log(ex.Message);
                                        }
                                        finally
                                        {
                                        }
                                    }
                                    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;
                                        }
                                    }
                                    MainPage.Log($"Des Topic={aesDecryptTopic}");
                                    var packet = new Packet();
                                    packet.Bytes = aesDecryptPayload;
                                    packet.Manager();
                                });
                                RemoteMqttClient.UseDisconnectedHandler(e =>
                                {
                                    if (thisShowTip)
                                    {
                                        if (CommonPage.IsRemote)
                                        {
                                            //----------
                                        }
                                    }
                                    else
                                    {
                                        thisShowTip = true;
                                    }
                                });
                                RemoteMqttClient.UseConnectedHandler(async e =>
                                {
                                    if (CurRemoteMACInfo != null)
                                    {
                                        if (CurRemoteMACInfo.isValid == "InValid")
                                        {
                                            //----------
                                        }
                                        else
                                        {
                                            CommonPage.IsRemote = true;
                                            //----------
                                        }
                                    }
                                });
                            }
                            if (clientId == null || username == null || passwordRemote == null)
                            {
                                return;
                            }
                            if (tempResult == null)
                            {
                                //----------
                                return;
                            }
                            //--第一步:获取mqtt链接参数
                            var mqttInfoUrl = @"https://developer.hdlcontrol.com/Center/Center/GetConnMqttInfo";//获取连接远程云端Emq Mqtt 服务器连接信息
                            var mqttInfoRequestPar = new RemoteRequestParameters() { LoginAccessToken = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
                            var mqttInfoRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(mqttInfoRequestPar), false, mqttInfoUrl);
                            if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null)
                            {
                                try
                                {
                                    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 = mqttRequestPar.Token, RequestVersion = "RequestVersion1", RequestProtocolType = 0, RequestSource = 1 };
                                        var gatewayListRequestResult = HttpServerRequest.RequestHttps("", Newtonsoft.Json.JsonConvert.SerializeObject(gatewayListRequestPar), 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);
                                        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, 10))
                                                                .Build();
                                            await Close();
                                            await RemoteMqttClient.ConnectAsync(options1);
                                            await MqttRemoteSend(new byte[] { 0 }, 1);
                                            await MqttRemoteSend(new byte[] { 0 }, 2);
                                        }
                                    }
                                }
                                catch { }
                            }
                        }
                        catch (Exception ex)
                        {
                            Application.RunOnMainThread(() =>
                            {
                                if (MqttCommon.RemoteMqttClient != null)
                                {
                                    MqttCommon.RemoteMqttClient.Dispose();
                                }
                                if (MqttCommon.RemoteMqttClient != null)
                                {
                                    MqttCommon.RemoteMqttClient = null;
                                }
                            });
                        }
                        finally
                        {
                            isConnecting = false.ToString();
                            //----------
                        }
                    })
                    { IsBackground = true }.Start();
                }
            }
            catch (Exception ex)
            {
                MainPage.Log("============>" + ex.Message);
            }
            finally
            {
                isConnecting = false.ToString();
            }
    */
        }
        /// <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
            {
                if (RemoteMqttClient == null || !RemoteMqttClient.IsConnected)
                {
                    await StartCloudMqtt();
                }
                if (!RemoteMqttClient.IsConnected)
                {
                    return;
                }
                var topicName = "";//@"/" + MainPage.LoginUser.AccountString.ToLower() + @"/" + currentGuid;//+ @"/" + UserConfig.Instance.CurrentRegion.MAC.Replace(".", "")
                switch (optionType)
                {
                    case 0:
                        if (!string.IsNullOrEmpty(mqttEncryptKey))
                        {
                            topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/OldON";
                        }
                        else
                        {
                            topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/NewON";
                        }
                        //base64加密
                        var messageSend = Shared.Securitys.EncryptionService.AesEncryptPayload(message, mqttEncryptKey);
                        var m = new MqttApplicationMessage { Topic = topicName, Payload = messageSend, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
                        await RemoteMqttClient?.PublishAsync(m);
                        break;
                    case 1:
                        topicName = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#";
                        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();
                        }
                        topicName = $"/NotifyBusGateWayInfoChagne/{CurRemoteMACInfo.md5_mac_string}";
                        await RemoteMqttClient?.SubscribeAsync(topicName);
                        break;
                }
            }
            catch (Exception e)
            {
                isConnecting = false.ToString();
            }
        }
        public string Mac = "";
        public string GroupName = "";
    }
}
public class RemoteRequestParameters
{
    public string RequestVersion;
    public int RequestSource;
    public string LoginAccessToken;
    public int RequestProtocolType;
    public string Mac = "";
    public string GroupName = "";
}
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 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;
    //app自定义数据
    public string md5_mac_string;
    public string LoginAccessToken;
}
namespace Shared.Securitys
{
    public partial class EncryptionService
    public class MqttRemoteInfo
    {
        public List<RemoteMACInfo> pageData;
        #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);
        public int pageIndex = 0;
        public int pageSize = 10;
        public int totalCount = 3;
        public int totalPages = 1;
        public bool hasPreviousPage = false;
        public bool hasNextPage = false;
    }
            //配置AES加密Key(密钥、向量、模式、填充)
            RijndaelManaged rm = new RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                IV = Encoding.UTF8.GetBytes(key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7
            };
    public class MqttInfo
    {
        public string connEmqDomainPort;
        public string connEmqClientId;
        public string connEmqUserName;
        public string connEmqPwd;
            //创建AES加密器对象
            ICryptoTransform cTransform = rm.CreateEncryptor();
            //使用AES将明文流转成密文字节数组
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.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
            };
            //创建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);
            //配置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将密文流转成明文的字节数组
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            //转成字符串
            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
            };
            //创建AES解密器对象
            var cTransform = rm.CreateDecryptor();
            //使用AES将密文流转成明文的字节数组
            return cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        }
        #endregion
        public List<RemoteMACInfo> AccountAllGateways;
    }
}
    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 string clientId;
        //app自定义数据
        public string md5_mac_string;
        public string LoginAccessToken;
    }
    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);
                //配置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将明文流转成密文字节数组
                Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.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
                };
                //创建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);
                //配置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将密文流转成明文的字节数组
                Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
                //转成字符串
                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
                };
                //创建AES解密器对象
                var cTransform = rm.CreateDecryptor();
                //使用AES将密文流转成明文的字节数组
                return cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            }
            #endregion
        }
    }
}