学习目标
- 理解RabbitMQ和MQTT的相关概念
- 使用RabbitMQ搭建MQTT服务器
- 掌握RabbitMQ服务器相关的配置
- 使用网上现有的软件工具对RabbitMQ服务器进行测试
- 阅读RabbitMQ客户端相关API文档并掌握基本调用
- 应用到项目中实现终端设备接收服务器端发送的指令,终端实时向服务器端反馈设备的状态。
- 相关连接
- 相关概念
- MQTT
全称:Message Queuing Telemetry Transport,中文名,消息队列遥测传输,是基于发布/订阅的消息协议。
2.RabbitMQ
Rabbit公司使用Erlang语言开发的消息队列中间件。
3.Producer
生产者,将消息发送到Exchange
4.Consumer
消费者,从Queue中获取消息
5.Exchange
交换器,将从生产者接收到的消息路由到Queue
6.Queue
队列,存放供消费者消费的消息
7.Channel
信道,一旦 TCP 连接建立起来,客户端紧接着可以创建一个 AMQP 信道(Channel),每个信道都会被指派一个唯一的 ID。信道是为了得用连接Connection.
8.BindingKey
绑定键,建立Exchange与Queue之间的关系
9.RoutingKey
路由键,Producer发送消息与路由键给Exchange,Exchange将判断RoutingKey是否符合BindingKey,如何则将该消息路由到绑定的Queue
10.六种工作模式
简单模式:一个生产者,一个消费者
work模式:一个生产者,多个消费者,每个消费者获取到的消息唯一。
订阅模式:一个生产者发送的消息会被多个消费者获取。
路由模式:发送消息到交换机并且要指定路由key ,消费者将队列绑定到交换机时需要指定路由key
topic模式:将路由键和某模式进行匹配,此时队列需要绑定在一个模式上,“#”匹配一个词或多个词,“*”只匹配一个词
- 安装RabbitMQ服务器
*注意,做为一名专业的程序员,请不要将你的开发相关工具安装在带有空格的目录下,你可能会给自己挖坑。
(1) 安装RabbitMQ下载Downloading and Installing RabbitMQ — RabbitMQ
(2) RabbitMQ是用Erlang语言开发的,安装前提示先安装Erlang
(3)下载安装Erlang Erlang Programming Language
(4)再次安装RabbitMQ
a.开启后台管理界面
D:\RabbitMQ Server\rabbitmq_server-3.8.9\sbin>rabbitmq-plugins enable rabbitmq_management
打开后台验证,密码账号都为guest
http://localhost:15672/
b.开启MQTT插件
D:\RabbitMQ Server\rabbitmq_server-3.8.9\sbin>rabbitmq-plugins enable rabbitmq_mqtt
- 配置RabbitMQ
- 创建用户
出于安全考虑,默认的guest账号,只能使用localhostt访问,不支持使用ip远程访问,登录管理后台,创建一个新的管理员账号就支持了。
[Admin]àAdd a user
2.给用户分配权限
【Admin】à点击要分配权限的用户名à进入权限分配界面,【set permission】是分配虚拟路径权限,【set topic permission】是用于分配exchange权限
3.删除用户
【Admin】-》【delete the user】
4.修改密码
【Admin】-》【update the user】
5.添加exchange
【exchanges】-》填写内容-》【Add exchange】
6.添加queue
【queues】-》填写内容-》【Add queue】
7.Bind Routing key
【exchanges】-》【Bindings】-》填写内容à【Bind】
- Android端开发
请在github上下载官方demo,
https://github.com/eclipse/paho.mqtt.android
然后选择develop版本,或者直接下载我的,我的已经在本地修复好重新上传的。git clone https://gitee.com/senlinzhiwang/paho.mqtt.android.git
遇到坑,请参考我的另一篇博文:
- MQTT和AMQP的区别
- MQTT 协议 (低带宽)
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布 / 订阅 (publish/subscribe) 模式的 “轻量级” 通讯协议,该协议构建于 TCP/IP 协议上,由 IBM 在 1999 年发布。MQTT 最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。做为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT 协议运行在 TCP/IP 或其他网络协议,提供有序、无损、双向连接。其特点包括:
1) 使用的发布 / 订阅消息模式,它提供了一对多消息分发,以实现与应用程序的解耦。
2) 对负载内容屏蔽的消息传输机制。
3) 对传输消息有三种服务质量 (QoS):
最多一次,这一级别会发生消息丢失或重复,消息发布依赖于底层 TCP/IP 网络。即:<=1 至多一次,这一级别会确保消息到达,但消息可能会重复。即:>=1
只有一次,确保消息只有一次到达。即:=1。在一些要求比较严格的计费系统中,可以使用此级别
4) 数据传输和协议交换的最小化 (协议头部只有 2 字节),以减少网络流量
5) 通知机制,异常中断时通知传输双方
适用范围:在低带宽、不可靠的网络下提供基于云平台的远程设备的数据传输和监控。
协议实现方式
实现 MQTT 协议需要:客户端和服务器端
MQTT 协议中有三种身份:发布者 (Publish)、代理 (Broker)(服务器)、订阅者 (Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
MQTT 传输的消息分为:主题 (Topic) 和负载 (payload) 两部分
Topic,可以理解为消息的类型,订阅者订阅 (Subscribe) 后,就会收到该主题的消息内容(payload)
payload,可以理解为消息的内容,是指订阅者具体要使用的内容
MQTT 协议一般适用于设备数据采集到端 (Device-》Server,Device-》Gateway),集中星型网络架构 (hub-and-spoke),不适用设备与设备之间通信,设备控制能力弱,另外实时性较差,一般都在秒级。
- AMQP 协议 (互操作性)
AMQP,即 Advanced Message Queuing Protocol, 一个提供统一消息服务的应用层标准高级消息队列协议, 是应用层协议的一个开放标准, 为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端 / 中间件不同产品,不同的开发语言等条件的限制。Erlang 中的实现有 RabbitMQ 等。
AMQP 协议是一个二进制协议,拥有一些现代特点:多信道、协商式、异步、安全、跨平台、中立、高效。
AMQP 通常被划分为三层:
模型层定义了一套命令 (按功能分类),客户端应用可以利用这些命令来实现它的业务功能。
会话层负责将命令从客户端应用传递给服务器,再将服务器的应答传递给客户端应用,会话层为这个传递过程提供可靠性、同步机制和错误处理。
传输层提供帧处理、信道复用、错误检测和数据表示。
实现者可以将传输层替换成任意传输协议,只要不改变 AMQP 协议中与客户端应用程序相关的功能。实现者还可以使用其他高层协议中的会话层。
AMQP 协议最早应用于金融系统之间的交易消息传递,在物联网应用中,主要适用于移动手持设备与后台数据中心的通信和分析。