使用MQTTnet连接MQTT服务-.NET Framework版本

本文介绍如何使用C#和MQTTnet库连接RabbitMQ MQTT服务,包括安装库、配置连接参数、注册回调事件、订阅主题及发布消息等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        上一篇RabbitMQ 搭建MQTT服务  中,创建了admin-test 用户,并创建 test-host 虚拟主机 专门处理MQTT业务,接着我们自己开发一个连接RabbitMQ MQTT服务的客户端

GitHub - harrylsp/MQTTClientContribute to harrylsp/MQTTClient development by creating an account on GitHub.https://github.com/harrylsp/MQTTClient

1.安装MQTTnet库

2. 连接MQTT服务

2.1 创建连接对象

var mqttFactory = new MqttFactory();
mqttClient = mqttFactory.CreateMqttClient() as MqttClient;

2.2 构建连接对象连接参数

var options = new MqttClientOptions
{
	ClientId = clientId,
	ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311,
	ChannelOptions = new MqttClientTcpOptions
	{
		Server = tcpServer,
		Port = tcpPort
	},
	WillDelayInterval = 10,
	WillMessage = new MqttApplicationMessage
	{
		Topic = $"LastWill/{clientId}",
		Payload = Encoding.UTF8.GetBytes("I Lost the Connection!"),
		QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
	}
};

if (options.ChannelOptions == null)
{
	throw new InvalidOperationException();
}

if (!string.IsNullOrWhiteSpace(mqttUser))
{
	options.Credentials = new MqttClientCredentials
	{
		Username = mqttUser,
		Password = Encoding.UTF8.GetBytes(mqttPassword)
	};
}

// 设置为false,表示创建一个持久会话,在客户端断开连接时,会话仍然保持并保存离线消息,直到会话超时注销。
// 设置为true,表示创建一个新的临时会话,在客户端断开时,会话自动销毁。
options.CleanSession = true;

// 连接保活心跳
options.KeepAlivePeriod = TimeSpan.FromSeconds(10);

2.3 注册监听回调事件

mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(new Action<MqttClientConnectedEventArgs>(e =>
{
	LogManager.WriteLogEx(LOGLEVEL.INFO, "客户端已连接");
}));

mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(new Action<MqttClientDisconnectedEventArgs>(e =>
{
	LogManager.WriteLogEx(LOGLEVEL.INFO, "客户端已断开连接");
}));

mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(new Action<MqttApplicationMessageReceivedEventArgs>(e =>
{
	string text = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
	string topic = e.ApplicationMessage.Topic;
	string qos = e.ApplicationMessage.QualityOfServiceLevel.ToString();
	string retained = e.ApplicationMessage.Retain.ToString();

	LogManager.WriteLogEx(LOGLEVEL.INFO, $"客户端接收消息 >>Topic:{topic}; Qos:{qos}; Retained:{retained}");
	LogManager.WriteLogEx(LOGLEVEL.INFO, $"客户端接收消息 >>Msg:{text}");
}));

2.4 发起连接

await mqttClient.ConnectAsync(options);
LogManager.WriteLogEx(LOGLEVEL.INFO, $"客户端{options.ClientId}尝试连接...");

2.5 连接MQTT服务

3. 订阅主题

await mqttClient.SubscribeAsync(topic);

 

4. 发布消息

var message = new MqttApplicationMessage
{
	Topic = topic,
	Payload = Encoding.UTF8.GetBytes(payload),
	QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce,
	Retain = true
};

await mqttClient.PublishAsync(message, CancellationToken.None);

 

5.其他

5.1 MQTT协议介绍

 https://docs.emqx.cn/broker/v4.3/development/protocol.html#mqtt%E5%8D%8F%E8%AE%AE

5.2 源码

GitHub - harrylsp/MQTTClient

.NET Framework 4.0 常用类库参考手册 [微软官方 MSDN] MSDN Library - .NET Framework 4.0 - 命名空间 (节选版) 制作成了chm格式,方便离线状态下学习! ======================================= 原文地址:http://msdn.microsoft.com/zh-cn/library/ms229335.aspx ======================================= .NET Framework 类库 - 命名空间 (节选版) Microsoft.Win32 提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。 System 包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类。其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对托管和非托管应用程序的监管。 System.Collections 包含定义各种对象集合(如列表、队列、位数组、哈希表和字典)的接口和类。 System.Data 包含组成大部分 ADO.NET 结构的类。ADO.NET 结构使您可以生成可用于有效管理来自多个数据源的数据的组件。 System.Data.Common 包含由 .NET Framework 数据提供程序共享的类。.NET Framework 数据提供程序描述用于在托管空间中访问数据源(如数据库)的类的集合。 System.Data.Linq 包含支持在 LINQ to SQL 应用程序中与关系数据库进行交互的类。 System.Data.Linq.Mapping 包含用于生成表示关系数据库的结构和内容的 LINQ to SQL 对象模型的类。 System.Data.Mapping 提供用于存储数据映射信息的类型。 System.Data.Metadata.Edm 包含一组类型,这些类型表示模型中由实体框架使用的概念,以及一组帮助应用程序使用元数据的类。 System.Data.Objects 包含可访问对象服务的核心功能的类。 System.Data.Objects.DataClasses 包含以下这些类:Entity Data Model (EDM) 中定义的类型的基类、由导航属性返回的类型的基类,以及用于定义将公共语言运行时 (CLR) 对象映射到概念模型中类型的特性的类。 System.Data.Sql 包含支持特定于 SQL Server 的功能的类。此类的 API 扩展已添加到 SQL Server 的 .NET Framework 数据提供程序 ( System.Data.SqlClient) 中。 System.Data.SqlClient 包含封装 SQL Server .NET Framework 数据提供程序的类。SQL Server .NET Framework 数据提供程序描述了用于在托管空间中访问 SQL Server 数据库的类集合。 System.IO 包含允许对数据流和文件进行同步和异步读写的类型。 System.Linq 包含支持使用语言集成查询 (LINQ) 的查询的类和接口。 System.Web 提供启用浏览器/服务器通信的类和接口。 ……
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值