MQTT再学习 -- 搭建MQTT服务器及测试

转载自:https://blog.csdn.net/qq_29350001/article/details/76680646

最近在搞 PM2.5 采集,需要用到 MQTT 传输协议。协议部分看了几天的,讲的七七八八。本身在 intel 上有 写好的MQTT 的源码,现在的工作其实也就是移植到单片机上或者DM368板卡上。不过,对于之前没有接触过的我来说,还是从头开始,搭建服务器及测试一下为好。

MQTT服务器有好多种,参看:Servers/Brokers 

Apache-Apollo:一个代理服务器,在ActiveMQ基础上发展而来,可以支持STOMP、AMQP、MQTT、Openwire、SSL和WebSockets等多种协议,并且Apollo提供后台管理页面,方便开发者管理和调试。
EMQ:EMQ 2.0,号称百万级开源MQTT消息服务器,基于Erlang/OTP语言平台开发,支持大规模连接和分布式集群,发布订阅模式的开源MQTT消息服务器。
HiveMQ:一个企业级的MQTT代理,主要用于企业和新兴的机器到机器M2M通讯和内部传输,最大程度的满足可伸缩性、易管理和安全特性,提供免费的个人版。HiveMQ提供了开源的插件开发包。
Mosquitto:一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。


这篇文章我们只讲两种,一种是 Mosquitto、另一种是 Apollo,以及它们在 linux 下和 Windows 下的安装。

我们本篇都会来一一做讲解。

参看:【MQTT】在Ubuntu下搭建MQTT服务器

一、Ubuntu 下 MQTT 服务器搭建之Apollo

(1) 首先要搞清楚什么是 Apollo 

参看:ActiveMQ's next generation of messaging

ActiveMQ Apollo is a faster, more reliable, easier to maintain messaging broker built from the foundations of the original ActiveMQ. It accomplishes this using a radically different threading and message dispatching architecture. Like ActiveMQ, Apollo is a multi-protocol broker and supports STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets.

翻译一下:

ActiveMQ Apollo是从原始ActiveMQ的基础构建的更快,更可靠,更易于维护的消息代理。 它使用完全不同的线程和消息调度架构来实现。 像ActiveMQ一样,Apollo是一个多协议代理,支持STOMP,AMQP,MQTT,Openwire,SSL和WebSockets。


看到没,有支持 MQTT  

下载:Download it today!

MQTT再学习 -- 搭建MQTT服务器及测试

MQTT再学习 -- 搭建MQTT服务器及测试

(2)安装

先解压

  1. # sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz   

查看 bin/apollp.cmd

[html] view plain copy
  1. # cat apollo.cmd   
  2. @REM  
  3. @REM Licensed to the Apache Software Foundation (ASF) under one or more  
  4. @REM contributor license agreements.  See the NOTICE file distributed with  
  5. @REM this work for additional information regarding copyright ownership.  
  6. @REM The ASF licenses this file to You under the Apache License, Version 2.0  
  7. @REM (the "License"); you may not use this file except in compliance with  
  8. @REM the License.  You may obtain a copy of the License at  
  9. @REM  
  10. @REM      http://www.apache.org/licenses/LICENSE-2.0  
  11. @REM  
  12. @REM Unless required by applicable law or agreed to in writing, software  
  13. @REM distributed under the License is distributed on an "AS IS" BASIS,  
  14. @REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
  15. @REM See the License for the specific language governing permissions and  
  16. @REM limitations under the License.  
  17. @REM  
  18. @echo off  
  19.   
  20. setlocal  
  21.   
  22. if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME  
  23. PUSHD .  
  24. CD %~dp0..  
  25. set APOLLO_HOME=%CD%  
  26. POPD  
  27.   
  28. :CHECK_APOLLO_HOME  
  29. if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA  
  30.   
  31. :NO_HOME  
  32. echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME.  
  33. goto END  
  34.   
  35. :CHECK_JAVA  
  36. set _JAVACMD=%JAVACMD%  
  37.   
  38. if "%JAVA_HOME%" == "" goto NO_JAVA_HOME  
  39. if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME  
  40. if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe  
  41. goto RUN_JAVA  
  42.   
  43. :NO_JAVA_HOME  
  44. if "%_JAVACMD%" == "" set _JAVACMD=java.exe  
  45. echo.  
  46. echo Warning: JAVA_HOME environment variable is not set.  
  47. echo.  
  48.   
  49. :RUN_JAVA  
  50.   
  51. set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar  
  52.   
  53. set BOOTDIRS=%APOLLO_HOME%\lib  
  54. if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS%  
  55.   
  56. if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking  
  57.   
  58. if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS  
  59.   set JVM_FLAGS=-ea %JVM_FLAGS%  
  60. :noAPOLLO_ASSERTIONS  
  61.   
  62. if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS  
  63.   set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS%  
  64. :noAPOLLO_OPTS  
  65.   
  66. if "x%APOLLO_DEBUG%" == "x" goto noDEBUG  
  67.   set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005  
  68. :noDEBUG  
  69.   
  70. if "x%APOLLO_PROFILE%" == "x" goto noPROFILE  
  71.   set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS%  
  72. :noPROFILE  
  73.   
  74. if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote  
  75. rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false  
  76. set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS%  
  77.   
  78. set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%"  
  79. if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%"  
  80. set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%"  
  81.   
  82. "%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %*  
  83.   
  84. :END  
  85. endlocal  
  86. GOTO :EOF  
  87.   
  88. :EOF  
