使用MQTTnet部署MQTT服务

摘要:
//Www.cnblogs.com/zhaoqm999/p/12960677.html I.服务器1。您可以使用`varoptions=newMqttServerOptions();}创建配置参数服务关闭事件服务器。StoppedHandler=新MqttServerStoppedHandlerDelegate(已停止);
使用MQTTnet部署MQTT服务
 

下载地址:https://github.com/chkr1011/MQTTnet

引用地址:https://www.cnblogs.com/zhaoqm999/p/12960677.html

一. 服务端

1. 创建配置参数

可以使用 `var options = new MqttServerOptions();` 直接构建一个options。你也可以通过参数构建器 `var options = new MqttServerOptionsBuilder();` 使代码更简洁美观。

构建器的函数说明:

函数名功能说明
Build构建配置参数
WithApplicationMessageInterceptor允许处理来自客户端的所有已发布消息
WithClientId服务端发布消息时使用的ClientId
WithConnectionBacklog设置要保留的连接数
WithConnectionValidator验证连接
WithDefaultCommunicationTimeout设置默认的通信超时
WithDefaultEndpoint使用默认端点
WithDefaultEndpointBoundIPAddress使用默认端点IPv4地址
WithDefaultEndpointBoundIPV6Address使用默认端点IPv6地址
WithDefaultEndpointPort使用默认端点端口
WithEncryptedEndpoint使用加密的端点
WithEncryptedEndpointBoundIPAddress使用加密的端点IPv4地址
WithEncryptedEndpointBoundIPV6Address使用加密的端点IPv6地址
WithEncryptedEndpointPort使用加密的端点端口
WithEncryptionCertificate使用证书进行SSL连接
WithEncryptionSslProtocol使用SSL协议级别
WithMaxPendingMessagesPerClient每个客户端允许最多未决消息
WithPersistentSessions保持会话
WithStorage使用存储
WithSubscriptionInterceptor允许处理来自客户端的所有订阅
WithoutDefaultEndpoint禁用默认端点
WithoutEncryptedEndpoint禁用默认(SSL)端点

验证账号密码

  1. options.WithConnectionValidator(c =>
  2. {
  3. if (c.Username != "seven")
  4. {
  5. c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
  6. }
  7. });

2. 启动服务端

  1. var server = new MqttFactory().CreateMqttServer();
  2. server.StartAsync(options.Build());

服务启动事件

  1. server.StartedHandler = new MqttServerStartedHandlerDelegate(Started);
  2. static async Task Started(EventArgs e)
  3. {
  4. Console.WriteLine("Started");
  5. }

服务关闭事件

  1. server.StoppedHandler = new MqttServerStoppedHandlerDelegate(Stopped);
  2. static async Task Stopped(EventArgs e)
  3. {
  4. Console.WriteLine("Stopped");
  5. }

客户端连接事件

  1. server.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(Connected);
  1. server.UseClientConnectedHandler(c => Connected(c));
  2. static async Task Connected(MqttServerClientConnectedEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId} connected");
  5. }

客户端断开事件

  1. server.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(Disconnected);
  1. server.UseClientDisconnectedHandler(c => Disconnected(c));
  2. static async Task Disconnected(MqttServerClientDisconnectedEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId} disconnected");
  5. }

客户端订阅Topic

  1. server.ClientSubscribedTopicHandler = new MqttServerClientSubscribedHandlerDelegate(Subscribed);
  2. static async Task Subscribed(MqttServerClientSubscribedTopicEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId} subscribed {e.TopicFilter.Topic}");
  5. }

客户端取消订阅Topic

  1. server.ClientUnsubscribedTopicHandler = new MqttServerClientUnsubscribedTopicHandlerDelegate(c => Unsubscribed(c));
  2. static async Task Unsubscribed(MqttServerClientUnsubscribedTopicEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId} unsubscribed {e.TopicFilter}");
  5. }

消息接收

  1. server.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(MessageReceived);
  1. server.UseApplicationMessageReceivedHandler(c => MessageReceived(c));
  2. static async Task MessageReceived(MqttApplicationMessageReceivedEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId} get {e.ApplicationMessage.Topic}");
  5. }

3. 操作

发布消息

  1. var message = new MqttApplicationMessage()
  2. {
  3. Topic = "testTopic",
  4. Payload = Encoding.UTF8.GetBytes("hello seven")
  5. };
  6. server.PublishAsync(message);

查询客户端状态

  1. var list = server.GetClientStatusAsync().Result;

获取会话信息

  1. var sessions = server.GetSessionStatusAsync().Result;

查询Retain的消息

  1. var messages = server.GetRetainedApplicationMessagesAsync().Result;

清空Retain消息

  1. server.ClearRetainedApplicationMessagesAsync();

停止服务

  1. server.StopAsync();

4. 其他

自带的日志跟踪

  1. var logger = new MqttNetLogger();
  2. logger.LogMessagePublished += LogMessagePublished;
  3. private static void LogMessagePublished(object sender, MqttNetLogMessagePublishedEventArgs e)
  4. {
  5. Console.WriteLine(e.LogMessage);
  6. Console.WriteLine(e.TraceMessage);
  7. }

