概述
MQTT是机器对机器(M2M)/物联网(IoT)连接协议。它被设计为一个极其轻量级的发布/订阅消息传输协议。对于需要较小代码占用空间和/或网络带宽非常宝贵的远程连接非常有用,是专为受限设备和低带宽、高延迟或不可靠的网络而设计。这些原则也使该协议成为新兴的“机器到机器”(M2M)或物联网(IoT)世界的连接设备,以及带宽和电池功率非常高的移动应用的理想选择。例如,它已被用于通过卫星链路与代理通信的传感器、与医疗服务提供者的拨号连接,以及一系列家庭自动化和小型设备场景。它也是移动应用的理想选择,因为它体积小,功耗低,数据包最小,并且可以有效地将信息分配给一个或多个接收器
特点
- 开放消息协议,简单易实现
- 发布订阅模式,一对多消息发布
- 基于TCP/IP网络连接,提供有序,无损,双向连接。
- 1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量。
- 消息QoS支持,可靠传输保证
应用
MQTT协议广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等领域。
- 物联网M2M通信,物联网大数据采集
- Android消息推送,WEB消息推送
- 移动即时消息,例如Facebook Messenger
- 智能硬件、智能家具、智能电器
- 车联网通信,电动车站桩采集
- 智慧城市、远程医疗、远程教育
- 电力、石油与能源等行业市场
C#程序实现
MQTnet库
MQTTnet 是一个用于基于 MQTT 的通信的高性能 .NET 库。它提供 MQTT 客户机和 MQTT 服务器(代理),并支持版本 5 之前的 MQTT 协议。
常规
- 异步支持
- 客户端和服务器(但不是 UWP 服务器)的 TLS 支持
- 可扩展的通信通道(例如内存中、TCP、TCP+TLS、WS)
- 轻量级(只有MQTT的低级实现,没有开销)
- 性能优化(每秒处理约 150,000 条消息)*
- 跨所有受支持的 MQTT 协议版本的统一 API
- 访问内部跟踪消息
- 单元测试(约 636 次测试)
- 无外部依赖关系
在本地机器(英特尔 i7 8700K)上测试,MQTTnet 客户端和服务器使用 TCP 通道在同一进程中运行。用于验证的应用程序是此存储库的一部分,并存储在/Tests/MQTTnet.TestApp.NetCore中。
客户
- 支持通过 TCP (+TLS) 或 WS (WebSocket) 进行通信
- 包含内核低级别MqttClient,具有低级别功能
- 还包括 ManagedMqttClient,它会自动维护连接和订阅。此外,应用程序消息会自动排队并重新安排为更高的 QoS 级别。
- Rx 支持(通过另一个项目)
- 与 Microsoft Azure IoT Hub 兼容
服务器(代理)
- 可用连接的客户端列表
- 支持同时使用不同协议版本的连接客户端
- 能够发布自己的消息(无需环回客户端)
- 能够接收每条消息(无需环回客户端)
- 可扩展的客户端凭据验证
- 支持保留的消息,包括通过接口方法持久保存(需要自己的实现)
- 支持 WebSockets(通过 ASP.NET Core 2.0,单独的 nuget)
- 可以添加自定义消息拦截器,允许转换或扩展每个收到的应用程序消息
- 验证订阅并拒绝订阅某些主题,具体取决于请求客户端
- 同时连接具有不同协议版本的客户端。
支持的框架
框架 | 版本 |
---|---|
.NET | 5.0+ |
.NET Framework | 4.5.2+ |
.NET 标准 | 1.3+ |
.NET Core | 1.1+ |
.NET Core App | 1.1+ |
单 | 5.2+ |
断续器 | 10.0.10240+ |
Xamarin.Android | 7.5+ |
Xamarin.iOS | 10.14+ |
Blazor WebAssembly | 3.2.0+ |
服务端代码实现
public static async void MqttServer()
{
var optionBuilder = new MqttServerOptionsBuilder()
.WithDefaultEndpointBoundIPAddress(IPAddress.Parse("192.168.0.2"))
.WithDefaultEndpointPort(1883)
.WithConnectionBacklog(1000)
.WithConnectionValidator(c =>
{
if (c.ClientId.Length < 10)
{
c.ReasonCode = MqttConnectReasonCode.ClientIdentifierNotValid;
return;
}
if (c.Username != "admin") //用户名
{
c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
return;
}
if (c.Password != "public") //密码
{
c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
return;
}
Console.WriteLine($"{c.ClientId}连接成功!");
c.ReasonCode = MqttConnectReasonCode.Success;
}).Build();
_mqttServer = new MqttFactory().CreateMqttServer();
//客户端接入
_mqttServer.UseClientConnectedHandler(ClientConnected);
//客户端断开
_mqttServer.UseClientDisconnectedHandler(ClientDisconnected);
//主题消息
_mqttServer.UseApplicationMessageReceivedHandler(ApplicationMessageReceived);
//主题订阅需要实现IMqttServerClientSubscribedTopicHandler
_mqttServer.ClientSubscribedTopicHandler =new ClientSubscribedTopic();
//启动监听需要实现IMqttServerStartedHandler
_mqttServer.StartedHandler = new ServerStarteOrStopped();
//停止监听 IMqttServerStoppedHandler
_mqttServer.StoppedHandler = new ServerStarteOrStopped();
//服务启动
await _mqttServer.StartAsync(optionBuilder);
}
客户端代码实现
public static async void Client()
{
var options = new MqttClientOptions();
options.ClientId = Guid.NewGuid().ToString().Replace("-", "").ToUpper();
//设置服务器地址与端口
options.ChannelOptions = new MqttClientTcpOptions()
{
Server = "192.168.0.2",
Port = 1883
};
//设置账号与密码
options.Credentials = new MqttClientCredentials()
{
Username = "admin",
Password = Encoding.Default.GetBytes("public")
};
options.CleanSession = true;
//保持期
options.KeepAlivePeriod = TimeSpan.FromSeconds(100.5);
//构建客户端对象
_mqttClient = new MqttFactory().CreateMqttClient() as MqttClient;
try
{
//绑定消息接收方法
_mqttClient.UseApplicationMessageReceivedHandler(ApplicationMessageReceivedHandler);
//绑定连接成功状态接收方法
_mqttClient.UseConnectedHandler(ConnectedHandler);
//绑定连接断开状态接收方法
_mqttClient.UseDisconnectedHandler(DisconnectedHandler);
//启动连接
await _mqttClient.ConnectAsync(options);
//订阅消息
await _mqttClient.SubscribeAsync(
new MqttTopicFilter[] { //订阅消息集合
new MqttTopicFilter() //订阅消息对象
{
Topic = "123", //订阅消息主题
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce //消息类型
}
});
}
catch
{
Console.WriteLine($"连接失败");
}
}
Demo下载地址:https://download.csdn.net/download/herees/85160530
最后
以上就是无聊大地为你收集整理的C# 使用MQTTnet实现MQTT通信的全部内容,希望文章能够帮你解决C# 使用MQTTnet实现MQTT通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复