物联网MQTT协议分析和开源Mosquitto部署验证
在《物联网核心协议—消息推送技术演进》一文中已向读者介绍了多种消息推送技术的情况,包括HTTP单向通信、Ajax轮询、Websocket、MQTT、CoAP等,其中MQTT协议为IBM制定并力推,其具有开放、简单、轻量级以及易于实现的特点使得其即便在资源受限的环境中也能得到很好的使用,比如运行在资源紧缺型的嵌入式系统中或网络带宽非常昂贵的环境中,除此之外,它也被广泛用于遥感勘测、智能家居、能源监测和医疗应用程序等各个领域,是物联网的重要组成部分,将来可能会成为物联网的事实标准。
本篇文章将帮助读者认识MQTT协议以及在Linux环境下部署MQTT的开源实现Mosquitto进行体验验证,在后续文章中将展开对其源码框架的分析,为构建物联网平台做好铺垫。
一、MQTT协议分析
1.1、MQTT协议简介
MQTT(MessageQueueing Telemetry Transport Protocol)的全称是消息队列遥感传输协议的缩写,是由IBM公司推出的一种基于轻量级代理的发布/订阅模式的消息传输协议,运行在TCP协议栈之上,为其提供有序、可靠、双向连接的网络连接保证。由于其开放、简单和易于实现所以能够应用在资源受限的环境中,对于M2M和物联网应用程序来说是一个相当不错的选择。
1.2、发布者/订阅者
MQTT采用代理的发布/订阅模式实现了发布者和订阅者的解耦(decouple),因此,在MQTT协议中有三种角色:代理服务器、发布者客户端以及订阅者客户端,其中发布者和订阅者互不干扰,也就是说发布者和订阅者互不知道对方的存在,它们只知道代理服务器,代理服务器负责将来自发布者的消息进行存储处理并将这些消息发送到正确的订阅者中去。这种解耦体现在以下3个方面上:
·空间解耦:发布者和订阅者不必知道对方的存在,例如对方的IP地址或者端口;
·时间解耦:发布者和订阅者不必同时建立连接;
·同步解耦:发布者和订阅者在发布消息或接收消息的时候不需要同步;
1.3、MQTT的消息类型
MQTT的三种角色通过14种不同的消息类型进行交互:
1.CONNECT控制报文用于客户端请求与服务器建立连接,应用层的连接而不是TCP/IP连接,CONNECT控制报文的发送在TCP/IP建立连接后;
2.CONNACK控制报文用于服务器向请求连接的客户端回发连接确认;
3.PUBLISH控制报文用于发布指定主题名的应用信息;
4.PUBACK/PUBREC/PUBREL/PUBCOMP控制报文用于针对不同服务质量的应用信息的回应;
5.SUBSCRIBE控制报文用于订阅者向服务器发送一个主题过滤器列表,用于表示客户端想要订阅的主题;
6.SUBACK控制报文用于SUBSCRIBE控制报文的响应;
7.UNSUBSCRIBE控制报文用于向服务器发送一个主题过滤器列表,用于表示客户端想要取消订阅的主题;
8.UNSUBACK控制报文用于UNSUBSCRIBE控制报文的响应;
9.PINGREQ/PINGRESP控制报文作为客户端和服务器间的心跳包;
10.DISCONNECT控制报文用于客户端在断开前告诉服务器其将断开连接;
1.4、主题(topic)
使用主题是服务器为每一个客户端管理应用信息所采用的一种方式,一个主题名可以由多个主题层级(topic level)组成,每一层通过’/’斜杠分隔开,当客户端指定的主题过滤器包含通配符时,即客户端想一次订阅多个具有类似结构的主题时,主题层级分隔符就很有用了。
主题通配符只可用在主题过滤器中,在发布应用消息时的主题名不允许包含通配符,主题通配符有两种:
单层通配符:’+’,它会匹配某一个主题层级中的所有主题;
多层通配符:’#’,它会匹配多个主题主题层级的主题;
例如:如果客户端订阅时的主题过滤器为”grade/subject/math/#”,它会收到使用下列主题名发布的消息:
“grade/subject/math”
“grade/subject/math/student1”
“grade/subject/math/student1/lastterm”
1.5、服务质量等级(QosLevels)
MQTT提供三种Qos的消息传递质量:
a.最多一次(Atmost once delivery):QoS=0,协议对此等级应用信息不要求回应确认,也没有重发机制,这类信息可能会发生消息丢失或重复,取决于TCP/IP提供的尽最大努力交互的数据包服务。
b.最少一次(Atleast once delivery):QoS=1,确保信息到达,但消息重复可能发生,发送者如果在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送,且控制报文中DUP标志位置1。
c.仅仅一次(Exactlyonce delivery):QoS=2,最高级别的服务质量,消息丢失和重复都是不可接受的。
1.6、支持MQTT协议的服务器和客户端
当前流行的开源代理服务器(MQTT Broker)的实现有:mosquitto, HiveMQ, Apache ActiveMQ, RabbitMQ, mosca等,MQTT客户端也有不同操作系统和编程语言下的实现,流行的客户端库(MQTT ClientLibraries)有:Eclipse Paho(支持C,C++, Java, JavaScript, Python, Go, C#), M2MQTT(C#), Fusesource MQTTClient(Java), MQTT.js(javascript), libmosquitto(c/c++)等等,通过以上库而开发出的MQTT客户端应用程序有:mosquitto_pub/mosquitto_sub(可运行于Linux, Windows, MacOSX操作系统), HiveMQWebsocket Client(Web browser), MyMQTT(Android), MQTTLens(Google Chrome)等等。
二、Mosquitto部署验证
2.1、Ubuntu下安装Mosquitto
1.源码包下载:http://mosquitto.org/files/source/
版本:mosquitto-1.4.tar.gz
解压:tar -zxvf mosquitto-1.4.tar.gz
进入目录:cd mosquitto-1.4
2.编译安装
打开配置文件,去掉暂且不需要的功能:
vi config.mk
如:WITH_TLS,WITH_TLS_PSK, WITH_SRV, WITH_WEBSOCKETS, WITH_SOCKS, WITH_UUID等
保存退出:wq
安装mosquitto
make
make install
2.2、启动mosquitto服务器
mosquitto默认以mosquitto用户启动,所以首先创建mosquitto用户:
adduser mosquitto
启动代理服务器:mosquitto -c/etc/mosquitto/mosquitto.conf.example
在启动服务器过程中有可能遇到以下错误:找不到libmosquitto.so.1文件,解决方法是添加链接库路径:
vi/etc/ld.so.conf.d/liblocal.conf
/usr/local/lib64
/usr/local/lib
退出文件后刷新:ldconfig
重新执行:mosquitto -c /etc/mosquitto/mosquitto.conf.example
2.3、启动订阅者客户端mosquitto_sub,订阅test主题
mosquitto_sub客户端应用程序位于/mosquitto-1.4/client目录下,执行./mosquitto_sub-t test, -t表示主题过滤器属性,后面带指定的主题过滤器。
2.4、启动发布者客户端mosquitto_pub,并且多次发布主题信息
./mosquitto_pub-t test -l
其中-t表示发布的主题名,主题名中不允许包含通配符,-l是指通过标准输入的方式输入将要发布的应用信息,更多的属性可通过:./mosquiito_pub --help了解,也可通过官网了解:
http://mosquitto.org/man/mosquitto_pub-1.html。
发布者发布应用信息:
2.5、发布者通过键入”Ctrl+D”向服务器发送DISCONNECT控制报文,然后正常退出
如果通过”Ctrl+C”终止客户端程序(异常网络断开),服务器将提示:Scoket error
本篇文章初步讲述了MQTT协议及以其中的一种实现为例进行部署和体验,协议的详细具体内容如控制报文格式等,读者可自行到官网下载文档查阅,也可以关注嵌入式企鹅圈来获取共享资源。
物联网MQTT协议分析和开源Mosquitto部署验证的更多相关文章
- 物联网防火墙himqtt源码之MQTT协议分析
物联网防火墙himqtt源码之MQTT协议分析 himqtt是首款完整源码的高性能MQTT物联网防火墙 - MQTT Application FireWall,C语言编写,采用epoll模式支持数十万 ...
- 物联网项目开发必读 深度分析MQTT协议优缺点
物联网并不仅仅是一种网络,而是一个新的生态环境,它描述的本质是越来越多的使用物品通过网络连接在一起并可使用单个或者多个的终端设备对它们进行各种控制和使用—当然,工业上的物联网通常连接到的石鼓传感器或者 ...
- 物联网应用层协议选择和分析--MQTT、CoAP 、HTTP、XMPP、SoAP
MQTT协议 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)最早是IBM开发的一个即时通讯协议,MQTT协议是为大量计算能力有限且工作在低带宽.不 ...
- 【转载】MQTT学习笔记——MQTT协议体验 Mosquitto安装和使用
http://blog.csdn.net/xukai871105/article/details/39252653 0 前言 MQTT是IBM开发的一个即时通讯协议.MQTT是面向M2M和物联 ...
- 海鑫智圣:物联网漫谈之MQTT协议
什么是MQTT协议 MQTT(消息队列遥测传输协议)是IBM在1999年专门针对物联网等应用场景来制订的轻量级双向消息传输协议,它主要是为了解决物联网上使用到的设备的互相通信的问题,以及这些设备与后端 ...
- MQTT协议学习研究 & Mosquitto简要教程(安装和使用)
若初次接触MQTT协议,可先理解以下概念: [MQTT协议特点]——相比于RESTful架构的物联网系统,MQTT协议借助消息推送功能,可以更好地实现远程控制. [MQTT协议角色]——在RESTfu ...
- 物联网传输协议MQTT
MQTT是一个物联网传输协议,它被设计用于轻量级的发布/订阅式消息传输,旨在为低带宽和不稳定的网络环境中的物联网设备提供可靠的网络服务.MQTT是专门针对物联网开发的轻量级传输协议.MQTT协议针对低 ...
- 【物联网云端对接-3】通过MQTT协议与微软Azure IoT Hub进行云端通信
在上一篇文章<通过MQTT协议与阿里云物联网套件进行云端通信>中,我们介绍了通过MQTT对接阿里云的物联网套件.其实同样的代码,稍加调整也可以对接到微软Azure IoT hub上,不过需 ...
- 转战物联网·基础篇09-选择MQTT协议还是CoAP协议
前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境. XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...
随机推荐
- Poj 3667
这是第一题线段树的区间合并的题: 这类的题用于求连续的最长长度什么的: 这题我看的是一篇比较不错的博客: 我把我的理解注释在代码里了: #include <iostream>#includ ...
- nginx 一般配置实例 静态页面
# 使用的用户和组 user www www; # 指定工作衍生进程数(一般等于CPU的总核数或总核数的两倍,例如两个四核CPU,则总核数为8) worker_processes 8; # 指定错误日 ...
- 七天学会 SALT STACK 自动化运维 (1)
七天学会 SALT STACK 自动化运维 (1) 简单理解 SALTSTACK 安装与配置 基本的使用方法 结束语 引用资源 简单理解 SALT STACK 笔者是初次接触 自动化运维 这一技术领域 ...
- javabean 简介
javabean其实包含多个方面的含义. Java语言开发的可重用组件 优点:1,代码简洁.2,HTML与Java分离,好维护.3,将常用程序写成可重用组件,避免重复. 特点:1,所有类放在同 ...
- 无线通信技术协议-6LoWPAN
6LoWPAN:基于IPv6的低速无线个域网标准,即IPv6 over IEEE 802.15.4. 注:6LoWPAN的协议栈实现在Contiki(完整的一套6LoWPAN协议栈).Zephyr(6 ...
- Java吸收换行符
今天做题遇到的-- 由于读入的字符串可能包含空格,所以采用nextLine. int n = sc.nextInt(); for(int i=0; i<n; i+ ...
- DB2 SQL RR/RS/CS/UR四个级别《转载》
1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录.在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁.具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁:如 ...
- 几个国外FMX网站 good
FireMonkey X – Amazing overview of FireMonkey FMX Feeds – All your FireMonkey news in one place FMX ...
- 设计模式之装饰者模式(Decorator Pattern)
一.什么是装饰者模式? 装饰者模式能够完美实现“对修改关闭,对扩展开放”的原则,也就是说我们可以在不修改被装饰者的前提下,扩展被装饰者的功能. 再来看看我们的文件操作代码: 1 InputStream ...
- 如何查看SQL Server的数据库实例名
其实一般默认就是MSSQLSERVER (注意,就是英文大写). 点击开始,运行,services.mcs 然后查阅所有SQL Server的项,其中括号中字符串的就是实例名 reference: ...