//using System; //using MQTTnet.Client; //using System.Threading.Tasks; //using Shared; //using MQTTnet; //using System.Text; //using HDL_ON.Entity; //namespace HDL_ON.DAL.Mqtt //{ // public static class Mqtt_Cloud // { // static string mqttEncryptKey = ""; // static string checkGatewayTopicBase64 = ""; // static RemoteMACInfo CurRemoteMACInfo = null; // /// // /// 手机标识 // /// // static Guid currentGuid = Guid.NewGuid(); // /// // /// 外网的MQTT是否正在连接 // /// // /// // /// 远程MqttClient // /// // /// // /// 远程MqttClient // /// // public static IMqttClient RemoteMqttClient = new MqttFactory().CreateMqttClient(); // static bool thisShowTip = true; // //static string mqttRequestParToken=""; // /// // /// 推送标识 // /// // static string PushSignStr = System.DateTime.Now.Ticks.ToString(); // /// // /// 断开远程Mqtt的链接 // /// // public static async Task DisConnectRemoteMqttClient(string s = "") // { // try // { // if (remoteIsConnected) // { // remoteIsConnected = false; // MainPage.Log($"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; // /// // /// 外网的MQTT是否正在连接 // /// // static bool remoteMqttIsConnecting; // static bool remoteIsConnected; // static Mqtt_Cloud() // { // InitMqtt(); // } // public static bool IsInitMqtt = false; // static void InitMqtt() // { // new System.Threading.Thread(async () => { // while (true) // { // try // { // System.Threading.Thread.Sleep(1000); // if (!MainPage.IsRemote) continue; // await StartCloudMqtt(); // await SubscribeTopics(); // } // catch { } // } // }) // { IsBackground = true }.Start(); // } // static bool isSubscribeSuccess; // static async Task SubscribeTopics() // { // if (remoteIsConnected && !isSubscribeSuccess) // { // try // { // var topicFilter1 = new TopicFilter { QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange" }; // var topicFilter2 = new TopicFilter { QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce, Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/#" }; // var topicFilter3 = new TopicFilter { QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce, Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.clientId}/Push/NotifySqueeze" }; // var result = await RemoteMqttClient.SubscribeAsync(new TopicFilter[] { topicFilter1, topicFilter2, topicFilter3 }); // if (result.Items[0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) // { // isSubscribeSuccess = true; // } // } // catch { } // } // } // /// // /// 启动远程Mqtt // /// // public static async Task StartCloudMqtt() // { // //追加:没有远程连接的权限 // if (remoteMqttIsConnecting // || remoteIsConnected || ! UserInfo.Current.IsLogin) // { // return; // } // await 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 // { // var topic = e.ApplicationMessage.Topic; // //Console.WriteLine ("回复Topic={0}", topic); // if (topic == $"/BusGateWayToClient/{CurRemoteMACInfo.clientId}/Push/NotifySqueeze") // { // var mMes = Encoding.UTF8.GetString(e.ApplicationMessage.Payload); // //收到挤下线主题 // ReceiveNotifySqueezeAsync(mMes); // } // else if (topic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange") // { // //网关上线,需要更新aeskey // //收到网关上线消息主题 // //ReceiveNotifyBusGateWayInfoChange(); // } // else if (topic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/CheckGateway") // { // var ss = Encoding.UTF8.GetString(e.ApplicationMessage.Payload); // ReceiveCheckGateway(ss); // } // else // { // var packet = new Packet(); // if (!string.IsNullOrEmpty(mqttEncryptKey)) // { // packet.Bytes = Shared.Securitys.EncryptionService.AesDecryptPayload(e.ApplicationMessage.Payload, mqttEncryptKey); // } // else // { // packet.Bytes = e.ApplicationMessage.Payload; // } // packet.Manager(); // } // } // catch { } // }); // } // if (RemoteMqttClient.DisconnectedHandler == null) // { // RemoteMqttClient.UseDisconnectedHandler(async (e) => { // System.Console.WriteLine($"远程连接断开"); // isSubscribeSuccess = false; // await DisConnectRemoteMqttClient("StartRemoteMqtt.DisconnectedHandler"); // if (MainPage.IsRemote) // { // Application.RunOnMainThread(() => { // //远程连接成功 // }); // } // }); // } // if (RemoteMqttClient.ConnectedHandler == null) // { // RemoteMqttClient.UseConnectedHandler(async (e) => { // System.Console.WriteLine($"远程连接成功"); // MainPage.IsRemote = true; // Application.RunOnMainThread(() => { // //远程连接成功 // MainPage.IsRemote = true; // }); // //刷新状态 // if (CurRemoteMACInfo != null) // { // if (CurRemoteMACInfo.isValid == "InValid") // { // //远程失败 // MainPage.IsRemote = false; // } // else // { // MqttRemoteSend(new byte[] { 0 }, 3); // } // } // }); // } // #endregion // } // try // { // //--第一步:获取mqtt链接参数 提交MAC 服务器自动判断是否为新网关,返回是否需要自动切换远程连接的服务器 // var mqttInfoRequestPar = new RemoteRequestParameters() // { // PlatformStr = "ON", // LoginAccessToken = UserInfo.Current.loginTokenString, // RequestVersion = MainPage.VersionString, // RequestProtocolType = 0, // RequestSource = 1, // HdlGatewayGatewayType = 0, // PublishPayloadJsonStr = PushSignStr, // Mac = HDL_ON.Entity.DB_ResidenceData.residenceData.residenceGatewayMAC, // }; // var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(mqttInfoRequestPar); // var mqttInfoRequestResult = new HDL_ON.DAL.Server.HttpServerRequest().RequestMqttInfo(jsonString); // if (mqttInfoRequestResult != null && mqttInfoRequestResult.ResponseData != null) // { // try // { // var mqttInfoRequestResult_Obj = Newtonsoft.Json.JsonConvert.DeserializeObject(mqttInfoRequestResult.ResponseData.ToString()); // if (mqttInfoRequestResult_Obj != null) // { // string url = mqttInfoRequestResult_Obj.connEmqDomainPort; // string clientId = mqttInfoRequestResult_Obj.connEmqClientId; // string username = mqttInfoRequestResult_Obj.connEmqUserName; // string passwordRemote = mqttInfoRequestResult_Obj.connEmqPwd; // if (mqttInfoRequestResult_Obj.AccountAllGateways != null && mqttInfoRequestResult_Obj.AccountAllGateways.Count > 0) // { // //----第二步找出是否存在匹配当前住宅的mac,存在再进行远程。 // foreach (var curRegionMac in DB_ResidenceData.residenceData.residecenInfo.homeGateways) // { // CurRemoteMACInfo = mqttInfoRequestResult_Obj.AccountAllGateways.Find((obj) => obj.mac == curRegionMac.GatewayUniqueId); // if (CurRemoteMACInfo != null) // { // break; // } // } // if (CurRemoteMACInfo != null) // { // CurRemoteMACInfo.LoginAccessToken = UserInfo.Current.loginTokenString; // CurRemoteMACInfo.clientId = clientId; // mqttEncryptKey = CurRemoteMACInfo.isNewBusproGateway ? 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; // IsDisConnectingWithSendCatch = false; // } // } // } // } // catch { } // } // } // catch (Exception e) // { // } // finally // { // //最终要释放连接状态 // remoteMqttIsConnecting = false; // } // }); // } // ///// // ///// 收到网关上线消息 // ///// // //static void ReceiveNotifyBusGateWayInfoChange() // //{ // // var gatewayListUrl = @"https://developer.hdlcontrol.com/Center/Center/GetGatewayPagger"; //App、Buspro软件登录后获取网关列表 http 请求 // // var gatewayListRequestPar = new RemoteRequestParameters() { Mac = CurRemoteMACInfo.mac, LoginAccessToken = UserInfo.Current.loginTokenString, 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(gatewayListRequestResult.ResponseData.ToString()); // // if (gatewayListRequestResult_Obj != null && gatewayListRequestResult_Obj.pageData.Count > 0) // // { // // CurRemoteMACInfo.aesKey = gatewayListRequestResult_Obj.pageData[0].aesKey; // // mqttEncryptKey = CurRemoteMACInfo.isNewBusproGateway ? CurRemoteMACInfo.aesKey : ""; // // } // //} // /// // /// 收到挤下线推送 // /// // static void ReceiveNotifySqueezeAsync(string mMes) // { // if (mMes == PushSignStr) return;//是自己的登录推送不处理 // //断开远程连接 // MainPage.IsRemote = false; // if (! UserInfo.Current.IsLogin) // { // return; // } // UserInfo.Current.lastTime = DateTime.MinValue; // UserInfo.Current.SaveUserInfo(); // string oldRegionRootPath = FileUtils.CreateRegionBackup(DB_ResidenceData.residenceData.CurReginID.ToString()); // new System.Threading.Thread(() => // { // try // { // var backuplist = FileUtils.ReadFiles(); // FileUtils.DeleteRegionFiles(oldRegionRootPath); // //移动文件 // foreach (var fileName in backuplist) // { // System.IO.FileInfo fileInfo = new System.IO.FileInfo(FileUtils.RootPath + fileName); // if (fileName == "headImage.png") // { // continue; // } // if (fileInfo.Exists) // { // fileInfo.MoveTo(oldRegionRootPath + fileName); // MainPage.Log("move file : " + fileName); // } // } // //删除本地文件 // foreach (var fileName in backuplist) // { // if (fileName == "headImage.png") // { // continue; // } // FileUtils.DeleteFile(fileName); // } // } // catch (Exception ex) // { // MainPage.Log(ex.Message); // } // finally // { // } // }) // { IsBackground = true }.Start(); // //删除推送数据 // DisConnectRemoteMqttClient("挤下线"); // Application.RunOnMainThread(() => // { // MainPage.GoLoginPage( UserInfo.Current); // }); // } // /// // /// 收到CheckGateway主题 // /// // static void ReceiveCheckGateway(string mMes) // { // var obj = Newtonsoft.Json.JsonConvert.DeserializeObject(mMes); // if (obj == null) // { // return; // } // switch (obj.StateCode) // { // case "HDLUdpDataForwardServerMqttClientNoOnLine": // case "NoOnline": // case "NetworkAnomaly"://不在线 // Application.RunOnMainThread(() => // { // new HDL_ON.UI.PublicAssmebly().TipMsgAutoClose(Language.StringByID(StringId.RemoteFailedGatewayOffline), true); // }); // break; // case "NoRecord"://MAC不正确 // Application.RunOnMainThread(() => { // new HDL_ON.UI.PublicAssmebly().TipMsgAutoClose(Language.StringByID(StringId.MACError), true); // }); // break; // case "Success": // break; // default: // Application.RunOnMainThread(() => { // new HDL_ON.UI.PublicAssmebly().TipMsgAutoClose(Language.StringByID(StringId.LinkLoser), true); // }); // break; // } // } // /// // /// // /// // /// 附加数据包 // /// 操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据 // /// // public static async Task MqttRemoteSend(byte[] message, int optionType = 0) // { // try // { // string topicName; // switch (optionType) // { // case 0: // topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/ON"; // if (!string.IsNullOrEmpty(mqttEncryptKey)) // { // message = Shared.Securitys.EncryptionService.AesEncryptPayload(message, mqttEncryptKey); // } // await RemoteMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topicName, Payload = message, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce }); // break; // case 3: // topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway"; // Console.WriteLine("CheckGateway"); // await RemoteMqttClient.PublishAsync(new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce }); // break; // } // } // catch (Exception e) // { // //System.Console.WriteLine ($"============>Mqtt MqttRemoteSend catch"); // if (!IsDisConnectingWithSendCatch) // { // IsDisConnectingWithSendCatch = true; // await DisConnectRemoteMqttClient("SendCatch"); // } // } // } // /// // /// SendCatch 后执行一次断开操作 // /// // static bool IsDisConnectingWithSendCatch = false; // } //}