一、MQTT简介
MQTT,是IBM推出的一种针对移动终端设备的基于TCP/IP的发布/预订协议,可以连接大量的远程传感器和控制设备。
1.轻量级的消息订阅和发布(publish/subscribe)协议
2.建立在TCP/IP协议之上
3.IoT,internet of things,物联网,MQTT在这方面应用较多。
MQTT协议是针对如下情况设计的:
M2M(Machine to Machine) communication,机器端到端通信,比如传感器之间的数据通讯。
因为是Machine to Machine,需要考虑:
Machine,或者叫设备,比如温度传感器,硬件能力很弱,协议要考虑尽量小的资源消耗,比如计算能力和存储等
M2M可能是无线连接,网络不稳定,带宽也比较小
MQTT协议的架构,用一个示例说明。比如有1个温度传感器(1个Machine),2个小的显示屏(2个Machine),显示屏要显示温度传感器的温度值。
显示器需要先通过MQTT协议subscribe(订阅)一个比如叫temperature的topic(主题)。
协议里还有2个主要的角色:
client,客户端 broker。
服务器端。
它们是通过TCP/IP协议连接的。因为MQTT是协议,所以不能拿来直接用的,就好比HTTP协议一样。需要找实现这个协议的库或者服务器来运行。
MQTT官网:http://mqtt.org/
开源MQTT服务中间件有:
1)EMQX:github 4882 stars
2)Mosquitto:github 1645 stars
3)Apollo:ActiveMQ的升级版,github 109 stars,但是该项目已经有3~4年没有更新。而其号称的老版本ActiveMQ反而更新更加频繁。
二、Apollo服务器搭建
Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的STOMP(Streaming Text Orientated Message PRotocol,流文本定向消息协议)服务器. 它采用一个完全不同的消息分发架构,同ActiveMQ一样支持多种协议。如STOMP,AMQP,MQTT,Openwire,SSL和WebSockets。
- 下载
地址:http://archive.apache.org/dist/activemq/activemq-apollo/
下载:2.1.7版本
2.1.7版本
# 下载
[root@localhost ~]# wget http://archive.apache.org/dist/activemq/activemq-apollo/1.7.1/apache-apollo-1.7.1-unix-distro.tar.gz
# 解压
[root@localhost ~]# tar -zxvf apache-apollo-1.7.1-unix-distro.tar.gz -C /usr/local
- 创建实例
# 创建broker实例
[root@localhost ~]# cd /usr/local/apache-apollo-1.7.1/
[root@localhost apache-apollo-1.7.1]# ./bin/apollo create testbroker
Creating apollo instance at: testbroker
Generating ssl keystore...
Warning:
JKS 密钥库使用专用格式。建议使用 "keytool -importkeystore -srckeystore keystore -destkeystore keystore -deststoretype pkcs12" 迁移到行业标准格式 PKCS12。
You can now start the broker by executing:
"/usr/local/apache-apollo-1.7.1/testbroker/bin/apollo-broker" run
Or you can setup the broker as system service and run it in the background:
sudo ln -s "/usr/local/apache-apollo-1.7.1/testbroker/bin/apollo-broker-service" /etc/init.d/
/etc/init.d/apollo-broker-service start
# 查看实例配置文件
[root@localhost apache-apollo-1.7.1]# ls testbroker/etc/
apollo.xml black-list.txt groups.properties keystore log4j.properties login.config users.properties
- 配置详解
users.properties:
用来配置可以使用服务器的用户以及相应的密码。
其在文件中的存储方式是:用户名=密码,如:
admin=password
表示新增一个用户,用户名是:admin,密码是:password
groups.properties:
持有群体的用户映射,可以通过组而不是单个用户简化访问控制列表。
可以为一个定义的组设置多个用户,用户之间用“|”隔开,如:
admins=admin|lily
表示admins组中有admin和lily两个用户
black-list.txt:
用来存放不允许连接服务器的IP地址,相当于黑名单类似的东西。
例如:10.20.9.147
表示上面IP不能够连接到服务器。
login.config:
是一个服务器认证的配置文件,为了安全apollo1.6版本提供了认证功能,只有相应的用户名和正确的密码才能够连接
服务器。
- 服务器主配置文件:apollo.xml
该配置文件用于控制打开的端口,队列,安全,虚拟主机设置等。
1、认证:可以使用<authenticationdomain="internal" />来配置是否需要连接认证,如果将其属性enable设置为false表示不用认证,任何人都可以连接服务器,默认为true
2、access_rule:可以在broker或者virtual_host中用于定义用户对服务器资源的各种行为。如:
<access_rule allow="users" action="connect create destroy send receive consume"/>表示群组users里面的用户可以对服务器资源进行的操作有:connect 、create、 destroy、 send 、receive 、consume。
详细的操作说明见:
http://activemq.apache.org/apollo/documentation/user-manual.html
3、message stores:默认情况下apollo使用的是LevelDB store,但是推荐使用BDB store(跨平台的)只能够实用其中一种。使用LevelDB store的配置是:
<leveldb_store directory="${apollo.base}/data"/>
默认有提供不用任何修改。使用BDB store需要到网站下jar包支持http://download.oracle.com/maven/com/sleepycat/je/5.0.34/je-5.0.34.jar,将jar包放在服务器的lib目录下面,然后将配置文件改成:<bdb_store directory="${apollo.base}/data"/>即可。
4、connector
:用于配置服务器支持的链接协议以及相应的端口。如:
[root@localhost testbroker]# vi etc/apollo.xml
<connector id="tcp" bind="tcp://0.0.0.0:61613" connection_limit="2000" protocol="mqtt"/>
表示支持tcp链接,使用的端口是61613,链接限制是2000,自动侦听的协议是mqtt协议。
<web_admin bind="http://0.0.0.0:61680"/>
<web_admin bind="https://0.0.0.0:61681"/>
- 启动测试
# 切换到实例目录
[root@localhost apache-apollo-1.7.1]# cd testbroker/
[root@localhost testbroker]#
# 启动apollo
#启动
[root@localhost testbroker]# ./bin/apollo-broker run
_____ .__ .__
/ _ \ ______ ____ | | | | ____
/ /_\ \\____ \ / _ \| | | | / _ \
/ | \ |_> > <_> ) |_| |_( <_> )
\____|__ / __/ \____/|____/____/\____/
\/|__| Apache Apollo (1.7.1)
Loading configuration file '/usr/local/apache-apollo-1.7.1/testbroker/etc/apollo.xml'.
INFO | OS : Linux 3.10.0-514.el7.x86_64
INFO | JVM : OpenJDK 64-Bit Server VM 1.8.0_222 (Oracle Corporation)
INFO | Apollo : 1.7.1 (at: /usr/local/apache-apollo-1.7.1)
INFO | OS is restricting the open file limit to: 100000
INFO | Starting store: leveldb store at /usr/local/apache-apollo-1.7.1/testbroker/data
INFO | Accepting connections at: tcp://0.0.0.0:61613
INFO | Accepting connections at: tls://0.0.0.0:61614
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/
# 后台启动
[root@localhost testbroker]# ./bin/apollo-broker &
# 启动成功,查看apollo进程
[root@localhost ~]# ps -ef|grep apollo
启动后,访问http://192.168.36.102:61680/
或者https://192.168.36.102:61681。
默认用户:admin / password