From 9137222ece9b978eb97b5598f2eee6e070bcf9d6 Mon Sep 17 00:00:00 2001
From: JLChen <551775569@qq.com>
Date: 星期五, 28 二月 2020 15:22:16 +0800
Subject: [PATCH] 2020-02-28 更新
---
Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs | 246 ++++++++++++++++++++++++++++++++++++-------------
1 files changed, 180 insertions(+), 66 deletions(-)
diff --git a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
index 2536317..4d25cae 100644
--- a/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
+++ b/Crabtree/SmartHome/UI/SimpleControl/MqttCommon.cs
@@ -21,6 +21,7 @@
static string checkGatewayTopicBase64 = "";
static RemoteMACInfo CurRemoteMACInfo = null;
static MqttInfo mMqttInfo = null;
+ public static bool IsGatewayOnline = true;
/// <summary>
/// 鎵嬫満鏍囪瘑
@@ -46,6 +47,10 @@
InitMqtt ();
}
+ /// <summary>
+ /// 淇濇椿閲嶈繛鍜岄噸璁㈤槄 绾跨▼
+ /// </summary>
+ /// <returns></returns>
public static async System.Threading.Tasks.Task InitMqtt ()
{
new System.Threading.Thread (async () => {
@@ -93,9 +98,15 @@
QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
};
+ //缃戝叧鎺夌嚎涓婚
+ var topicFilterNotifyGateWayOffline = new TopicFilter () {
+ Topic = $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayOffline",
+ QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
+ };
+
- var topicFilters = new TopicFilter [] { topicFilterCommon, topicFilterGateWayInfoChange, topicFilterNotifySqueeze };
+ var topicFilters = new TopicFilter [] { topicFilterCommon, topicFilterGateWayInfoChange, topicFilterNotifySqueeze, topicFilterNotifyGateWayOffline };
var result = await RemoteMqttClient.SubscribeAsync (topicFilters);
if (result.Items [0].ResultCode == MQTTnet.Client.Subscribing.MqttClientSubscribeResultCode.GrantedQoS2) {
isSubscribeTopicSuccess = true;
@@ -108,21 +119,26 @@
- /// <summary>
- /// 鏂紑杩滅▼Mqtt鐨勯摼鎺�
+ /// <summary>
+ /// 鏂紑杩滅▼Mqtt鐨勯摼鎺�
/// </summary>
- public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
- {
- try {
- if (remoteIsConnected) {
- remoteIsConnected = false;
- System.Console.WriteLine ($"============>MqttRemote涓诲姩鏂紑_{s}");
- //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
+ public static async System.Threading.Tasks.Task DisConnectRemoteMqttClient (string s = "")
+ {
+ try {
+ if (remoteIsConnected) {
+ remoteIsConnected = false;
+ System.Console.WriteLine ($"============>MqttRemote涓诲姩鏂紑_{s}");
+ //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None);
await RemoteMqttClient.DisconnectAsync ();
- }
+ if (CommonPage.IsRemote) {
+ Utlis.ShowAppLinkStatus (AppLinkStatus.CloudUnlink);
+ }
+ System.Console.WriteLine ($"============>MqttRemoteDisConnectRemoteMqttClient");
+
+ }
} catch (Exception e) {
- System.Console.WriteLine ($"============>MqttRemote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
- }
+ System.Console.WriteLine ($"============>MqttRemote鏂紑閫氳杩炴帴鍑哄紓甯�:{e.Message}");
+ }
}
static DateTime dateTime = DateTime.MinValue;
@@ -146,21 +162,11 @@
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) {
- //System.Console.WriteLine ($"============>MqttremoteMqttIsConnecting:{remoteMqttIsConnecting} remoteIsConnected:{remoteIsConnected} ");
-
+ if (remoteMqttIsConnecting || remoteIsConnected) {
return;
}
@@ -186,6 +192,8 @@
//2020-01-11 淇敼璁㈤槄涓婚鍦板潃
if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyBusGateWayInfoChange") {//缃戝叧涓婄嚎锛岄渶瑕佹洿鏂癮eskey //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
await ReceiveNotifyBusGateWayInfoChange ();
+ } else if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/NotifyGateWayOffline") {//缃戝叧鎺夌嚎 //----绗簩姝ワ細璇诲彇璐﹀彿涓嬮潰鐨勭綉鍏冲垪琛�
+ ReceiveNotifyGateWayOffline ();
} else if (aesDecryptTopic == $"/BusGateWayToClient/{mMqttInfo.connEmqClientId}/Push/NotifySqueeze") {//璁㈤槄鎸や笅绾块棶棰�
await ReceiveNotifySqueezeAsync (aesDecryptPayload);
}else if (aesDecryptTopic == $"/BusGateWayToClient/{CurRemoteMACInfo.macMark}/Common/CheckGateway") {
@@ -258,23 +266,38 @@
}
if (RemoteMqttClient.ConnectedHandler == null) {
RemoteMqttClient.UseConnectedHandler (async (e) => {
+ IfNeedReadAllDeviceStatus = true;
- Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
System.Console.WriteLine ($"============>Mqtt杩滅▼杩炴帴鎴愬姛");
if (CommonPage.IsRemote) {
Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
}
if (CurRemoteMACInfo != null) {
- if (CurRemoteMACInfo.isValid == "InValid") {
+ IsGatewayOnline = CurRemoteMACInfo.isValid != "InValid";
+ if (!IsGatewayOnline) {
+ //缃戝叧涓嶅湪绾�
+ if (CommonPage.IsRemote) {
+ Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+ }
MainPage.AddTip ("Remote failed,gateway offline");
- //Application.RunOnMainThread (() => {
- // MainPage.Loading.Hide ();
- //});
} else {
+ //缃戝叧鍦ㄧ嚎
+
+ //閲嶆柊涓�娆℃墍鏈夎澶囩姸鎬�
+ IfNeedReadAllDeviceStatus = false;
+ Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+ //
MqttRemoteSend (new byte [] { 0 }, 3);
}
+
+ //if (CurRemoteMACInfo.isValid == "InValid") {
+ // MainPage.AddTip ("Remote failed,gateway offline");
+ //} else {
+ // MqttRemoteSend (new byte [] { 0 }, 3);
+ //}
}
+
});
}
@@ -372,6 +395,7 @@
await DisConnectRemoteMqttClient ("StartRemoteMqtt");
await RemoteMqttClient.ConnectAsync (options1);
remoteIsConnected = true;
+ IsDisConnectingWithSendCatch = false;
//await MqttRemoteSend (new byte [] { 0 }, 1);
//await MqttRemoteSend (new byte [] { 0 }, 2);
//await MqttRemoteSend (new byte [] { 0 }, 4);
@@ -379,62 +403,112 @@
}
}
-
+
+ ///// <summary>
+ /////
+ ///// </summary>
+ ///// <param name="message">闄勫姞鏁版嵁鍖�</param>
+ ///// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁;3=璁㈤槄缃戝叧鏄惁鍦ㄧ嚎涓婚 4=璁㈤槄鎸や笅绾夸富棰� </param>
+ ///// <returns></returns>
+ //public static async Task MqttRemoteSend (byte [] message, int optionType = 0)
+ //{
+ // try {
+ // if (!remoteIsConnected) {
+ // System.Console.WriteLine ($"============>Mqtt 鏈繛鎺� 鍙栨秷鍙戦��");
+ // return;
+ // }
+
+ // 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 {
+ // RemoteMqttClient.PublishAsync (m);
+ // } catch (Exception e) {
+ // //await DisConnectRemoteMqttClient (e.Message);
+ // //await StartCloudMqtt ();
+ // //if (remoteIsConnected) {
+ // // RemoteMqttClient.PublishAsync (m);
+ // //}
+ // }
+ // //}
+ // break;
+ // case 3:
+ // topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/CheckGateway";
+
+ // var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
+
+ // try {
+ // Console.WriteLine ("CheckGateway");
+ // RemoteMqttClient.PublishAsync (m1);
+ // } catch (Exception e) {
+ // Console.WriteLine ($"CheckGateway Fail:{e.Message}");
+ // //await DisConnectRemoteMqttClient (e.Message);
+ // //await StartCloudMqtt ();
+ // }
+ // break;
+ // }
+
+
+ // } catch (Exception e) {
+
+ // }
+ //}
+
/// <summary>
///
/// </summary>
/// <param name="message">闄勫姞鏁版嵁鍖�</param>
- /// <param name="optionType">鎿嶄綔绫诲瀷锛�0=缃戝叧鎺у埗锛�1=璁㈤槄缃戝叧鏁版嵁;2=璁㈤槄缃戝叧涓婄嚎鏁版嵁;3=璁㈤槄缃戝叧鏄惁鍦ㄧ嚎涓婚 4=璁㈤槄鎸や笅绾夸富棰� </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;
+ //if (!remoteIsConnected) {
+ // System.Console.WriteLine ($"============>Mqtt 鏈繛鎺� 鍙栨秷鍙戦��");
+ // return;
+ //}
+
+ string topicName;
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);
+ topicName = $"/ClientToBusGateWay/{CurRemoteMACInfo.macMark}/Common/ON";
+ if (!string.IsNullOrEmpty (mqttEncryptKey)) {
+ message = 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 {
- RemoteMqttClient.PublishAsync (m);
- } catch (Exception e) {
- //await DisConnectRemoteMqttClient (e.Message);
- //await StartCloudMqtt ();
- //if (remoteIsConnected) {
- // RemoteMqttClient.PublishAsync (m);
- //}
- }
- //}
+ 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";
-
- var m1 = new MqttApplicationMessage { Topic = topicName, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce };
-
- try {
- Console.WriteLine ("CheckGateway");
- RemoteMqttClient.PublishAsync (m1);
- } catch (Exception e) {
- Console.WriteLine ($"CheckGateway Fail:{e.Message}");
- //await DisConnectRemoteMqttClient (e.Message);
- //await StartCloudMqtt ();
- }
+ 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 ("MqttRemoteSendCatch");
+ }
}
}
+ /// <summary>
+ /// SendCatch 鍚庢墽琛屼竴娆℃柇寮�鎿嶄綔
+ /// </summary>
+ static bool IsDisConnectingWithSendCatch = false;
+
+
/// <summary>
/// 鍒嗕韩浣忓畢 鑾峰彇褰撳墠浣忓畢缃戝叧淇℃伅骞朵笖杩炴帴MQTT 鎴栬�呭埛鏂�
@@ -494,12 +568,33 @@
}
-
+ /// <summary>
+ /// 鏄惁闇�瑕佽鍙栦竴娆℃墍鏈夎澶囩姸鎬�
+ /// </summary>
+ static bool IfNeedReadAllDeviceStatus = true;
/// <summary>
/// 鏀跺埌缃戝叧涓婄嚎娑堟伅
/// </summary>
static async Task ReceiveNotifyBusGateWayInfoChange ()
{
+ System.Console.WriteLine ("============>Mqtt 缃戝叧涓婄嚎");
+ IsGatewayOnline = true;
+ if (CommonPage.IsRemote) {
+
+ if (MainPage.WiFiStatus != "CrabtreeAdd/CloudLink.png") {
+ Utlis.ShowAppLinkStatus (AppLinkStatus.CloudLink);
+ }
+//#if DEBUG
+ MainPage.AddTip ("Gateway login online");
+//#endif
+ if (IfNeedReadAllDeviceStatus) {
+ IfNeedReadAllDeviceStatus = false;
+ Shared.SimpleControl.Phone.UserMiddle.ReadAllDeviceStatus ();
+ }
+
+
+ }
+
//褰撳墠浣忓畢涓嶆槸鍒嗕韩鏉�
if (!UserConfig.Instance.CurrentRegion.IsOthreShare) {
@@ -519,6 +614,24 @@
}
}
+ /// <summary>
+ /// 鏀跺埌缃戝叧鎺夌嚎淇℃伅
+ /// </summary>
+ static void ReceiveNotifyGateWayOffline ()
+ {
+ System.Console.WriteLine ("============>Mqtt GateWayOffline");
+ IsGatewayOnline = false;
+ if (CommonPage.IsRemote) {
+ Utlis.ShowAppLinkStatus (AppLinkStatus.CloudOffline);
+ MainPage.AddTip ("Remote failed,gateway offline");
+ //if (MainPage.WiFiStatus != "CrabtreeAdd/CloudUnlink.png") {
+ // Utlis.ShowAppLinkStatus (AppLinkStatus.CloudUnlink);
+ //}
+
+ }
+ }
+
+
/// <summary>
/// 鏀跺埌鎸や笅绾挎帹閫�
@@ -541,11 +654,12 @@
MainPage.LoginUser.LastTime = DateTime.Now.AddDays (-30);
MainPage.LoginUser.SaveUserInfo ();
- DisConnectRemoteMqttClient ("LoginOut");
+ DisConnectRemoteMqttClient ("鎸や笅绾�");
MainPage.ShowAlertOnMainThread (ErrorCode.LoginInAnotherDevice);
Application.RunOnMainThread (() => {
+
MainPage.WiFiStatus = "CrabtreeAdd/WiFi.png";
UserMiddle.btnLinkStatus.UnSelectedImagePath = MainPage.WiFiStatus;
new AccountLogin ().Show ();
--
Gitblit v1.8.0