@(嵌入式)
个人开发环境 : ubuntu 14.04
简介
MQTT (MessageQueueing Telemetry Transport Protocol) 全称 消息队列遥感传输协议,是IBM开发的一个即时通讯协议。 MQTT是面向M2M和物联网的连接协议,运行在TCP协议栈之上,采用轻量级发布和订阅消息传输机制。
【MQTT协议角色】— 在MQTT协议中包括发布者,代理器(服务器)和订阅者。
【MQTT协议消息】— MQTT中的消息可理解为发布者和订阅者交换的内容(负载),这些消息包含具体的内容,可以被订阅者使用。
【MQTT协议主题】— MQTT中的主题可理解为相同类型或相似类型的消息集合。
Linux 安装使用
安装前提
- 编译找不到openssl/ssl.h
$ sudo apt-get install libssl-dev
- 编译过程找不到ares.h
$ sudo apt-get install libc-ares-dev
- 编译过程找不到uuid/uuid.h
$ sudo apt-get install uuid-dev
安装
我现在使用的版本时1.4.9,后续安装,可以先查看对应目录下最新版本,选择安装。
* 编译安装
# 获取源码
$ wget http://mosquitto.org/files/source/mosquitto-1.4.9.tar.gz
$ tar zxfv mosquitto-1.4.9.tar.gz
$ cd mosquitto-1.4.9
$ make # 编译源码
$ sudo make install # 安装源码
- 使用过程中找不到libmosquitto.so.1
如何解决: 修改libmosquitto.so位置
error while loading shared libraries: libmosquitto.so.1: cannot open shared object file: No such file or directory
$sudo ln -s /usr/local/lib/libmosquitto.so.1 /usr/lib/libmosquitto.so.1
$ sudo ldconfig
基础测试
- 打开第一个终端运行代理 : S
$ mosquitto -v
# -v 打印调试信息
- 打开第二个终端订阅消息 : SUB
$ mosquitto_sub -v -t lcd
# -t 订阅 topic "lcd"
- 打开第三个终端推送一条消息 : PUB
$ mosquitto_pub -t lcd -m this_is_the_send_msg
# -t lcd 指定推送的topic
# -m xxx 消息内容, 字符串形式
当我们在执行终端 PUB 那条推送命令后, 可以在订阅终端 SUB 看到对应的消息。
如何开发
我是参考 下载的源代码中的 client 和 example目录下的示例代码。
连接维持
连接建立后,有个keep alive 在没有发送数据包的情况下,该时间内没有发心跳包会自动断开连接,写0则永远不会断开。消息发布质量
QoS Level 0:“至多一次”
消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不到了。QoS Level 1: “至少一次“
确保消息到达,但消息重复可能会发生。
这一种方式比较鸡肋,在我的想象中没能想到这种质量的发送在常规的APP开发中有什么用处。QoS Level 2: “只有一次”
确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
这种最高质量
的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。
MQTT 发布消息主题
- MQTT 的主题有特定的语法,使用斜杠(/)作为分隔符,整体呈层次结构,非常类似 URL 中的路径格式。
比如 厨房中的温度传感器也许会发布到类似“sensors/temperature/home/kitchen” 这样的主题。 - 通配符
在 MQTT 中有两个可用的通配符,分别是+和#,+表示匹配单一层级中的任意主题,#表示匹配任意数量的层次。因此在全球温度数据库中可能会有订阅到 sensors/temperature/# 的服务,它能从全世界的任何一个传感器接收温度读数。但如果英国政府想要在自己的温度服务中利用这些数据,只要订阅到 sensors/temperature/uk/# ,就可以限制范围,只接受英国的传感器读数。如果某个服务想要接收某个特定位置所有类型的传感器数据,可以使用类似这样的格式 sensors/+/uk/london/bakerstreet_
- MQTT 的主题有特定的语法,使用斜杠(/)作为分隔符,整体呈层次结构,非常类似 URL 中的路径格式。