二. 客户端

1. 创建配置参数

可以使用 `var options = new MqttClientOptions();` 直接构建一个options。你也可以通过参数构建器 `var options = new MqttClientOptionsBuilder();` 使代码更简洁美观。

构建器的函数说明:

函数名功能说明
Build构建配置参数
WithAuthentication允许使用不同的身份验证模式
WithCleanSession将客户端与MQTT干净会话支持一起使用
WithClientId设置客户端ID
WithCommunicationTimeout设置通信超时
WithCredentials设置登录凭证
WithExtendedAuthenticationExchangeHandler以自定义方式处理身份验证
WithKeepAlivePeriod设置保持有效期
WithKeepAliveSendInterval设置保活的发送间隔
WithMaximumPacketSize设置最大数据包大小
WithNoKeepAlive不要使用保持活动状态
WithProtocolVersion设置MQTT协议版本
WithProxy设置代理
WithTls客户端使用SSL/TLS
WithTopicAliasMaximum允许最大数量的主题别名
WithReceiveMaximum允许最大数量的已接收数据包
WithRequestProblemInformation显示请求问题信息
WithRequestResponseInformation显示请求响应问题信息
WithSessionExpiryInterval一段时间后终止会话
WithTcpServer告诉客户端(通过TCP)连接到哪个MQTT代理。
WithWebSocketServer告诉客户端(通过WebSocket)连接到哪个MQTT代理
WithWillMessage告诉客户端最后一条消息将被发送。
WithWillDelayInterval告诉客户端最后一个消息得延迟间隔

2. 连接服务端

  1. var client = new MqttFactory().CreateMqttClient();
  2. client.ConnectAsync(options.Build());

客户端连接完成事件

  1. client.UseConnectedHandler(e => Connected(e));
  2. static async Task Connected(MqttClientConnectedEventArgs e)
  3. {
  4. Console.WriteLine($"Connected");
  5. }

客户端断开事件

  1. client.UseDisconnectedHandler(e => Disconnected(e));
  2. static async Task Disconnected(MqttClientDisconnectedEventArgs e)
  3. {
  4. Console.WriteLine($"Disconnected");
  5. }

订阅主题(必须在成功连接以后才生效)

  1. client.UseApplicationMessageReceivedHandler(e => MessageReceived(e));
  2. static async Task MessageReceived(MqttApplicationMessageReceivedEventArgs e)
  3. {
  4. Console.WriteLine($"{e.ClientId}");
  5. }

发布消息( 必须在成功连接以后才生效 )

  1. var message = new MqttApplicationMessageBuilder()
  2. .WithTopic("myTopic")
  3. .WithPayload("seven365.cn")
  4. .WithExactlyOnceQoS()
  5. .WithRetainFlag()
  6. .Build();
  7. client.PublishAsync(message, CancellationToken.None);

3. 操作

客户端重连

  1. client.ReconnectAsync();

客户端断开

  1. client.DisconnectAsync

免责声明:文章转载自《使用MQTTnet部署MQTT服务》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PE重装系统一维条码,生成格式Code128码下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

用C代码简要模拟实现一下RPC(远程过程调用)并谈谈它在代码调测中的重要应用【转】

转自:http://blog.csdn.net/stpeace/article/details/44947925 版权声明:本文为博主原创文章,转载时请务必注明本文地址, 禁止用于任何商业用途, 否则会用法律维权。 http://blog.csdn.net/stpeace/article/details/44947925        说明: 本文仅仅是一...

netty 解决TCP粘包与拆包问题(二)

TCP以流的方式进行数据传输,上层应用协议为了对消息的区分,采用了以下几种方法。 1.消息固定长度 2.第一篇讲的回车换行符形式 3.以特殊字符作为消息结束符的形式 4.通过消息头中定义长度字段来标识消息的总长度 一、采用指定分割符解决粘包与拆包问题 服务端 1 package com.ming.netty.nio.stickpack; 2...

C#基础强化-继承与多态

/**  特性:    单根性:一个子类只能有一个父类    传递性:爷爷类 爹类 儿子类  里氏转换    1、子类可以赋值给父类    2、如果父类装的是子类对象,则可以将这个父类转换为对应的子类 is as 关键字    -->关键字      1、is:返回bool类型,指示是否是这个类型      2、as:如果转换成功返回对象,否则返回n...

nginx配置时server_name配的不一样还能正常访问

  原先server_name 配的是api.test.toutiao.applet.rockysaas.com,监听的是80端口,http。后来域名改成了api-test.tbk.rockysaas.com,监听443,https。但是发现原先的api.test.toutiao.applet.rockysaas.com还能访问。 server { #...

nginx的四层转发功能

架构图 配置过程 配置web服务器 # 1、配置web01,更改配置文件 [root@web01 /etc/nginx/conf.d]# vi test1.conf server { listen 8007; server_name test.gong.com; root /website/test;...

javascript console

javascript console console.log(object[, object, ...])在控制台输出一条消息。如果有多个参数,输出时会用空格隔开这些参数。 第一个参数可以是一个包含格式化占位符输出的字符串,例如: console.log("The %s jumped over %d tall buildings", animal, co...