| | |
| | | //using System; |
| | | //using MQTTnet.Client; |
| | | //using MQTTnet; |
| | | //using MQTTnet.Client.Options; |
| | | //using System.Net.Sockets; |
| | | //using System.Threading.Tasks; |
| | | using System; |
| | | using MQTTnet.Client; |
| | | using MQTTnet; |
| | | using MQTTnet.Client.Options; |
| | | using System.Net.Sockets; |
| | | using System.Threading.Tasks; |
| | | |
| | | //namespace HDL_ON.DAL.Net |
| | | //{ |
| | | // public static class Mqtt_A_Protocol |
| | | // { |
| | | // /// <summary> |
| | | // /// MqttClient |
| | | // /// </summary> |
| | | // public static IMqttClient mqttClient_A; |
| | | // public static string mqttClientIP; |
| | | // public static string mqttGatewayMAC; |
| | | // static bool remoteIsConnected; |
| | | namespace HDL_ON.DAL.Net |
| | | { |
| | | public static class Mqtt_A_Protocol |
| | | { |
| | | /// <summary> |
| | | /// MqttClient |
| | | /// </summary> |
| | | public static IMqttClient mqttClient_A; |
| | | public static string mqttClientIP; |
| | | public static string mqttGatewayMAC; |
| | | static bool remoteIsConnected; |
| | | |
| | | // static bool onConnection = false; |
| | | static bool onConnection = false; |
| | | |
| | | // static Mqtt_A_Protocol() |
| | | // { |
| | | // InitMqtt(); |
| | | // } |
| | | static Mqtt_A_Protocol() |
| | | { |
| | | InitMqtt(); |
| | | } |
| | | |
| | | // /// <summary> |
| | | // /// 断开远程Mqtt的链接 |
| | | // /// </summary> |
| | | // public static async Task DisConnectRemoteMqttClient(string s = "") |
| | | // { |
| | | // try |
| | | // { |
| | | // if (remoteIsConnected) |
| | | // { |
| | | // remoteIsConnected = false; |
| | | // System.Console.WriteLine($"Remote主动断开_{s}"); |
| | | // //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None); |
| | | // await mqttClient_A.DisconnectAsync(); |
| | | // } |
| | | // } |
| | | // catch (Exception e) |
| | | // { |
| | | // Console.WriteLine($"Remote断开通讯连接出异常:{e.Message}"); |
| | | // } |
| | | // } |
| | | /// <summary> |
| | | /// 断开远程Mqtt的链接 |
| | | /// </summary> |
| | | public static async Task DisConnectRemoteMqttClient(string s = "") |
| | | { |
| | | try |
| | | { |
| | | if (remoteIsConnected) |
| | | { |
| | | remoteIsConnected = false; |
| | | System.Console.WriteLine($"Remote主动断开_{s}"); |
| | | //await RemoteMqttClient.DisconnectAsync(new MQTTnet.Client.Disconnecting.MqttClientDisconnectOptions { }, CancellationToken.None); |
| | | await mqttClient_A.DisconnectAsync(); |
| | | } |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | Console.WriteLine($"Remote断开通讯连接出异常:{e.Message}"); |
| | | } |
| | | } |
| | | |
| | | // static bool isSubscribeSuccess; |
| | | // static async Task SubscribeTopics() |
| | | // { |
| | | // if (remoteIsConnected && !isSubscribeSuccess) |
| | | // { |
| | | // try |
| | | // { |
| | | // var Topic1 = $"/BusGateWayToApp/{mqttGatewayMAC}/Common/Json"; |
| | | // try |
| | | // { |
| | | // await mqttClient_A.SubscribeAsync(Topic1); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // await DisConnectRemoteMqttClient(ex.Message); |
| | | // await StartMqtt(); |
| | | // if (remoteIsConnected) |
| | | // { |
| | | // await mqttClient_A.SubscribeAsync(Topic1); |
| | | // } |
| | | // } |
| | | // } |
| | | // catch { } |
| | | // } |
| | | // } |
| | | static bool isSubscribeSuccess; |
| | | static async Task SubscribeTopics() |
| | | { |
| | | if (remoteIsConnected && !isSubscribeSuccess) |
| | | { |
| | | try |
| | | { |
| | | var Topic1 = $"/BusGateWayToApp/{mqttGatewayMAC}/Common/Json"; |
| | | try |
| | | { |
| | | await mqttClient_A.SubscribeAsync(Topic1); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | await DisConnectRemoteMqttClient(ex.Message); |
| | | await StartMqtt(); |
| | | if (remoteIsConnected) |
| | | { |
| | | await mqttClient_A.SubscribeAsync(Topic1); |
| | | } |
| | | } |
| | | } |
| | | catch { } |
| | | } |
| | | } |
| | | |
| | | // static void InitMqtt() |
| | | // { |
| | | // new System.Threading.Thread(async () => |
| | | // { |
| | | // while (true) |
| | | // { |
| | | // try |
| | | // { |
| | | // System.Threading.Thread.Sleep(1000); |
| | | // //if (!CommonPage.IsRemote) |
| | | // // continue; |
| | | // if (remoteIsConnected) |
| | | // continue; |
| | | // await StartMqtt(); |
| | | // await SubscribeTopics(); |
| | | // } |
| | | // catch { } |
| | | // } |
| | | // }) |
| | | // { IsBackground = true }.Start(); |
| | | // } |
| | | static void InitMqtt() |
| | | { |
| | | new System.Threading.Thread(async () => |
| | | { |
| | | while (true) |
| | | { |
| | | try |
| | | { |
| | | System.Threading.Thread.Sleep(1000); |
| | | //if (!CommonPage.IsRemote) |
| | | // continue; |
| | | if (remoteIsConnected) |
| | | continue; |
| | | await StartMqtt(); |
| | | await SubscribeTopics(); |
| | | } |
| | | catch { } |
| | | } |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | } |
| | | |
| | | // /// <summary> |
| | | // /// 启动A协议Mqtt |
| | | // /// </summary> |
| | | // public static async Task StartMqtt() |
| | | // { |
| | | // try |
| | | // { |
| | | // if (remoteIsConnected) |
| | | // return; |
| | | // if (onConnection) |
| | | // return; |
| | | // onConnection = true; |
| | | // new System.Threading.Thread(async () => |
| | | // { |
| | | // if (remoteIsConnected) |
| | | // return; |
| | | // try |
| | | // { |
| | | // if (mqttClient_A == null) |
| | | // { |
| | | // mqttClient_A = new MqttFactory().CreateMqttClient(); |
| | | // mqttClient_A.UseApplicationMessageReceivedHandler(async e => |
| | | // { |
| | | // var aesDecryptTopic = e.ApplicationMessage.Topic; |
| | | // var aesDecryptPayload = e.ApplicationMessage.Payload; |
| | | // MainPage.Log(aesDecryptTopic); |
| | | // MainPage.Log($"Des Topic={aesDecryptTopic}"); |
| | | // }); |
| | | /// <summary> |
| | | /// 启动A协议Mqtt |
| | | /// </summary> |
| | | public static async Task StartMqtt() |
| | | { |
| | | try |
| | | { |
| | | if (remoteIsConnected) |
| | | return; |
| | | if (onConnection) |
| | | return; |
| | | onConnection = true; |
| | | new System.Threading.Thread(async () => |
| | | { |
| | | if (remoteIsConnected) |
| | | return; |
| | | try |
| | | { |
| | | if (mqttClient_A == null) |
| | | { |
| | | mqttClient_A = new MqttFactory().CreateMqttClient(); |
| | | mqttClient_A.UseApplicationMessageReceivedHandler(async e => |
| | | { |
| | | var aesDecryptTopic = e.ApplicationMessage.Topic; |
| | | var aesDecryptPayload = e.ApplicationMessage.Payload; |
| | | MainPage.Log(aesDecryptTopic); |
| | | MainPage.Log($"Des Topic={aesDecryptTopic}"); |
| | | }); |
| | | |
| | | // mqttClient_A.UseConnectedHandler(async (e) => |
| | | // { |
| | | // MainPage.Log("mqtt connected !!"); |
| | | // onConnection = false; |
| | | // }); |
| | | // } |
| | | // try |
| | | // { |
| | | // int readCount = 0; |
| | | // BusSocket.Stop(); |
| | | // System.Threading.Thread.Sleep(1000); |
| | | // BusSocket.Start(6688); |
| | | // System.Threading.Thread.Sleep(1000); |
| | | // Control.ReadGatewayIPAddress(); |
| | | // while (true) |
| | | // { |
| | | // if (!string.IsNullOrEmpty(mqttClientIP)) |
| | | // { |
| | | // break; |
| | | // } |
| | | // else if (readCount > 10) |
| | | // { |
| | | // onConnection = false; |
| | | // return; |
| | | // } |
| | | // else |
| | | // { |
| | | // Control.ReadGatewayIPAddress(); |
| | | // System.Threading.Thread.Sleep(200); |
| | | // } |
| | | // } |
| | | // BusSocket.Stop(); |
| | | // System.Threading.Thread.Sleep(1000); |
| | | // BusSocket.Start(6000); |
| | | // System.Threading.Thread.Sleep(1000); |
| | | mqttClient_A.UseConnectedHandler(async (e) => |
| | | { |
| | | MainPage.Log("mqtt connected !!"); |
| | | onConnection = false; |
| | | }); |
| | | } |
| | | try |
| | | { |
| | | int readCount = 0; |
| | | BusSocket.Stop(); |
| | | System.Threading.Thread.Sleep(1000); |
| | | BusSocket.Start(6688); |
| | | System.Threading.Thread.Sleep(1000); |
| | | Control.ReadGatewayIPAddress(); |
| | | while (true) |
| | | { |
| | | if (!string.IsNullOrEmpty(mqttClientIP)) |
| | | { |
| | | break; |
| | | } |
| | | else if (readCount > 10) |
| | | { |
| | | onConnection = false; |
| | | return; |
| | | } |
| | | else |
| | | { |
| | | Control.ReadGatewayIPAddress(); |
| | | System.Threading.Thread.Sleep(200); |
| | | } |
| | | } |
| | | BusSocket.Stop(); |
| | | System.Threading.Thread.Sleep(1000); |
| | | BusSocket.Start(6000); |
| | | System.Threading.Thread.Sleep(1000); |
| | | |
| | | // var options = new MqttClientOptionsBuilder()//MQTT连接参数填充 |
| | | // .WithClientId(Guid.NewGuid().ToString().Substring(0, 5))//客户端ID |
| | | // .WithTcpServer(mqttClientIP, 1883)//MQTTServerIP.Text, Int32.Parse(MQTTServerPort.Text.ToString()))//TCP服务端 1883 ,即MQTT服务端 |
| | | // .WithCredentials("", "")//"", "")//凭证 帐号 密码 |
| | | // .WithCommunicationTimeout(new TimeSpan(0, 0, 60)) //重连超时时间,默认5s |
| | | // .WithKeepAlivePeriod(new TimeSpan(0, 0, 15)) //保持连接时间,默认5s,心跳包 |
| | | // .Build(); |
| | | // await mqttClient_A.ConnectAsync(options); |
| | | // remoteIsConnected = true; |
| | | // } |
| | | // catch { } |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // } |
| | | // finally |
| | | // { |
| | | // onConnection = false; |
| | | // } |
| | | // }) |
| | | // { IsBackground = true }.Start(); |
| | | // } |
| | | // catch (Exception ex) |
| | | // { |
| | | // MainPage.Log("============>" + ex.Message); |
| | | // } |
| | | // } |
| | | var options = new MqttClientOptionsBuilder()//MQTT连接参数填充 |
| | | .WithClientId(Guid.NewGuid().ToString().Substring(0, 5))//客户端ID |
| | | .WithTcpServer(mqttClientIP, 1883)//MQTTServerIP.Text, Int32.Parse(MQTTServerPort.Text.ToString()))//TCP服务端 1883 ,即MQTT服务端 |
| | | .WithCredentials("", "")//"", "")//凭证 帐号 密码 |
| | | .WithCommunicationTimeout(new TimeSpan(0, 0, 60)) //重连超时时间,默认5s |
| | | .WithKeepAlivePeriod(new TimeSpan(0, 0, 15)) //保持连接时间,默认5s,心跳包 |
| | | .Build(); |
| | | await mqttClient_A.ConnectAsync(options); |
| | | remoteIsConnected = true; |
| | | } |
| | | catch { } |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | } |
| | | finally |
| | | { |
| | | onConnection = false; |
| | | } |
| | | }) |
| | | { IsBackground = true }.Start(); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | MainPage.Log("============>" + ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | |
| | | // /// <summary> |
| | | // /// |
| | | // /// </summary> |
| | | // /// <param name="message">附加数据包</param> |
| | | // /// <param name="optionType">操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据</param> |
| | | // /// <returns></returns> |
| | | // public static async Task MqttRemoteSend(byte[] message) |
| | | // { |
| | | // try |
| | | // { |
| | | // if (mqttClient_A == null || !mqttClient_A.IsConnected) |
| | | // { |
| | | // await StartMqtt(); |
| | | // } |
| | | // if (!mqttClient_A.IsConnected) |
| | | // { |
| | | // return; |
| | | // } |
| | | // var topicName = $"/AppToBusGateWay/{mqttGatewayMAC}/Common/Json"; |
| | | // var m = new MqttApplicationMessage { Topic = topicName, Payload = message, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; |
| | | // await mqttClient_A?.PublishAsync(m); |
| | | // } |
| | | // catch (Exception e) |
| | | // { |
| | | // } |
| | | // } |
| | | // } |
| | | //} |
| | | /// <summary> |
| | | /// |
| | | /// </summary> |
| | | /// <param name="message">附加数据包</param> |
| | | /// <param name="optionType">操作类型:0=网关控制;1=订阅网关数据;2=订阅网关上线数据</param> |
| | | /// <returns></returns> |
| | | public static async Task MqttRemoteSend(byte[] message) |
| | | { |
| | | try |
| | | { |
| | | if (mqttClient_A == null || !mqttClient_A.IsConnected) |
| | | { |
| | | await StartMqtt(); |
| | | } |
| | | if (!mqttClient_A.IsConnected) |
| | | { |
| | | return; |
| | | } |
| | | var topicName = $"/AppToBusGateWay/{mqttGatewayMAC}/Common/Json"; |
| | | var m = new MqttApplicationMessage { Topic = topicName, Payload = message, Retain = false, QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce }; |
| | | await mqttClient_A?.PublishAsync(m); |
| | | } |
| | | catch (Exception e) |
| | | { |
| | | } |
| | | } |
| | | } |
| | | } |