C# MQTT 消息订阅
Mqtt :订阅和发布机制
- 一端发布,多端接收
- topic值 作为分界标识,互不干扰
- 支持iot
- 18083端口 为可视化界面 可以查看并管理每一个连接的客户端
- 18083端口 提供websocket 测试 但需要打开8083端口
- 18083端口 提供全中文界面
消息订阅和发布
解析
- MQTT服务: 负责消息转发
- 服务端:负责消息发布
- 客户端: 负责消息订阅
- 流程:
- Connect(clientid)(方法重载) 连接服务器 clientid(随机数,作为客户端唯一标识)
- MqttMsgPublishReceived (异步获取订阅信息)
- 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"));