MQTT协议之ApacheApollo安装使⽤
Apache Apollo是⼀个代理服务器,其是在ActiveMQ基础上发展⽽来的,可以⽀持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。
Apollo允许客户端通过开放的MQTT协议连接。该协议主要是⽤在资源有限的驱动上,以及⽹络不稳定的情况下使⽤,是⼀个订阅、发布模型。这种驱动通常不适⽤类似http,stomp这类基于⽂本,或者类似openfire,AMQP等传统⼆进制协议。MQTT是⼀个简介的⼆进制协议,适⽤这类驱动资源受限,⽽且是不稳定的⽹络条件下。之前的稳定发布版本中,MQTT是作为⼀个Apollo的⼀个插件提供的。但是现在,这个插件已经变为开发项⽬的⼀部分。MQTT在Apollo中已经不需要其他配置⽂件或者是第三⽅插件⽀持了。
MQTT是⼀个线路层的协议,任何实现该协议的客户端都可以连接到Apollo。当然也可以整合其他MQTT兼容的消息代理中。
更多有关MQTT协议内容,参考the MQTT Specification
MQTT协议配置
为了开始使⽤MQTT协议,⾸先使⽤MQTT3.1协议的客户端,连接到Apollo正在监听端⼝。Apollo会做协
议检测,⽽且⾃动识别MQTT连接,⽽且将连接作为MQTT协议处理。你不必要为MQTT协议打开⼀个端⼝(STomp,Openfire,AMQP等都是⾃动识别)。如果你⼀定指定连接的协议,有下⾯两种⽅式:你可以选择不⽤协议识别,⽽是为MQTT指定连接:
<connector id="tcp" bind="tcp://0.0.0.0:61613" protocol="mqtt"/>
或者你可以限制哪种协议可以被⾃动识别。通过下⾯的<detece>配置⽅式:
<connector id="tcp" bind="tcp://0.0.0.0:61613">
<detect protocols="mqtt openwire" />
</connector>
<detect> 下protocols 对应的参数通过空格来隔开⽀持的通信协议。如果只⽀持⼀种协议,就不要空格,默认情况下对任何协议⽣效。
如果你想调整MQTT默认设置,在l⽂件中有⼀个<connector> 元素,通过MQTT参数配置:
<connector id="tcp" bind="tcp://0.0.0.0:61613">
<mqtt max_message_length="1000" />
</connector>
MQTT元素⽀持下⾯⼏个参数:
max_message_length : The size (in bytes) of the largest message that can be sent to the broker. Defaults to 100MB(broker能接受的最⼤消息量:默认是100M)
protocol_filters : A filter which can filter frames being sent/received to and from a client. It can modify the frame or even drop it.(⼀个控制发送和接收,Client的过滤器框架。可以修改,删除这个框架)
die_delay : How long after a connection is deemed to be “dead” before the connection actually closes; default: 5000ms(在实际断开连接之前,会有默认5000ms的时间被认为连接已经dead)
mqtt 配置元素也可以⽤来控制⽬的消息头的解析。下⾯是⽀持的参数:
activemq默认账号密码queue_prefix : a tag used to identify destination types; default: null(⽤来确认⽬的地类型)
path_separator : used to separate segments in a destination name; default: /(⽤来分割⽬的地名称)
any_child_wildcard : indicate all child-level destinations that match the wildcard; default: +(识别⼦⽬录)
any_descendant_wildcard : indicate destinations that match the wildcard recursively; default:#(⽬标地址通配符)
regex_wildcard_start : pattern used to identify the start of a regex(表⽰正则表达开始)
regex_wildcard_end : pattern used to identify the end of a regex(表⽰正则表达结束)
part_pattern : allows you to specify a regex that constrains the naming of topics. (你可以指定正则表达规则)default: [ a-zA-Z0-9\_\-\%\~\:]+
Client 可⽤函数库
Apollo ⽀持MQTT3.1 协议,下⾯是可⽤的Clients:
Java : mqtt-client, MeQanTT
C : libmosquitto
Erlang : erlmqtt, my-mqtt4erl
.NET : MQTTDotNet, nMQTT
Perl : net-mqtt-perl, [anyevent-mqtt-perl]github/beanz/anyevent-mqtt-perl()
Python : nyamuk
Ruby : mqtt-ruby, ruby-em-mqtt
JavaScript : Node.js MQTT Client
Delphi : TMQTTCLient
Device specific: Arduino, mbed, Nanode, Netduino
如果要到新⽀持的Clients ,可以检索:the MQTT website for its software
在⽬录example ⽬录下,你可以到⼀些例⼦,实现了与broker之间收发。
connecting
为了确保broker配置⽂件的安全,所以只允许⼀个admin ⽤户连接,默认的⽤户名和密码是:admin ,password.
Mqtt 客户端不能specify 虚拟主机(更多请看:see the section on Virtual Hosts in the user guide),以⾄于默认情况下虚拟主机已经被使⽤了。通常第⼀虚拟主机定义在l⽂件中。
Destination 类型
MQTT协议是订阅,发布协议,是不允许真正的利⽤队列点对点的消息收发。因此Apollo仅允许利⽤主题,还进⾏MQTT消息发送。订阅的概念和持久的主题订阅和其他协议提到的有些类似,同时也被MQTT CONNECT 框架的clean session属性控制。
Clean Sessions
但⼀个Client 发送⼀个连接,这个连接中clean session 被设置为false,那么之前连接中有相同Client_id 的session 将会被重复使⽤。这就意味着Client断开了,订阅依然能收到消息。这就等同与同Apollo建⽴⼀个长订阅。
如果 clean session 设置为true ,那么新session就开始了,其他的session会慢慢消失,删除。这就是Apollo中定义的普通的主题订阅。
Topic Retained Messages
如果消息被发布的同时retain 标记被设置,消息将被主题记住,以⾄于新的订阅到达,最近的retain 消息会被发送到订阅者。⽐如说:你想发布⼀个参数,⽽且你想让最新的这个参数发布到总是可⽤的订阅了这个主题的客户端上,你就设置在PUBLISH 框架上设置retain 标签。
注意:retained 消息不会被设置成retained 在 QoS设置为零的broker 重启过程中。
Last Will and Testament Message
当Client第⼀次连接的时候,有⼀个will 消息和⼀个更QoS相关的消息会跟你有关。will消息是⼀个基础消息,这个基础消息只有在连接异常或者是掉线的时候才会被发送。⼀
当Client第⼀次连接的时候,有⼀个will 消息和⼀个更QoS相关的消息会跟你有关。will消息是⼀个基础消息,这个基础消息只有在连接异常或者是掉线的时候才会被发送。⼀般⽤在你有⼀个设备,当他们掉了的时候,你需要知道。所以如果⼀个医疗Client从broker掉线,will消息将会作为⼀个闹钟主题发送,⽽且会被系统作为⾼优先级提醒。Reliable Messaging
MQTT协议允许Client 发布消息的时候指定Qos参数:
At Most Once (QoS=0)
At Least Once (QoS=1)
Exactly Once (QoS=2)
最多⼀次
这个设置时推送消息给Client,可靠性最低的⼀种。如果设置Qos=0,那broker就不会返回结果码,告诉你他收到消息了,也不会在失败后尝试重发。这有点像不可靠消息,如JMS。
⾄少⼀次
该设置会确保消息会被⾄少⼀次推送到Client。如果推送设置为⾄少推送⼀次,Apollo会返回⼀个回调函数,确保代理已经收到消息,⽽且确保会确保推送该消息。如果Client 将发布了⼀个Qos=1的消息,如果在指定的时间内没有收到回复,Client会希望重新发布这个消息。所以可能存在这种情况:代理收到⼀个需要推送的消息,然后⼜收到⼀个消息推送到同⼀个Client。所以如果传输过程中PUBACK丢失,Client会重新发送,⽽且不会去检测是否是重发,broker就将消息发送到订阅主题中。
恰好⼀次
该设置是可靠等级最⾼的。他会确保发布者不仅仅会推送,⽽且不会像Qos=1 那样,会被接收两次。当然这个设置会增加⽹络的负载。当⼀个消息被发布出去的时
候,broker会保存该消息的id,⽽且会利⽤任何长连接,坚持要把该消息推送给⽬标地址。如果Client收到PUBREC 标志,那就表明broker已经收到消息了。这个时候broker会期待Client发送⼀个PUBREL 来清除session 中消息id,broker如果发送成功就会发送⼀个PUBCOMP通知Client。
Wildcard Subscriptions
通配⽤在主题的⽬标地址中。这能实现⼀个主题发送到多个⽤户,或者多层⽤户中。
/ is used to separate names in a path(分割路径)
+ is used to match any name in a path(通配地址任何字符)
# is used to recursively match path names(递归通配)
⽐如通配可能这样来⽤:
PRICE/# : Any price for any product on any exchange(任何交易中任何产品的价格)
PRICE/STOCK/# : Any price for a stock on any exchange(任何交易中的股票价格)
PRICE/STOCK/NASDAQ/+ : Any stock price on NASDAQ(纳斯达克的任何股票价格)
PRICE/STOCK/+/IBM : Any IBM stock price on any exchange(任何交易中IBM股票价格)
Keep Alive
Apollo只有在Client指定了CONNECT的KeepAlive 值的时候,才会设置保持连接、⼼跳检测。如果one Client指定了keepalive,apollo 将会使⽤1.5*keepalive值。这个在MQTT中有说明。
Destination Name Restrictions
路径名称限制了使⽤(a-z, A-Z, 0-9, _, - %, ~, :, ' ', '(', ')' ,. )字符,通配符(*)在复杂的分隔符中。⽽且确保使⽤utf-8来编译你的URL。
源码地址:/apollo/community/source.html
官⽹参考⼿册:/apollo/versions/1.7/website/index.html
svn checkOut : /repos/asf/activemq/activemq-apollo/trunk
1、下载,安装(安装需要java环境)
wget /i?path=activemq/activemq-apollo/1.7/apache-apollo-1.7-unix-
tar -zxvf apache-apollo-1.
cd apache-apollo-1.7
新建⼀个broker实例
./bin/apollo create mqtt_test #在当前⽬录下⽣成⼀个mqtt_test⽬录,其下⾯包含:
bin  运⾏脚本
etc 环境配置
data 存储持久化数据
log  运⾏⽇志
tmp 临时⽂件
注:etc下配置⽂件说明:
⼀、users.properties:
⽤来配置可以使⽤服务器的⽤户以及相应的密码。
其在⽂件中的存储⽅式是:⽤户名=密码,如:
admin=password
表⽰新增⼀个⽤户,⽤户名是:admin,密码是:password
⼆、groups.properties:
持有体的⽤户映射,可以通过组⽽不是单个⽤户简化访问控制列表。
可以为⼀个定义的组设置多个⽤户,⽤户之间⽤“|”隔开,如:
admins=admin|lily
表⽰admins组中有admin和lily两个⽤户
三、:
⽤来存放不允许连接服务器的IP地址,相当于⿊名单类似的东西。
例如:10.20.9.147
表⽰上⾯IP不能够连接到服务器。
四、fig:
是⼀个服务器认证的配置⽂件,为了安全apollo1.6版本提供了认证功能,只有相应的⽤户名和正确的密码才能够连接
服务器。
五、服务器主配置⽂件l:
3、测试
(1)使⽤paho的mqttv3测试
服务端:
[java] view plain copy print?
1. package cn.smartslim.mqtt.demo.paho;
2.
view plain copy print?
view plain copy print?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。