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 下的安装。
我们本篇都会来一一做讲解。
一、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
(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
安装 JDK
在linux终端输入 getconf LONG_BIT 命令
如果是32位机器,则结果为32
- [[email protected] ~]# getconf LONG_BIT
- 32
- [[email protected] ~]# getconf LONG_BIT
- 64
如果是64位机器,会输出x86_64
- [[email protected] ~]$ 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
- [[email protected] ~]# 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
示例:32位机器
file /sbin/init
- [[email protected] ~]# 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
- [[email protected] ~]# 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
file /sbin/init
- [[email protected] ~]$ 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
- [[email protected] ~]$ 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
- # 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
- sudo mkdir /usr/local/java
- cd /usr/local/java
- sudo tar xvf jdk-8u25-linux-x64.tar.gz
- # 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
cd apache-apollo-1.7.1/bin/
输入 ./apollo 可以查看帮助
- # ./apollo
- usage: apollo [--log <log_level>] <command> [<args>]
- 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 <command>' for more information on a specific command.
- # ./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
启动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://0.0.0.0:61613
- INFO | Accepting connections at: tls://0.0.0.0:61614
- INFO | Starting store: leveldb store at /home/tarena/project/MQTT/apache-apollo-1.7.1/bin/mybroker/data
- INFO | Accepting connections at: ws://0.0.0.0:61623/
- INFO | Accepting connections at: wss://0.0.0.0:61624/
- INFO | Administration interface available at: https://127.0.0.1:61681/
- INFO | Administration interface available at: http://127.0.0.1:61680/
二、Windows 下 MQTT 服务器搭建之Apollo
(1)下载 Apollo
(2)安装
(3)安装 JDK
(4)创建服务器实例
etc:保存实例配置文件
data:保存用于存储持久消息的数据文件
日志:保存旋转日志文件
tmp:保存在代理运行之间安全删除的临时文件