wei
2021-02-03 0c4c132ea315a1cb27f67535ec3226610e16092e
HDL_ON/DAL/Mqtt/MqttClient.cs
@@ -138,7 +138,7 @@
                    try
                    {
                        System.Threading.Thread.Sleep(500);
                        if (!Control.Ins.IsRemote) continue;
                        //if (!Control.Ins.IsRemote) continue;
                        //进入后台不处理
                        if (MainPage.IsEnterBackground) continue;
@@ -171,38 +171,31 @@
            {
                try
                {
                    //2020-05-14 订阅主题质量改为0
                    var topicFilterBusGateWayToClient = new MqttTopicFilter()
                    if (DB_ResidenceData.Instance.GatewayType == 0 && !DB_ResidenceData.Instance.CheckWhetherGatewayIdIsNull())
                    {
                        Topic = $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/#",
                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce
                        //QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
                    };
                        Utlis.WriteLine("开始订阅一端口通用主题!");
                        //2020-05-14 订阅主题质量改为0
                        var topicFilterBusGateWayToClient = new MqttTopicFilter()
                        {
                            Topic = $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/#",
                            QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce
                        };
                        await RemoteMqttClient.SubscribeAsync(topicFilterBusGateWayToClient);
                    }
                    //挤下线主题
                    var topicFilterPush2 = new MqttTopicFilter
                    {
                        Topic = $"/BusGateWayToClient/{UserInfo.Current.ID}/#",
                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce,
                        //QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
                    };
                    var topicAlinkStatus = new MqttTopicFilter()
                    {
                        Topic = $"/user/{DB_ResidenceData.Instance.CurrentRegion.RegionID}/app/thing/property/send",
                        QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce
                    };
                    var topicAlinkGatewayStatus = new MqttTopicFilter()
                    {
                        Topic = $"/user/{DB_ResidenceData.Instance.HomeGateway.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, topicAlinkStatus, topicAlinkGatewayStatus });
                    var result = await RemoteMqttClient.SubscribeAsync(new MqttTopicFilter[] {  topicFilterPush2, topicAlinkStatus });
                    if (result.Items[0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS0)
                    {
                        Control.Ins.GatewayOnline = true;
@@ -210,9 +203,6 @@
                        Utlis.WriteLine("订阅成功!");
                        MqttRemoteSend(new byte[] { 0 }, 3);
                        //连接成功后检测是否需要通过远程获取Key
                        //CheckIfNeedGetLocalPasswordFromRemote();
                    }
                }
                catch (Exception ex)
@@ -261,62 +251,61 @@
                            try
                            {
                                var topic = e.ApplicationMessage.Topic;
                                //一端口主题处理
                                if (DB_ResidenceData.Instance.GatewayType == 0 && !DB_ResidenceData.Instance.CheckWhetherGatewayIdIsNull())
                                {
                                    if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/NotifyBusGateWayInfoChange")
                                    {
                                        //网关上线,需要更新aeskey
                                        //收到网关上线消息主题
                                        ReceiveNotifyBusGateWayInfoChange();
                                        return;
                                    }
                                    else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/NotifyGateWayOffline")
                                    {
                                        //网关掉线
                                        //----第二步:读取账号下面的网关列表
                                        ReceiveNotifyGateWayOffline();
                                        return;
                                    }
                                    else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/Common/CheckGateway")
                                    {
                                        var ss = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                        ReceiveCheckGateway(ss);
                                        return;
                                    }
                                }
                                if (topic == $"/BusGateWayToClient/{UserInfo.Current.ID}" + PushNotifySqueeze)
                                {
                                    var mMes = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                    //新挤下线主题方案 收到挤下线主题
                                    ReceiveNotifySqueezeAsync(mMes);
                                }
                                else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/NotifyBusGateWayInfoChange")
                                {//网关上线,需要更新aeskey
                                    //收到网关上线消息主题
                                    ReceiveNotifyBusGateWayInfoChange();
                                }
                                else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/NotifyGateWayOffline")
                                {//网关掉线
                                    //----第二步:读取账号下面的网关列表
                                    ReceiveNotifyGateWayOffline();
                                }
                                else if (topic == $"/BusGateWayToClient/{MqttInfoConfig.Current.HomeGatewayInfo.gatewayId}/Common/CheckGateway")
                                {
                                    var ss = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
                                    ReceiveCheckGateway(ss);
                                }
                                //涂鸦设备状态
                                //A网关设备状态-包含涂鸦设备
                                else if (topic == $"/user/{DB_ResidenceData.Instance.CurrentRegion.RegionID}/app/thing/property/send")
                                {
                                    var bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, tuyaEncryptKey);
                                    MainPage.Log($"tuya mqtt A-Link data");
                                    //A协议数据处理
                                    var revString = Encoding.UTF8.GetString(bytes);
                                    Control.Ins.UpdataFunctionStatus(revString, null);
                                }
                                //一端口数据解析
                                else
                                {
                                    SetGatewayOnlineResetCheck();
                                    var bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, mqttEncryptKey);
                                    //bus数据解析
                                    if (DB_ResidenceData.Instance.GatewayType == 0)
                                    {
                                        var packet = new Packet();
                                    var packet = new Packet();
                                        if (!string.IsNullOrEmpty(mqttEncryptKey))
                                        {
                                            packet.Bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, mqttEncryptKey);
                                        }
                                        else
                                        {
                                            packet.Bytes = e.ApplicationMessage.Payload;
                                        }
                                        packet.Manager();
                                    if (!string.IsNullOrEmpty(mqttEncryptKey))
                                    {
                                        packet.Bytes = Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, mqttEncryptKey);
                                    }
                                    else
                                    {
                                        MainPage.Log($"mqtt A-Link data");
                                        //A协议数据处理
                                        var revString = Encoding.UTF8.GetString(bytes);
                                        Control.Ins.UpdataFunctionStatus(revString, null);
                                        packet.Bytes = e.ApplicationMessage.Payload;
                                    }
                                    packet.Manager();
                                }
                            }
                            catch { }