由于搭建 Apollo 环境变量需要有 JAVA_HOME,这个时候需要安装 JDK

安装 JDK

MQTT再学习 -- 搭建MQTT服务器及测试
MQTT再学习 -- 搭建MQTT服务器及测试
从上图可以看到,这个Linux版本有 x86 和 x64 等版本。如果查看你的 Ubuntu 是什么版本呢?
方法一:getconf LONG_BIT
在linux终端输入 getconf LONG_BIT 命令
如果是32位机器,则结果为32
  1. [[email protected] ~]# getconf LONG_BIT    
  2. 32    
如果是64位机器,则结果为64
  1. [[email protected] ~]# getconf LONG_BIT    
  2. 64    
方法二:uname -a
如果是64位机器,会输出x86_64

  1. [[email protected] ~]$ uname -a    
  2. Linux testweb01 2.6.18-308.4.1.el5 #1 SMP Tue Apr 17 17:08:00 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux    
可以看到,uname-a执行后的结果中输出了x86_64,说明该机器是64位的,否则代表该机器是32位的
  1. [[email protected] ~]# uname -a    
  2. Linux localhost.localdomain 2.6.18-164.el5 #1 SMP Tue Aug 18 15:51:54 EDT 2009 i686 i686 i386 GNU/Linux    
方法三:file /sbin/init 或者 file /bin/ls
示例:32位机器
file /sbin/init

  1. [[email protected] ~]# file /sbin/init    
  2. /sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped    
file /bin/ls
  1. [[email protected] ~]# file /bin/ls    
  2. /bin/ls: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped    
示例:64位机器
file /sbin/init

  1. [[email protected] ~]$ file /sbin/init    
  2. /sbin/init: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped    
file /bin/ls
  1. [[email protected] ~]$ file /bin/ls    
  2. /bin/ls: ELF 64-bit LSB executable, AMD x86-64, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped    
可以通过命令结果中的64-bit或者32-bit来判断该机器是64位还是32位

最后如下经过测试,我的Ubuntu是32位的,下载  jdk-8u144-linux-i586.tar.gz
  1. # uname -a  
  2. Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux  
  3.   
  4. #getconf LONG_BIT    
  5. 32  

通过终端在/usr/local目录下新建java文件夹,命令行:
  1. sudo mkdir /usr/local/java  
然后进入java目录,命令行:
  1. cd /usr/local/java  
解压压缩包:
  1. sudo tar xvf jdk-8u25-linux-x64.tar.gz  
设置jdk环境变量:
  1. # gedit /etc/profile  
  2. 在最后添加下面代码:  
  3.   
  4. export JAVA_HOME=/usr/local/java/jdk1.8.0_144  
  5. export JRE_HOME=${JAVA_HOME}/jre    
  6. export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib    
  7. export PATH=${JAVA_HOME}/bin:$PATH  
  8.   
  9. 使用 source /etc/profile 使它立即生效  
