提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:这里可以添加本文要记录的大概内容:
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通信协议,构建于TCP/IP协议上。
MQTT消息的发布和订阅不是点到点的,而是由一个MQTT Broker实现交互,机器将消息发布至MQTT Broker,这台机器称为发布者(Publisher),另一台机器从MQTT Broker订阅该消息,这台机器称为订阅者(Subscriber),每台机器既可作为发布者也可作为订阅者。
本文介绍的mosquitto就是一种MQTT Broker,内容主要包括mosquitto的安装和配置,client端代码的实现,使用的是C#语言。
提示:以下是本篇文章正文内容,下面案例可供参考
一、原理
这是MQTT协议的官网上的图,设备都作为MQTT Client,设备之间的数据传输通过订阅(Subscribe)/发布(Publish)topic来实现,每台设备即可作为订阅者也可作为发布者。如下图,Temperaturte Sensor设备通过topic:temperaturte来发布温度数据至MQTT Broker,Mobile device和Backend system通过订阅topic:temperaturte来获取Temperaturte Sensor的温度数据。
二、mosquitto的安装和配置
下载并安装Download | Eclipse Mosquitto。
默认的配置只有本设备可以访问,因此我们需要将配置修改至局域网内设备可访问。
如上图所示,我的mosquitto需要局域网内其他设备访问,所以需要修改配置,否则只有本机可以访问。
修改mosquitto.conf(参考mosquitto.conf man page | Eclipse Mosquitto,需要什么配置添加什么配置,以下是我的配置),添加内容:
allow_anonymous false 设置特定的用户名和密码才可以访问
listener 1883 192.168.4.51 设置地址为mosquitto所在的设备的IP
password_file pwfile 指定用户名和密码的文件
log_dest file mosquitto.log 指定log文件
connection_messages true 设置连接消息写入log
log_timestamp true 设置log是否有时间戳
log_timestamp_format %Y-%m-%dT%H:%M:%S 指定时间戳格式
log_type all 设置log类型
配置完成后,通过Windows Command应用配置,并设置访问用户和密码:
比如我这里设置的用户名是test-username-aaa,输入完成按Enter,然后输入2次密码,就完成了,完成后可以在pwfile文件中看到:
此时说明用户名密码设置成功。
再将配置文件应用到当前mosquitto中并启动,此时mosquitto就已经启动成功。
三、C#开发MQTT Client
新建项目并安装M2Mqtt的nuget包:
MqttClient client { get; set; }
client = new MqttClient("192.168.4.51");
client.Connect("3E903C35-BD86-4217-9DD5-DFB6BB83CDE9", "test-username-aaa", "123");
消息发布:
client.Publish(topic, Encoding.Default.GetBytes(msg), MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE, false);
消息订阅:
client.Subscribe(new string[] { intopic }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });
client.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
private void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
{
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
InTopicTextBlock.AppendText(Encoding.UTF8.GetString(e.Message) + Environment.NewLine);
MyScrollViewer.ScrollToEnd();
}));
}