@@ -343,7 +332,6 @@
                        });
                    }
                    #endregion
                    //}
                    //(4)===========开始连接过程==========
                    //之前已经获取参数成功过
@@ -419,10 +407,10 @@
        /// <returns></returns>
        static async Task StartMQTTGetInfo()
        {
            if (!Control.Ins.IsRemote)
            {
                return;
            }
            //if (!Control.Ins.IsRemote)
            //{
            //    return;
            //}
            await GetMqttInfoAndMQTTConnectAsync();
@@ -443,10 +431,10 @@
        static async Task MQTTConnectAsync()
        {
            if (!Control.Ins.IsRemote)
            {
                return;
            }
            //if (!Control.Ins.IsRemote)
            //{
            //    return;
            //}
            //if (MqttInfoConfig.Current.HomeGatewayInfo != null && MqttInfoConfig.Current.mMqttInfo != null)
            //没有网关情况下,也需要连接mqtt,涂鸦第三方设备不需要网关
@@ -468,12 +456,12 @@
                    MqttInfoConfig.Current.IfGetMqttInfoSuccess = true;
                    MqttInfoConfig.Current.Save();
                    mqttEncryptKey = MqttInfoConfig.Current.HomeGatewayInfo.aesKey;
                    if (MqttInfoConfig.Current.HomeGatewayInfo == null)
                    {
                        MqttInfoConfig.Current.HomeGatewayInfo = new Server.HomeGatewayInfo();
                    }
                    mqttEncryptKey = MqttInfoConfig.Current.HomeGatewayInfo.aesKey;
                    //解密密钥规则:已现有的住宅ID为基准,从右边一一获取值,最后如果不够16位,则往右补零
                    string aesKey = string.Empty;
                    for (int i = DB_ResidenceData.Instance.CurrentRegion.RegionID.Length - 1; i >= 0; i--)
@@ -708,18 +696,18 @@
                MqttInfoConfig.Current.mMqttInfo = mqttInfoRequestResult_Obj;
                await MQTTConnectAsync();
                //1.判断是否绑定了网关,获取网关远程连接的加密KEY
                if (DB_ResidenceData.Instance.CheckWhetherGatewayIsBound())
                //if (DB_ResidenceData.Instance.CheckWhetherGatewayIsBound())
                {
                    //2.找出是否存在匹配当前住宅的mac,存在再进行远程。
                    MqttInfoConfig.Current.HomeGatewayInfo = DB_ResidenceData.Instance.HomeGateway;
                    //3.开始连接
                    await MQTTConnectAsync();
                }
                else
                {
                    Utlis.WriteLine("============>还没绑定网关");
                    hadGateway = false;
                }
                //else
                //{
                //    Utlis.WriteLine("============>还没绑定网关");
                //    hadGateway = false;
                //}
            }
        }