一、說明
MQTT客戶端組件.NET Core版本,基於新生命團隊NewLife.MQTT的單例模式封裝,支持.net core3,.net6/7
Github地址:https://github.com/zxzyjs/SimpleMQTT.git
Gitee地址:https://gitee.com/zxzyjs/SimpleMQTT.git
二、安裝
1.直接下載源碼添加到現有項目,添加項目引用
2.nuget直接搜索SimpleMQTT安裝
三、注入
默認讀取配置文件下的MqttSetting節點,當然也可以自定義節點名
{
"MqttSetting": {
"Host": "192.168.1.1",
"Port": 1883,
"UserName": "xxx",
"SecretKey": "xxx",
"ClientId": "xxx",
}
}
支持多客戶端配置,只需在每個客戶端配置上加上Name屬性即可
"MqttSetting": [
{
"Name": "mqtt1",
"Host": "127.0.0.1",
"Port": 1883,
"UserName": "admin",
"SecretKey": "admin",
"ClientId": "admin"
},
{
"Name": "mqtt2",
"Host": "127.0.0.2",
"Port": 1883,
"UserName": "admin",
"SecretKey": "admin",
"ClientId": "admin"
}
]
除了上述配置外,還支持其他屬性配置
/// <summary>
/// mqtt客戶端配置
/// </summary>
public class MqttClientConfig
{
/// <summary>
/// 客戶端名稱
/// </summary>
public string Name { get; set; } = "Mqtt";
/// <summary>
/// 主機地址
/// </summary>
public string Host { get; set; }
/// <summary>
/// 端口
/// </summary>
public int Port { get; set; }
/// <summary>
/// 用戶名
/// </summary>
public string UserName { get; set; }
/// <summary>
/// 祕鑰
/// </summary>
public string SecretKey { get; set; }
/// <summary>
/// 客戶端ID
/// </summary>
public string ClientId { get; set; }
/// <summary>
/// 心跳
/// </summary>
public int KeepAlive { get; set; } = 60;
/// <summary>
/// 是否自動重連,默認True
/// </summary>
public bool Reconnect { get; set; } = true;
/// <summary>
/// 是否清除會話,默認True
/// </summary>
public bool CleanSession { get; set; } = true;
/// <summary>
/// 超時。默認15000ms
/// </summary>
public int Timeout { get; set; } = 15000;
/// <summary>
/// 是否進行SSL連接
/// </summary>
public bool UseSSL { get; set; } = false;
}
以下是注入代碼,請自行選擇注入方式
查看代碼
/// <summary>
/// 添加Mqtt客戶端服務
/// </summary>
/// <param name="services"></param>
/// <exception cref="ArgumentNullException"></exception>
public static void AddMqttClientManager(this IServiceCollection services)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSingleton<IMqttClientManager, MqttClientManager>();
}
/// <summary>
/// 添加Mqtt客戶端服務
/// </summary>
/// <param name="services"></param>
/// <param name="configuration">IConfiguration</param>
/// <param name="section">配置文件節點</param>
/// <param name="start">立即啓動</param>
/// <exception cref="ArgumentNullException"></exception>
public static void AddMqttClientManager(this IServiceCollection services, IConfiguration configuration, string section = "MqttSetting", bool start = true)
{
if (services == null) throw new ArgumentNullException(nameof(services));
MqttClientConfig config = new MqttClientConfig();
configuration.GetSection(section).Bind(config);//獲取配置
services.AddSingleton<IMqttClientManager, MqttClientManager>(x => new MqttClientManager(config, start));
}
/// <summary>
/// 添加Mqtt客戶端服務
/// </summary>
/// <param name="services"></param>
/// <param name="config">mqtt配置</param>
/// <param name="start">立即啓動</param>
/// <exception cref="ArgumentNullException"></exception>
public static void AddMqttClientManager(this IServiceCollection services, MqttClientConfig config, bool start = true)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSingleton<IMqttClientManager, MqttClientManager>(x => new MqttClientManager(config, start));
}
/// <summary>
/// 添加Mqtt客戶端服務
/// </summary>
/// <param name="services"></param>
/// <param name="configs">mqtt配置</param>
/// <param name="start">立即啓動</param>
/// <exception cref="ArgumentNullException"></exception>
public static void AddMqttClientManager(this IServiceCollection services, List<MqttClientConfig> configs, bool start = true)
{
if (services == null) throw new ArgumentNullException(nameof(services));
services.AddSingleton<IMqttClientManager, MqttClientManager>(x => new MqttClientManager(configs, start));
}
}
我一般在workerservice項目中使用,所以這麼註冊就行了
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddMqttClientManager();//第一種
//services.AddMqttClientManager(hostContext.Configuration, "xxx");//第二種
})
四、使用
4.1採用注入的方式(推薦)
直接構造函數注入即可
private readonly MqttClient mqttClient;
public Worker(ILogger<Worker> logger, IMqttClientManager mqttClientManager)
{
_logger = logger;
mqttClient = mqttClientManager.GetClient();
}
如果是多個客戶端
private readonly List<MqttClient> mqttClients;
public Worker(ILogger<Worker> logger, IMqttClientManager mqttClientManager)
{
_logger = logger;
mqttClients = mqttClientManager.GetClients();
}
4.2採用New的方式
MqttClientConfig config = new MqttClientConfig() { Host = "xx", Port = 1883 };
var mqttManager = new MqttClientManager(config);
mqttManager.GetClient().Disconnected += (object? sender, EventArgs e) =>
{
Console.WriteLine("斷開");
};
mqttManager.GetClient().Connected += (object? sender, EventArgs e) =>
{
Console.WriteLine("連接");
};
mqttManager.StartClient();