wei
2021-01-27 7232642ff48a7fbde2018cde652f3e771fa58025
HDL_ON/DAL/Mqtt/MqttClient.cs
@@ -10,6 +10,7 @@
using System.Security.Cryptography;
using HDL_ON.DriverLayer;
using HDL_ON.Entity;
using HDL_ON.UI;
namespace HDL_ON.DAL.Mqtt
{
@@ -20,7 +21,7 @@
        /// </summary>
        static string mqttEncryptKey = "";
        //static string checkGatewayTopicBase64 = "";
        static bool hadGateway = true;
        /// <summary>
        /// 挤下线主题
        /// </summary>
@@ -31,18 +32,18 @@
        /// </summary>
        static string RandomKey = "";
        /// <summary>
        /// 随机生成字符
        /// </summary>
        /// <returns></returns>
        static string GetRandomKey()
        {
            if (string.IsNullOrEmpty(RandomKey))
            {
                //随机2位字符串
                Random random = new Random(Guid.NewGuid().GetHashCode());
                int num = random.Next(65, 91);
                RandomKey = Convert.ToChar(num).ToString();
                RandomKey = Utlis.CreateRandomString(2);
            }
            return RandomKey;
        }
        /// <summary>
@@ -118,7 +119,7 @@
        /// <summary>
        /// 外网的MQTT是否正在连接
        /// </summary>
        public static bool remoteMqttIsConnecting;
        public static bool RemoteMqttIsConnecting;
        static bool remoteIsConnected;
        static MqttClient()
@@ -137,6 +138,8 @@
                    {
                        System.Threading.Thread.Sleep(500);
                        if (!Control.Ins.IsRemote) continue;
                        //进入后台不处理
                        if (MainPage.IsEnterBackground) continue;
                        await StartCloudMqtt();
                        await SubscribeTopics();
@@ -157,6 +160,10 @@
        }
        static bool isSubscribeSuccess;
        /// <summary>
        /// 订阅主题
        /// </summary>
        /// <returns></returns>
        static async Task SubscribeTopics()
        {
            if (remoteIsConnected && !isSubscribeSuccess)
@@ -178,10 +185,22 @@
                        //QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
                    };
                    var topicAlinkStatus = new MqttTopicFilter()
                    {
                        Topic = $"/user/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/app/thing/property/send",
                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce
                    };
                    //var topicBusStatus = new MqttTopicFilter()
                    //{
                    //    Topic = $"/BusGateWayToClient/{}/Common",
                    //    QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce
                    //};
                    Utlis.WriteLine("开始订阅!");
                    var result = await RemoteMqttClient.SubscribeAsync(new MqttTopicFilter[] { topicFilterBusGateWayToClient, topicFilterPush2 });
                    var result = await RemoteMqttClient.SubscribeAsync(new MqttTopicFilter[] { topicFilterBusGateWayToClient, topicFilterPush2, topicAlinkStatus });
                    if (result.Items[0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS0)
                    {
                        Control.Ins.GatewayOnline = true;
                        isSubscribeSuccess = true;
                        Utlis.WriteLine("订阅成功!");
@@ -203,8 +222,7 @@
        /// </summary>
        public static async Task StartCloudMqtt()
        {
            if (OnAppConfig.Instance.internetStatus == 0)
            if (MainPage.InternetStatus == 0)
            {
                return;
            }
@@ -215,7 +233,7 @@
            }
            //追加:没有远程连接的权限
            if (remoteMqttIsConnecting || remoteIsConnected)
            if (RemoteMqttIsConnecting || remoteIsConnected)
            {
                return;
            }
@@ -226,7 +244,7 @@
                try
                {
                    #region 初始化远程Mqtt
                    RemoteMqttIsConnecting = true;
                    RemoteMqttClient = new MqttFactory().CreateMqttClient();
@@ -256,13 +274,17 @@
                                }
                                else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/Common/CheckGateway")
                                {
                                    var ss = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                    ReceiveCheckGateway(ss);
                                }
                                else
                                {
                                    SetGatewayOnlineResetCheck();
                                    if (Entity.DB_ResidenceData.residenceData.GatewayType == 0)
                                    var bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, DB_ResidenceData.Instance.HomeGateway.aesKey);
                                    //bus数据解析
                                    if (DB_ResidenceData.Instance.GatewayType == 0)
                                    {
                                        var packet = new Packet();
@@ -274,11 +296,22 @@
                                        {
                                            packet.Bytes = e.ApplicationMessage.Payload;
                                        }
#if DEBUG
                                        //string ddd = "";
                                        //foreach (var bb in packet.Bytes)
                                        //{
                                        //    ddd += bb + ",";
                                        //}
                                        //MainPage.Log($"mqtt bus data:{ddd}");
#endif
                                        packet.Manager();
                                    }
                                    else
                                    {
                                        MainPage.Log($"mqtt A-Link data");
                                        //A协议数据处理
                                        var revString = Encoding.UTF8.GetString(bytes);
                                        Control.Ins.UpdataFunctionStatus(revString,null);
                                    }
                                }
                            }
@@ -298,15 +331,11 @@
                    //(3)ConnectedHandler
                    if (RemoteMqttClient.ConnectedHandler == null)
                    {
                        RemoteMqttClient.UseConnectedHandler(async (e) => {
                        RemoteMqttClient.UseConnectedHandler(async (e) =>
                        {
                            IfNeedReadAllDeviceStatus = true;
                            Utlis.WriteLine($"============>Mqtt远程连接成功");
                            SendPushSignOut();
                            //if (Control.Ins.IsRemote) {
                            //    //Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
                            //    MainPage.AddTip (Language.StringByID (SimpleControl.R.MyInternationalizationString.LinkSuccess));
                            //}
                        });
                    }
                    #endregion
@@ -333,7 +362,7 @@
                finally
                {
                    //最终要释放连接状态
                    remoteMqttIsConnecting = false;
                    RemoteMqttIsConnecting = false;
                    Utlis.WriteLine($"StartCloudMqtt: 结束");
                }
@@ -363,7 +392,7 @@
        {
            try
            {
                if (MqttInfoConfig.Current.HomeGatewayInfo != null && MqttInfoConfig.Current.HomeGatewayInfo.mac == Entity.DB_ResidenceData.residenceData.residenceGatewayMAC)
                if (MqttInfoConfig.Current.HomeGatewayInfo != null && MqttInfoConfig.Current.HomeGatewayInfo.mac == Entity.DB_ResidenceData.Instance.residenceGatewayMAC)
                {
                    await MQTTConnectAsync();
                }
@@ -424,8 +453,7 @@
                    //url = HttpUtil.GetProxyEMQUrl (url);
                    //#if DEBUG
                    //                   url = HttpUtil.GetProxyEMQUrl (url);
                    //url = HttpUtil.GetProxyEMQUrl (url);
                    //#endif
                    var clientId = MqttInfoConfig.Current.mMqttInfo.clientId;
                    var username = MqttInfoConfig.Current.mMqttInfo.userName;
@@ -517,7 +545,6 @@
        /// </summary>
        static void ReceiveNotifySqueezeAsync(string mMes)
        {
            if (mMes == PushSignStr) return;//是自己的登录推送不处理
            //断开远程连接
@@ -529,13 +556,20 @@
            DisConnectRemoteMqttClient("挤下线");
            UserInfo.Current.LastTime = DateTime.MinValue;
            UserInfo.Current.SaveUserInfo();
            Application.RunOnMainThread(() => {
                MainPage.GoLoginPage(UserInfo.Current);
            Application.RunOnMainThread(() =>
            {
                //弹窗提示被挤下线
                HDLCommon.Current.CheckLogout();
            });
            //UserInfo.Current.LastTime = DateTime.MinValue;
            //UserInfo.Current.SaveUserInfo();
            //Application.RunOnMainThread(() => {
            //    MainPage.GoLoginPage(UserInfo.Current);
            //    //弹窗提示被挤下线
            //});
            //2020-08-11 删除推送数据
            //HDLRequest.Current.PushserivceSignOut ();
@@ -573,8 +607,6 @@
        /// <returns></returns>
        public static async Task MqttRemoteSend(byte[] message, int optionType = 0)
        {
            //return;
            try
            {
                string topicName;
@@ -620,7 +652,6 @@
        /// 是否需要读取一次所有设备状态
        /// </summary>
        static bool IfNeedReadAllDeviceStatus = true;
        //public static bool IsGatewayOnline = true;
        /// <summary>
        /// 设置网关在线标志,并重置CheckGateway参数
@@ -629,7 +660,18 @@
        {
            if (Control.Ins.IsRemote)
            {
                Control.Ins.GatewayOnline = true;
                if (!Control.Ins.GatewayOnline)
                {
                    try
                    {
                        if (DB_ResidenceData.Instance.HomeGateway != null)
                        {
                            DB_ResidenceData.Instance.HomeGateway.gatewayStatus = true;
                        }
                        Control.Ins.GatewayOnline = true;
                    }
                    catch { }
                }
            }
        }
@@ -646,16 +688,17 @@
                MqttInfoConfig.Current.mMqttInfo = mqttInfoRequestResult_Obj;
                await MQTTConnectAsync();
                //1.判断是否绑定了网关,获取网关远程连接的加密KEY
                if (DB_ResidenceData.residenceData.CheckWhetherGatewayIsBound())
                if (DB_ResidenceData.Instance.CheckWhetherGatewayIsBound())
                {
                    //2.找出是否存在匹配当前住宅的mac,存在再进行远程。
                    MqttInfoConfig.Current.HomeGatewayInfo = DB_ResidenceData.residenceData.HomeGateway;
                    MqttInfoConfig.Current.HomeGatewayInfo = DB_ResidenceData.Instance.HomeGateway;
                    //3.开始连接
                    await MQTTConnectAsync();
                }
                else
                {
                    Utlis.WriteLine("============>还没绑定网关");
                    hadGateway = false;
                }
            }
        }