一 前言
MQTT的相关理论内容这里不做过多介绍,请看下面两篇文章:
这篇文章只做代码实现,文章中使用MQTTnet作为MQTT开发的组件。
MQTT分为服务端和客户端,一个服务端对应多个客户端。其中服务端相当于是一台服务器,它是MQTT消息传输的枢纽,负责将MQTT客户端发送来的消息传递给另一个客户端;MQTT服务端还负责管理客户端,确保客户端之间的通讯顺畅,保证MQTT消息得以正确接收和准确投递。
MQTT客户端可以向服务端发布信息,也可以从服务端接受信息,我们把客户端向服务端发送消息的行为称为“发布”消息,客户端也可以“订阅”消息。
二 服务端
服务端可以不用自己开发,有几个常用的第三方服务端,比如EMQ,EMQ怎么使用的,可以查看官网:物联网实时消息引擎 | EMQ
这里不介绍第三方服务,这里具体介绍如何自己动手开发服务端。
1、添加MQTTnet引用
新建一个控制台应用程序,打开NuGet程序包,添加MQTTnet,版本选择3.0.13,选择版本这里要注意一下,不同的版本实现方式不同,下面的实现代码中,如果选择高版本,可能会有异常。
2、代码实现
不啰嗦,直接上代码
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Receiving;
using MQTTnet.Protocol;
using MQTTnet.Server;
using System.Text;
namespace ConsoleApp2
{
internal class Program
{
static void Main(string[] args)
{
MqttServerClass serverClass = new MqttServerClass();
serverClass.StartMqttServer().Wait();
Console.ReadLine();
}
}
public static class Config
{
public static int Port { get; set; } = 1883;
public static string UserName { get; set; } = "Username";
public static string Password { get; set; } = "Password";
}
public class UserInstance
{
public string ClientId { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
public class MqttServerClass
{
private IMqttServer mqttServer;
private List<MqttApplicationMessage> messages = new List<MqttApplicationMessage>();
public async Task StartMqttServer()
{
try
{
if (mqttServer == null)
{
var optionsBuilder = new MqttServerOptionsBuilder()
.WithDefaultEndpoint()
.WithDefaultEndpointPort(Config.Port)
//连接拦截器
.WithConnectionValidator(
c =>
{
//var flag = c.Username == Config.UserName && c.Password == Config.Password;
//if (!flag)
//{
// c.ReasonCode = MqttConnectReasonCode.BadUserNameOrPassword;
// return;
//}
//设置代码为 Success
c.ReasonCode = MqttConnectReasonCode.Success;
//instances.Add(new UserInstance() //缓存到内存的List集合当中
//{
// ClientId = c.ClientId,
// UserName = c.Username,
// Password = c.Password
//});
})
//订阅拦截器
.WithSubscriptionInterceptor(
c =>
{
if (c == null) return;
c.AcceptSubscription = true;
})
//应用程序消息拦截器
.WithApplicationMessageInterceptor(
c =>
{
if (c == null) return;
c.AcceptPublish = true;
})
//clean session是否生效
.WithPersistentSessions();
mqttServer = new MqttFactory().CreateMqttServer();
//客户端断开连接拦截器
//mqttServer.UseClientDisconnectedHandler(c =>
//{
// //var user = instances.FirstOrDefault(t => t.ClientId == c.ClientId);
// //if (user != null)
// //{
// // instances.Remove(user);
// //}
//});
//服务开始
mqttServer.StartedHandler = new MqttServerStartedHandlerDelegate(OnMqttServerStarted);
//服务停止
mqttServer.StoppedHandler = new MqttServerStoppedHandlerDelegate(OnMqttServerStopped);
//客户端连接
mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(OnMqttServerClientConnected);
//客户端断开连接(此事件会覆盖拦截器)
mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(OnMqttServe