Mqtt客户端:
1. 启动客户端
IMqttClient client = new MqttFactory().CreateMqttClient(); var build = new MqttClientOptionsBuilder() .WithClientId(model.ClientId) //客户端标识 .WithCredentials("test","1234") //用户名+密码 .WithTcpServer("192.168.0.1", "8080") //ip+端口,也可以是域名 await client.ConnectAsync(build.Build());
2. 接收消息
方式1
client.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MessageRecevicedHandler); private void MessageRecevicedHandler(MqttApplicationMessageReceivedEventArgs obj) { //Console.WriteLine($"主题:{obj.ApplicationMessage.Topic}"); //Console.WriteLine($"消息:{Encoding.UTF8.GetString(obj.ApplicationMessage.Payload)}"); Task.Run(()=> { onMessageReviced(obj.ApplicationMessage.Topic, Encoding.UTF8.GetString(obj.ApplicationMessage.Payload)); }); }
方式2
client.UseApplicationMessageReceivedHandler(args=> { Console.WriteLine("==================================================="); Console.WriteLine("收到消息:"); Console.WriteLine($"主题:{args.ApplicationMessage.Topic}"); Console.WriteLine($"消息:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}"); Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++"); Console.WriteLine(); });
3. MQTT刚连上时的操作
方式1
client.ConnectedHandler = new MqttClientConnectedHandlerDelegate(ConnectedHandler); private void ConnectedHandler(MqttClientConnectedEventArgs obj) { Console.WriteLine("Mqtt连接成功"); }
方式2
client.UseConnectedHandler(args=> { Console.WriteLine("Mqtt连接成功"); });
4. MQTT断开后的操作
方式1
client.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(DisconnectedHandlerAsync); private async Task DisconnectedHandlerAsync(MqttClientDisconnectedEventArgs obj) { Console.WriteLine("连接已断开,尝试重连中..."); await client.ReconnectAsync(); //重连 }
方式2
client.UseDisconnectedHandler(args => { Console.WriteLine("本客户端已经断开连接"); Console.WriteLine(); try { client.ConnectAsync(options).GetAwaiter().GetResult(); } catch (Exception) { Console.WriteLine("重连失败"); } });
5. 发布
public void publish(string topic, string context) { if (string.IsNullOrEmpty(topic)) { throw new Exception("发布主题不能为空!"); } var message = new MqttApplicationMessageBuilder() .WithTopic(topic) .WithPayload(context) .WithAtMostOnceQoS() .Build(); client.PublishAsync(message); }
6. 订阅
方式1
client.SubscribeAsync("主题名称").GetAwaiter().GetResult();
方式2
List<MqttTopicFilter> Topics = new List<MqttTopicFilter>(); Topics.Add(new MqttTopicFilter() { Topic= "主题名称A", QualityOfServiceLevel= MqttQualityOfServiceLevel.ExactlyOnce}); Topics.Add(new MqttTopicFilter() { Topic = "主题名称B" }); Topics.Add(new MqttTopicFilter() { Topic = "主题名称C" }); client.SubscribeAsync(Topics.ToArray()).GetAwaiter().GetResult(); //核心语句
方式3
MqttClientSubscribeOptionsBuilder builder = new MqttClientSubscribeOptionsBuilder(); builder.WithTopicFilter("AAA"); client.SubscribeAsync(builder.Build()).GetAwaiter().GetResult();
Mqtt服务端:
1. 启动服务端
IMqttServer server = new MqttFactory().CreateMqttServer(); MqttServerOptionsBuilder serverOptions = new MqttServerOptionsBuilder(); serverOptions.WithDefaultEndpointPort(8080); serverOptions.WithConnectionValidator(client => { string Account = client.Username; //用户名 string PassWord = client.Password; //密码 string clientid = client.ClientId; //客户端标识 if (Account == "test" && PassWord == "1234") { client.ReasonCode = MqttConnectReasonCode.Success; Console.WriteLine("校验成功"); } else { client.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword; Console.WriteLine("校验失败"); } }); await server.StartAsync(serverOptions.Build());
2. MQTT刚启动时的操作
server.StartedHandler = new MqttServerStartedHandlerDelegate(StartedHandler); private void StartedHandler(EventArgs obj) { Console.WriteLine($"程序已经启动!监听端口为:{model.Port}"); }
3. MQTT停止时的操作
server.StoppedHandler = new MqttServerStoppedHandlerDelegate(StoppedHandler); private void StoppedHandler(EventArgs obj) { Console.WriteLine("程序已经关闭"); }
4. 客户端连接事件
方式1
server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(ClientConnectedHandler); private void ClientConnectedHandler(MqttServerClientConnectedEventArgs obj) { Console.WriteLine($"{args.ClientId}此客户端已经连接到服务器"); }
方式2
server.UseClientConnectedHandler(args => { Console.WriteLine($"{args.ClientId}此客户端已经连接到服务器"); });
5. 客户端断开事件
方式1
server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(ClientDisconnectedHandler); private void ClientDisconnectedHandler(MqttServerClientDisconnectedEventArgs obj) { Console.WriteLine($"断开连接的客户端:{obj.ClientId}"); Console.WriteLine($"断开连接类型:{obj.DisconnectType.ToString()}"); }
方式2
server.UseClientDisconnectedHandler(args => { Console.WriteLine($"断开连接的客户端:{args.ClientId}"); Console.WriteLine($"断开连接类型:{args.DisconnectType.ToString()}"); });
6. 监听消息
方式1
server.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MessageReceivedHandler); private void MessageReceivedHandler(MqttApplicationMessageReceivedEventArgs obj) { Console.WriteLine("==================================================="); Console.WriteLine("收到消息:"); Console.WriteLine($"客户端:{obj.ClientId}"); Console.WriteLine($"主题:{obj.ApplicationMessage.Topic}"); Console.WriteLine($"消息:{Encoding.UTF8.GetString(obj.ApplicationMessage.Payload)}"); Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++"); Console.WriteLine(); }
方式2
server.UseApplicationMessageReceivedHandler(args=>{ Console.WriteLine("==================================================="); Console.WriteLine("收到消息:"); Console.WriteLine($"客户端:{args.ClientId}"); Console.WriteLine($"主题:{args.ApplicationMessage.Topic}"); Console.WriteLine($"消息:{Encoding.UTF8.GetString(args.ApplicationMessage.Payload)}"); Console.WriteLine("+++++++++++++++++++++++++++++++++++++++++++++++++++"); Console.WriteLine(); });
7. 客户端主题管理事件
订阅
server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(ClientSubscribedTopicHandler); private void ClientSubscribedTopicHandler(MqttServerClientSubscribedTopicEventArgs obj) { Console.WriteLine($"客户端:{obj.ClientId}"); Console.WriteLine($"订阅主题:{obj.TopicFilter.Topic}"); }
取消订阅
server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(ClientUnsubscribedTopicHandler); private void ClientUnsubscribedTopicHandler(MqttServerClientUnsubscribedTopicEventArgs obj) { Console.WriteLine($"客户端:{obj.ClientId}"); Console.WriteLine($"取消订阅主题:{obj.TopicFilter}"); }
8. 关闭MQTT服务器
public async Task StopAsync() { if (server != null) { if (server.IsStarted) { await server.StopAsync(); server.Dispose(); } } }