系统相关
首页 > 系统相关> > Linux搭建MQTT Broker并测试本地和远程发布及订阅

Linux搭建MQTT Broker并测试本地和远程发布及订阅

作者:互联网

前  言

1. MQTT介绍  

 1.1 什么是MQTT 

  MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,为此,它需要一个消息中间件 。 MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

 1.2 MQTT特点  

  MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:   1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;   2、对负载内容屏蔽的消息传输;   3、使用 TCP/IP 提供网络连接;   4、有三种消息发布服务质量:   5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;   6、使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制

2. MQTT Broker 搭建 

  为了进一步了解MQTT的通讯形式和常见操作,我们选择了三台局域网内的linux机器进行测试,在机器1上面搭建mqtt broker,在机器2上面publish mqtt 主题信息,在机器3上面

  subscribe该主题信息。

  

  其实我们本次的3台linux机器,就大概如上图所示,机器1作为broker服务器,机器2作为subscibe客户端,机器3作为publish客户端。当然其实任何一个客户端既可以充当

  subscribe也可以充当publish。

 2.1 安装mqtt broker

  sudo apt-get update

  sudo apt-get install mosquitto

  安装后mosquitto服务将直接被启动,可以通过systemctl status mosquitto.service 来查看,如下图

  

   同时我们可以查看一下mosquitto服务的详细信息,通过mosquitto -v指令即可显示如下,可以看到使用的1883端口。

  

  但是看到一个error显示端口地址被占用,其实这并不是真正的被占用,我们可以通过netstat -nlpt|grep 1883指令查看端口使用情况,如下证明此端口只是mosquitto在使用,所以           不用管这个错误。

  

   从mosquitto.service的status中我们还注意到一行字,就是目前这个服务目前只能运行在本地,如下图,后面我们将进一步说明如何配置使其远程能支持mosquitto指令

  

 2.2 本地使用mosquitto指令

  如果我们想使用mosquitto指令,需要安装一下mosquitto-clients

  sudo apt-get install mosquitto-clients

  安装好了之后,我们可以尝试在机器1上面开两个终端,终端1负责发布,终端2负责订阅;

  在终端1上上面运行 mosquitto_pub -t "test" -m "test1"

  在终端2上面运行 mosquitto_sub -t "test" -v

  我们可以在终端2上面收到终端1上面发布的消息。

 2.3 远程使用mosquitto指令

  如果想远程使用mqtt,即我们需要在机器2上面发布消息,在机器3上面订阅消息,那么除了需要在机器2和3上面安装mosquitto-clients外,我们需要对机器1上面的broker做一些

  配置使其能够支持远程通过账户和密码来发布。

  2.3.1修改mosquitto配置文件

  因为我这里是安装的mosquitto 2.0版本的,可以在/etc/mosquitto/目录下直接更改mosquitto.conf的配置文件,并使用指令生成账户和密码放置在同层目录下并命名为pwfile

  1. systemctl stop mosquitto.service   可以通过 status检查一下service是否被成功停掉

  2. sudo mosquitto_passwd -c /etc/mosquitto/pwfile ellison    即在/etc/mosquitto 目录下创建一个名为pwfile的文件且用户名为ellison,回车后,终端会提示你输入密码,输入即可

  3. vim /etc/mosquitto/mosquitto.conf,更改配置文件如下

  

  其中 allow_anonymous false的添加代表关闭了匿名登录的权限;

  password_file 语句指向了mosquitto登录的账户和密码;

  listener 1883 语句代表开通了远程操作,即上面我们说的一开始安装完mosquitto后显示只能本地操作的解决方法。

  4. 重新启动mosquitto服务, systemctl start mosquitto.service

  5. 加载新的配置文件,mosquitto -c /etc/mosquitto/mosquitto.conf -v ,没有报错即加载成功

  2.3.2 远程测试和本地测试

  1. 逆向测试,确认匿名登录操作被禁用

    在机器2和机器3上面分别输入mosquitto_sub -h 10.xxx.xx.xxx -t "test" ; mosquitto_pub -h 10.xxx.xx.xxx -t "test" -m "test1",发现鉴权失败

  

  

   这就是说明我们设置匿名不允许登录成功了,想要能够远程登录操作,需要输入对应的账户和密码

  2. 正向测试,通过账户密码远程操作

  下面我们就携带之前设置的账号和密码登录试试

  即在机器2上面输入mosquitto_sub -h 10.xxx.xx.xxx -t "test" -m "test1 -u ellison -P xxxxx -v

  在机器3上面循环发送 while true;do mosquitto_pub -h 10.xxx.xx.xxx -t 'test' -m 'test1' -u ellison -P xxxxx;sleep 1;done

  一般mosquitto默认端口是1883,所以这里不需要再-h后面配置端口,如果自己再broker更改了端口,远程的时候就需要带上端口参数了

  

   我们可以再subcribe的机器2上每隔1秒收到机器3上发布的信息了。

  3. 本地再次测试

  同理,在修改完不允许匿名操作mosquitto之后,即使在本机操作需要携带账户和密码了,只是不需要配置-h参数的host地址。

 结  语

  至此,我们基于linux的MQTT 的简单实践就结束了,下次再见,我是新能源阿布!

标签:机器,xxx,Broker,MQTT,mosquitto,Linux,远程,上面
来源: https://www.cnblogs.com/nio123/p/16184038.html