使用mosquitto实现消息的发布与订阅

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:

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();
            }));
        }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值