C# MQTT 消息订阅

本文介绍了C#中使用M2Mqtt库进行MQTT消息订阅和发布的具体步骤,包括连接服务器、订阅主题、处理接收到的消息。同时,展示了如何在.NET Core 3.1环境下配置和使用MqttClient。此外,还详细说明了docker部署EMQ X MQTT服务的过程,并提供了从App.config读取配置数据的方法。

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


Mqtt :订阅和发布机制

  • 一端发布,多端接收
  • topic值 作为分界标识,互不干扰
  • 支持iot
  • 18083端口 为可视化界面 可以查看并管理每一个连接的客户端
  • 18083端口 提供websocket 测试 但需要打开8083端口
  • 18083端口 提供全中文界面

消息订阅和发布

解析

  • MQTT服务: 负责消息转发
  • 服务端:负责消息发布
  • 客户端: 负责消息订阅
  • 流程:
    1. Connect(clientid)(方法重载) 连接服务器 clientid(随机数,作为客户端唯一标识)
    2. MqttMsgPublishReceived (异步获取订阅信息)
    3. Subscribe(topic,message(byte[])) 消息发布
  • 长连接有时效限制,MQTT会自动断开客户端 ConnectionClosed(属于异步,判断连接断开行为) 进行断开重连操作

实例

  • .net core 3.1
  • M2MqttClientDotnetCore:1.01
/// <summary>
/// mqtt 消息订阅
/// </summary>
/// <param name="tbMonitorMac"></param>
private static void Mqtt(string companyId)
{
	MqttClient mqtt = new MqttClient(host, port, false, null, null, MqttSslProtocols.TLSv1_0);
	mqtt.MqttMsgPublishReceived += client_MqttMsgPublishReceived;
	mqtt.ConnectionClosed += (sender, e) =>
            {
                if (!mqtt.IsConnected)
                {
                    Console.WriteLine(topic+":mqtt连接失败,重新进行连接>>>");
                    Mqtt(companyId, topic);
                }
                
            };
	string clientId = Guid.NewGuid().ToString();
	//无需用户名和密码
	mqtt.Connect(clientId);
	//需要使用用户名和密码进行连接
	// mqtt.Connect(clientId,username,password);
	//消息发布
	mqtt.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
}
/// <summary>
/// mqtt 消息解析
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
static void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
 {
	    try
	    {
	        // 打印订阅的发布端消息
	        Console.WriteLine(string.Format("subscriber,topic:{0},content:{1}", e.Topic, Encoding.UTF8.GetString(e.Message).ToString()));
	    }
	    catch (Exception ex)
	    {
	        WriteMessage(e.Topic + ":" + ex.Message);
	    }
}

docker 部署MQTT

  • docker pull emqx (1.拉取mqtt镜像服务)
  • 启动镜像
  • - -name 自定义容器名称
  • -p 映射服务端口
  • - d emqx/emqx:latest 指定服务镜像并后台运行
  • 可通过docker images 查看所有镜像
docker run -it --name emqx -p 1883:1883 -p 18083:18083 -p 8083:8083 -d emqx/emqx:latest --restart always
  • docker ps -a 可查看容器是否正常运行,Up为正常状态 Edit or Create 为非正常状态
  • 使用 18083 端口可以看到可视化界面说明已经成功部署(初始账号:admin 初始密码:public)
  • 如何将已经启动的容器设置为启动Docker自动启动容器
docker update --restart=always Container_name/Container_id

从App.config 获取数据

  • 引用
    System.Configuration.ConfigurationManager:5.0.0
private static string host = ConfigurationManager.AppSettings.Get("mqttHost");
private static int port = int.Parse(ConfigurationManager.AppSettings.Get("mqttPort"));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值