文档章节

Apollo中MQTT协议相关配置

中成才
 中成才
发布于 2015/04/25 10:29
字数 2223
阅读 123
收藏 3
点赞 0
评论 0

官网英文参考:http://activemq.apache.org/apollo/documentation/mqtt-manual.html

MQTT协议

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默认设置,在apollo.xml文件中有一个<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 配置元素也可以用来控制目的消息头的解析。下面是支持的参数:

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]https://github.com/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),以至于默认情况下虚拟主机已经被使用了。通常第一虚拟主机定义在apollo.xml文件中。

 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从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。


本文转载自:http://blog.csdn.net/wuyinxian/article/details/38826259

共有 人打赏支持
中成才
粉丝 50
博文 109
码字总数 43234
作品 0
海淀
架构师
搭建IM服务 so easy

现在很多网站、APP都通过IM服务来实现消息推送及数据即时同步功能,即时通讯组件逐渐成为产品的标配。目前国内有很多成熟稳定的第三方即时通讯服务厂家,比如:融云。使用这些专业的服务可以...

一等兵 ⋅ 2016/03/22 ⋅ 9

MQTT协议通过Apache Apollo代理服务器,使用eclipse paho发送推送消息到android客户端

前言 MQTT是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。关于MQTT的详细介绍推荐这篇文章推荐文章 Apache apollo是一个代...

刘奎永6330 ⋅ 2017/12/18 ⋅ 0

29. Apache apollo和mqtt下载和部署

一. 简介 引用其他文章: Apache Apollo是一个代理服务器,其是在ActiveMQ基础上发展而来的,可以支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。 Apollo允许客户端通过...

rongwei84n ⋅ 2017/07/06 ⋅ 0

基于 MQTT 协议的推送服务

一、简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1...

什么都不懂的小石 ⋅ 04/27 ⋅ 0

如何实现安卓消息推送

最近突然对安卓消息推送的原理感兴趣,找了不少资料,实现了一个包括服务端和客户端的简单Demo。 在具体实现的时候踩了不少坑,这里做一下笔记,防止以后忘记。 安卓消息推送的实现方案有下面几种...

嘉伟咯 ⋅ 2017/12/16 ⋅ 0

MQTT协议在物联网中的应用

MQTT协议在物联网方面的应用 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以...

qq_35703234 ⋅ 2017/11/10 ⋅ 0

物联网应用层网络相关协议

CoAP https://tools.ietf.org/html/rfc7252 https://tools.ietf.org/html/rfc7390 https://tools.ietf.org/html/rfc7228 CBOR https://tools.ietf.org/html/draft-bormann-cbor-00 https://g......

中成才 ⋅ 2016/09/01 ⋅ 0

30.Apollo源代码在mac下编译

一. Apollo简介 Apache Apollo是一个代理服务器,其是在ActiveMQ基础上发展而来的,可以支持STOMP, AMQP, MQTT, Openwire, SSL, and WebSockets 等多种协议。 官网链接 自己使用Apollo主要是...

rongwei84n ⋅ 2017/07/25 ⋅ 0

Linux下安装 Apollo

Apollo以ActiveMQ原型为基础,是一个更快、更可靠、更易于维护的消息代理工具。Apache称Apollo为最快、最强健的STOMP(Streaming Text Orientated Message Protocol,流文本定向消息协议)服...

爪哇小贩 ⋅ 2016/04/14 ⋅ 0

MQTT(Apollo)之windows搭建

1.下载pache-apollo-1.7.1-windows-distro.zip Apollo服务器 2.解压,然后cmd命令如下: 3.create mybroker之后会在bin目录下生成mybroker文件夹,里面包含有很多信息,其中etcapollo.xml文件...

小石头哥 ⋅ 2016/10/31 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部