检验是否安装成功:
  1. # java -version  
  2. java version "1.8.0_144"  
  3. Java(TM) SE Runtime Environment (build 1.8.0_144-b01)  
  4. Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)  

配置 Apollo

进入apache-apollo-1.7.1/bin目录
cd apache-apollo-1.7.1/bin/
输入 ./apollo 可以查看帮助
  1. # ./apollo   
  2. usage: apollo [--log <log_level>] <command> [<args>]  
  3.   
  4. The most commonly used apollo commands are:  
  5.     create           creates a new broker instance  
  6.     disk-benchmark   Benchmarks your disk's speed  
  7.     help             Display help information  
  8.     version          Displays the broker version  
  9.   
  10. See 'apollo help <command>' for more information on a specific command.  
创建一个Broker示例:/apollo create mybroker,MQTT服务器都是叫Broker。
  1. # ./apollo create mybroker  
  2. Creating apollo instance at: mybroker  
  3. Generating ssl keystore...  
  4.   
  5. You can now start the broker by executing:    
  6.   
  7.    "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker" run  
  8.   
  9. Or you can setup the broker as system service and run it in the background:  
  10.   
  11.    sudo ln -s "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service" /etc/init.d/  
  12.    /etc/init.d/apollo-broker-service start  
后面会有提示怎么启动服务器,以及创建一个service。
启动Apollo :
  1. # ./mybroker/bin/apollo-broker run  
  2.   
  3.     _____                .__  .__  
  4.    /  _  \ ______   ____ |  | |  |   ____  
  5.   /  /_\  \\____ \ /  _ \|  | |  |  /  _ \  
  6.  /    |    \  |_> >  <_> )  |_|  |_(  <_> )  
  7.  \____|__  /   __/ \____/|____/____/\____/  
  8.          \/|__|  Apache Apollo (1.7.1)  
  9.   
  10.   
  11. Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'.  
  12. INFO  | OS     : Linux 3.2.0-23-generic-pae (Ubuntu 12.04 LTS)  
  13. INFO  | JVM    : Java HotSpot(TM) Server VM 1.8.0_144 (Oracle Corporation)  
  14. INFO  | Apollo : 1.7.1 (at: /home/tarena/project/MQTT/apache-apollo-1.7.1)  
  15. INFO  | OS is restricting the open file limit to: 100000  
  16. INFO  | Accepting connections at: tcp://0.0.0.0:61613  
  17. INFO  | Accepting connections at: tls://0.0.0.0:61614  
  18. INFO  | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data  
  19. INFO  | Accepting connections at: ws://0.0.0.0:61623/  
  20. INFO  | Accepting connections at: wss://0.0.0.0:61624/  
  21. INFO  | Administration interface available at: https://127.0.0.1:61681/  
  22. INFO  | Administration interface available at: http://127.0.0.1:61680/  
之后查看打印信息即可知道MQTT要连接的端口和管理页面端口。

然后打开Ubuntu浏览器,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可进入 Apollo Console 窗口。
MQTT再学习 -- 搭建MQTT服务器及测试

默认的登录id和密码是 admin password
MQTT再学习 -- 搭建MQTT服务器及测试

二、Windows 下 MQTT 服务器搭建之Apollo

(1)下载 Apollo

MQTT再学习 -- 搭建MQTT服务器及测试MQTT再学习 -- 搭建MQTT服务器及测试

(2)安装

解压得到如下文件。
这里需要注意了,解压 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格,后面会提到出现什么错误。
MQTT再学习 -- 搭建MQTT服务器及测试
进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹
按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。

MQTT再学习 -- 搭建MQTT服务器及测试
然后在 cmd 窗口执行 apollo.cmd。然后就可以看到发生错误。上面Ubuntu下安装时已经提到,还需要安装 JDK。
MQTT再学习 -- 搭建MQTT服务器及测试

(3)安装 JDK

MQTT再学习 -- 搭建MQTT服务器及测试
Windows 系统是多少位的,这个应该很清楚吧。查看 我的电脑->属性,查看有关计算机的基本信息。
MQTT再学习 -- 搭建MQTT服务器及测试
我的电脑为 win 10 64位,下载并安装 jdk-8u144-windows-x64.exe
然后配置 JDK 环境变量
我的电脑->属性->高级系统设置->高级->环境变量
MQTT再学习 -- 搭建MQTT服务器及测试

