转载自: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!
(2)安装
先解压
- # sudo tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz
查看 bin/apollp.cmd
- # cat apollo.cmd
- @REM
- @REM Licensed to the Apache Software Foundation (ASF) under one or more
- @REM contributor license agreements. See the NOTICE file distributed with
- @REM this work for additional information regarding copyright ownership.
- @REM The ASF licenses this file to You under the Apache License, Version 2.0
- @REM (the "License"); you may not use this file except in compliance with
- @REM the License. You may obtain a copy of the License at
- @REM
- @REM http://www.apache.org/licenses/LICENSE-2.0
- @REM
- @REM Unless required by applicable law or agreed to in writing, software
- @REM distributed under the License is distributed on an "AS IS" BASIS,
- @REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- @REM See the License for the specific language governing permissions and
- @REM limitations under the License.
- @REM
- @echo off
-
- setlocal
-
- if NOT "%APOLLO_HOME%"=="" goto CHECK_APOLLO_HOME
- PUSHD .
- CD %~dp0..
- set APOLLO_HOME=%CD%
- POPD
-
- :CHECK_APOLLO_HOME
- if exist "%APOLLO_HOME%\bin\apollo.cmd" goto CHECK_JAVA
-
- :NO_HOME
- echo APOLLO_HOME environment variable is set incorrectly. Please set APOLLO_HOME.
- goto END
-
- :CHECK_JAVA
- set _JAVACMD=%JAVACMD%
-
- if "%JAVA_HOME%" == "" goto NO_JAVA_HOME
- if not exist "%JAVA_HOME%\bin\java.exe" goto NO_JAVA_HOME
- if "%_JAVACMD%" == "" set _JAVACMD=%JAVA_HOME%\bin\java.exe
- goto RUN_JAVA
-
- :NO_JAVA_HOME
- if "%_JAVACMD%" == "" set _JAVACMD=java.exe
- echo.
- echo Warning: JAVA_HOME environment variable is not set.
- echo.
-
- :RUN_JAVA
-
- set CLASSPATH=%APOLLO_HOME%\lib\apollo-boot.jar
-
- set BOOTDIRS=%APOLLO_HOME%\lib
- if NOT "x%APOLLO_BASE%" == "x" set BOOTDIRS=%APOLLO_BASE%\lib;%BOOTDIRS%
-
- if "%JVM_FLAGS%" == "" set JVM_FLAGS=-server -Xmx1G -XX:-UseBiasedLocking
-
- if "%APOLLO_ASSERTIONS%"=="false" goto noAPOLLO_ASSERTIONS
- set JVM_FLAGS=-ea %JVM_FLAGS%
- :noAPOLLO_ASSERTIONS
-
- if "x%APOLLO_OPTS%" == "x" goto noAPOLLO_OPTS
- set JVM_FLAGS=%JVM_FLAGS% %APOLLO_OPTS%
- :noAPOLLO_OPTS
-
- if "x%APOLLO_DEBUG%" == "x" goto noDEBUG
- set JVM_FLAGS=%JVM_FLAGS% -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005
- :noDEBUG
-
- if "x%APOLLO_PROFILE%" == "x" goto noPROFILE
- set JVM_FLAGS=-agentlib:yjpagent %JVM_FLAGS%
- :noPROFILE
-
- if "%JMX_OPTS%" == "" set JMX_OPTS=-Dcom.sun.management.jmxremote
- rem set JMX_OPTS=-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false
- set JVM_FLAGS=%JVM_FLAGS% %JMX_OPTS%
-
- set JVM_FLAGS=%JVM_FLAGS% -Dapollo.home="%APOLLO_HOME%"
- if NOT "x%APOLLO_BASE%" == "x" set JVM_FLAGS=%JVM_FLAGS% -Dapollo.base="%APOLLO_BASE%"
- set JVM_FLAGS=%JVM_FLAGS% -classpath "%CLASSPATH%"
-
- "%_JAVACMD%" %JVM_FLAGS% org.apache.activemq.apollo.boot.Apollo "%BOOTDIRS%" org.apache.activemq.apollo.cli.Apollo %*
-
- :END
- endlocal
- GOTO :EOF
-
- :EOF
由于搭建 Apollo 环境变量需要有 JAVA_HOME,这个时候需要安装 JDK
安装 JDK
下载:Java SE Development Kit 8 Downloads
从上图可以看到,这个Linux版本有 x86 和 x64 等版本。如果查看你的 Ubuntu 是什么版本呢?
参看:如何判断Linux是32位还是64位
方法一:getconf LONG_BIT
在linux终端输入 getconf LONG_BIT 命令
如果是32位机器,则结果为32
- [root@localhost ~]# getconf LONG_BIT
- 32
如果是64位机器,则结果为64
- [root@localhost ~]# getconf LONG_BIT
- 64
方法二:uname -a
如果是64位机器,会输出x86_64
- [chenzhou@testweb01 ~]$ uname -a
- 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位的
- [root@localhost ~]# uname -a
- 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
- [root@localhost ~]# file /sbin/init
- /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
- [root@localhost ~]# file /bin/ls
- /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
- [chenzhou@testweb01 ~]$ file /sbin/init
- /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
- [chenzhou@testweb01 ~]$ file /bin/ls
- /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
- # uname -a
- Linux ubuntu 3.2.0-23-generic-pae #36-Ubuntu SMP Tue Apr 10 22:19:09 UTC 2012 i686 i686 i386 GNU/Linux
-
- #getconf LONG_BIT
- 32
通过终端在/usr/local目录下新建java文件夹,命令行:
- sudo mkdir /usr/local/java
然后进入java目录,命令行:
解压压缩包:
- sudo tar xvf jdk-8u25-linux-x64.tar.gz
设置jdk环境变量:
- # gedit /etc/profile
- 在最后添加下面代码:
-
- export JAVA_HOME=/usr/local/java/jdk1.8.0_144
- export JRE_HOME=${JAVA_HOME}/jre
- export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
- export PATH=${JAVA_HOME}/bin:$PATH
-
- 使用 source /etc/profile 使它立即生效
检验是否安装成功:
- # java -version
- java version "1.8.0_144"
- Java(TM) SE Runtime Environment (build 1.8.0_144-b01)
- Java HotSpot(TM) Client VM (build 25.144-b01, mixed mode)
配置 Apollo
参看:Getting Started Guide
进入apache-apollo-1.7.1/bin目录
cd apache-apollo-1.7.1/bin/
输入 ./apollo 可以查看帮助
- # ./apollo
- usage: apollo [--log ] []
-
- The most commonly used apollo commands are:
- create creates a new broker instance
- disk-benchmark Benchmarks your disk's speed
- help Display help information
- version Displays the broker version
-
- See 'apollo help ' for more information on a specific command.
创建一个Broker示例:/apollo create mybroker,MQTT服务器都是叫Broker。
- # ./apollo create mybroker
- Creating apollo instance at: mybroker
- Generating ssl keystore...
-
- You can now start the broker by executing:
-
- "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker" run
-
- Or you can setup the broker as system service and run it in the background:
-
- sudo ln -s "/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/bin/apollo-broker-service" /etc/init.d/
- /etc/init.d/apollo-broker-service start
后面会有提示怎么启动服务器,以及创建一个service。
启动Apollo :
- # ./mybroker/bin/apollo-broker run
-
- _____ .__ .__
- / _ \ ______ ____ | | | | ____
- / /_\ \\____ \ / _ \| | | | / _ \
- / | \ |_> > <_> ) |_| |_( <_> )
- \____|__ / __/ \____/|____/____/\____/
- \/|__| Apache Apollo (1.7.1)
-
-
- Loading configuration file '/home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/etc/apollo.xml'.
- INFO | OS : Linux 3.2.0-23-generic-pae (Ubuntu 12.04 LTS)
- INFO | JVM : Java HotSpot(TM) Server VM 1.8.0_144 (Oracle Corporation)
- INFO | Apollo : 1.7.1 (at: /home/tarena/project/MQTT/apache-apollo-1.7.1)
- INFO | OS is restricting the open file limit to: 100000
- INFO | Accepting connections at: tcp:
- INFO | Accepting connections at: tls:
- INFO | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data
- INFO | Accepting connections at: ws:
- INFO | Accepting connections at: wss:
- INFO | Administration interface available at: https:
- INFO | Administration interface available at: http:
之后查看打印信息即可知道MQTT要连接的端口和管理页面端口。
然后打开Ubuntu浏览器,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可进入 Apollo Console 窗口。
默认的登录id和密码是 admin 和 password 。
二、Windows 下 MQTT 服务器搭建之Apollo
(1)下载 Apollo
下载:Download it today!
(2)安装
解压得到如下文件。
这里需要注意了,解压 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格,
后面会提到出现什么错误。
进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹
按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。
然后在 cmd 窗口执行 apollo.cmd。然后就可以看到发生错误。上面Ubuntu下安装时已经提到,还需要安装 JDK。
(3)安装 JDK
下载:Java SE Development Kit 8 Downloads
Windows 系统是多少位的,这个应该很清楚吧。查看 我的电脑->属性,查看有关计算机的基本信息。
我的电脑为 win 10 64位,下载并安装 jdk-8u144-windows-x64.exe
然后配置 JDK 环境变量
我的电脑->属性->高级系统设置->高级->环境变量
这部分我们之前将 FFmpeg 的Windows安装说明时有提到过的。可看到有用户变量和系统变量。
修改“用户变量”为当前用户使用,其他 Windows 用户不能够使用。如果要使每个用户都能够使用,你需要修改 "系统变量" 。
注意,不要够删除在变量中原来已有的内容。如果之前已存在变量,则在其之后用分号“;”分隔,然后添加。
我们只让当前用户可用,修改用户变量即可。
在用户环境变量中新建变量 JAVA_HOME,设置变量值 F:\Program Files\Java\jdk1.8.0_144
新建PATH,设置变量值%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin
新建CLASSPATH,设置变量值.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar注意前面的.表示当前目录。然后点击“确定”按钮。
到此,配置完成。打开 cmd 测试一下配置是否成功。
输入java -version,显示版本java version "1.8.0_144",输入javac -version,也显示javac 1.8.0_144,说明JDK安装及环境变量配置成功。
然后接着上面来讲。
进入 apache-apollo-1.7.1-windows-distro\apache-apollo-1.7.1\bin 文件夹
按住 shift键选择 apollo.cmd 再点击右键。选择 在此处打开命令窗口。
再次在 cmd 窗口执行 apollo.cmd,可以看到如下的信息,这就和 Ubuntu 下安装对上了。
(4)创建服务器实例
参看:Getting Started Guide
在 CMD 命令窗口输入 apollo create mybroker ,当然 mybroker 这个名字可以随便起。
然后查看 mybroker 可以发现里面包含有很多信息,其中etc\apollo.xml文件下是配置服务器信息的文件,etc\users.properties文件包含连接MQTT服务器时用到的用户名和密码,可以修改原始的admin=password,可以接着换行添加新的用户名密码。
bin:保存与该实例关联的执行脚本。
etc:保存实例配置文件
data:保存用于存储持久消息的数据文件
日志:保存旋转日志文件
tmp:保存在代理运行之间安全删除的临时文件
打开cmd,运行 apache-apollo-1.7.1\bin\mybroker\bin\apollo-broker.cmd run 开启服务器,如下图所示:
这里需要注意了,所在 apache-apollo-1.7.1 所在文件夹名称不能有 中文或者空格。因为我上面的是存放在 360安全浏览下载 这个目录下了。导致出现系统找不到指定的路径。
然后打开浏览器上,输入 http://127.0.0.1:61680/ 或 https://127.0.0.1:61681/
即可进入 Apollo Console 窗口。
默认的登录id和密码是 admin 和 password
三、MQTT 客户端测试
Apollo 服务器安装已经讲完,接下来简单测试一下发布订阅。
这里面网上有 MQTT协议之Apache Apollo 安装使用 这种文章用的是 java,在Android上测试的。
这就不太适合我了,不懂 Android 蓝瘦香菇啊!
再有一种是用 谷歌浏览器上的 扩展程序 mqttlens
首先添加该插件
点击 获取更多扩展程序
搜索 mqttlens ,最后添加至 CHROME
安装完成!!
下面进行测试
先运行 Apollo 服务器
然后启动 mqttlens
然后点击 Connections+
出现下图,并
填写好相关的信息
然后就进入了,订阅发布界面
OK,到此结束
四、Ubuntu 下 MQTT 服务器搭建之Mosquitto
Mosquitto 是一款实现了消息推送协议MQTT v3.1的开源消息代理软件,提供轻量级的、支持可发布/可订阅的消息推送模式。现在我们开始搭建服务器。