.NET MQTT客戶端SimpleMQTT的使用

一、說明

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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章