这部分我们之前将 FFmpeg 的Windows安装说明时有提到过的。可看到有用户变量和系统变量。
修改“用户变量”为当前用户使用,其他 Windows 用户不能够使用。如果要使每个用户都能够使用,你需要修改 "系统变量" 。
MQTT再学习 -- 搭建MQTT服务器及测试
注意,不要够删除在变量中原来已有的内容。如果之前已存在变量,则在其之后用分号“;”分隔,然后添加。
MQTT再学习 -- 搭建MQTT服务器及测试

我们只让当前用户可用,修改用户变量即可。
在用户环境变量中新建变量 JAVA_HOME,设置变量值 F:\Program Files\Java\jdk1.8.0_144
MQTT再学习 -- 搭建MQTT服务器及测试
新建PATH,设置变量值%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
MQTT再学习 -- 搭建MQTT服务器及测试
新建CLASSPATH,设置变量值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar注意前面的.表示当前目录。然后点击“确定”按钮。
MQTT再学习 -- 搭建MQTT服务器及测试
到此,配置完成。打开 cmd 测试一下配置是否成功。
输入java -version,显示版本java version "1.8.0_144",输入javac -version,也显示javac 1.8.0_144,说明JDK安装及环境变量配置成功。
MQTT再学习 -- 搭建MQTT服务器及测试

然后接着上面来讲。进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹
按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。
再次在 cmd 窗口执行 apollo.cmd,可以看到如下的信息,这就和 Ubuntu 下安装对上了。
MQTT再学习 -- 搭建MQTT服务器及测试

(4)创建服务器实例

在 CMD 命令窗口输入 apollo create mybroker ,当然 mybroker 这个名字可以随便起。
MQTT再学习 -- 搭建MQTT服务器及测试

然后查看 mybroker 可以发现里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,可以修改原始的admin=password,可以接着换行添加新的用户名密码。
MQTT再学习 -- 搭建MQTT服务器及测试
bin:保存与该实例关联的执行脚本。
etc:保存实例配置文件
data:保存用于存储持久消息的数据文件
日志:保存旋转日志文件
tmp:保存在代理运行之间安全删除的临时文件

打开cmd,运行 apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 开启服务器,如下图所示:
MQTT再学习 -- 搭建MQTT服务器及测试

这里需要注意了,所在 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格。因为我上面的是存放在 360安全浏览下载 这个目录下了。导致出现系统找不到指定的路径。
MQTT再学习 -- 搭建MQTT服务器及测试

然后打开浏览器上,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可进入 Apollo Console 窗口。
MQTT再学习 -- 搭建MQTT服务器及测试
默认的登录id和密码是 admin 和 password 
MQTT再学习 -- 搭建MQTT服务器及测试

三、MQTT 客户端测试

Apollo 服务器安装已经讲完,接下来简单测试一下发布订阅。
这里面网上有 MQTT协议之Apache Apollo 安装使用 这种文章用的是 java,在Android上测试的。
这就不太适合我了,不懂 Android 蓝瘦香菇啊

再有一种是用 谷歌浏览器上的 扩展程序 mqttlens
首先添加该插件
MQTT再学习 -- 搭建MQTT服务器及测试

点击 获取更多扩展程序
MQTT再学习 -- 搭建MQTT服务器及测试

搜索 mqttlens ,最后添加至 CHROME
MQTT再学习 -- 搭建MQTT服务器及测试

安装完成!!
下面进行测试
先运行 Apollo 服务器
MQTT再学习 -- 搭建MQTT服务器及测试
MQTT再学习 -- 搭建MQTT服务器及测试

然后启动 mqttlens 
MQTT再学习 -- 搭建MQTT服务器及测试

然后点击 Connections+
MQTT再学习 -- 搭建MQTT服务器及测试

出现下图,并填写好相关的信息
MQTT再学习 -- 搭建MQTT服务器及测试
然后就进入了,订阅发布界面
MQTT再学习 -- 搭建MQTT服务器及测试
OK,到此结束

四、Ubuntu 下 MQTT 服务器搭建之Mosquitto

Mosquitto 是一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。现在我们开始搭建服务器。