设为首页 收藏本站
查看: 1177|回复: 0

[经验分享] 物联网MQTT协议分析和开源Mosquitto部署验证

[复制链接]

尚未签到

发表于 2017-6-7 11:41:03 | 显示全部楼层 |阅读模式
  在《物联网核心协议—消息推送技术演进》一文中已向读者介绍了多种消息推送技术的情况,包括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地址或者端口;
  ·时间解耦:发布者和订阅者不必同时建立连接;
  ·同步解耦:发布者和订阅者在发布消息或接收消息的时候不需要同步;
DSC0000.jpg

  1.3、MQTT的消息类型
  MQTT的三种角色通过14种不同的消息类型进行交互:
DSC0001.jpg

  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提供的尽最大努力交互的数据包服务。
DSC0002.jpg

  b.最少一次(Atleast once delivery):QoS=1,确保信息到达,但消息重复可能发生,发送者如果在指定时间内没有收到PUBACK控制报文,应用信息会被重新发送,且控制报文中DUP标志位置1。
DSC0003.jpg

  c.仅仅一次(Exactlyonce delivery):QoS=2,最高级别的服务质量,消息丢失和重复都是不可接受的。
DSC0004.jpg

  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等
DSC0005.jpg

  保存退出:wq
  安装mosquitto
  make
  make install
  2.2、启动mosquitto服务器
  mosquitto默认以mosquitto用户启动,所以首先创建mosquitto用户:
  adduser mosquitto
  启动代理服务器:mosquitto -c/etc/mosquitto/mosquitto.conf.example
DSC0006.jpg

  在启动服务器过程中有可能遇到以下错误:找不到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表示主题过滤器属性,后面带指定的主题过滤器。
DSC0007.jpg

  2.4、启动发布者客户端mosquitto_pub,并且多次发布主题信息
  ./mosquitto_pub-t test -l
  其中-t表示发布的主题名,主题名中不允许包含通配符,-l是指通过标准输入的方式输入将要发布的应用信息,更多的属性可通过:./mosquiito_pub --help了解,也可通过官网了解:
  http://mosquitto.org/man/mosquitto_pub-1.html。
DSC0008.jpg

  发布者发布应用信息:
DSC0009.jpg

  2.5、发布者通过键入”Ctrl+D”向服务器发送DISCONNECT控制报文,然后正常退出
DSC00010.jpg

  如果通过”Ctrl+C”终止客户端程序(异常网络断开),服务器将提示:Scoket error
DSC00011.jpg

  本篇文章初步讲述了MQTT协议及以其中的一种实现为例进行部署和体验,协议的详细具体内容如控制报文格式等,读者可自行到官网下载文档查阅,也可以关注嵌入式企鹅圈来获取共享资源。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-384770-1-1.html 上篇帖子: Java判断访问设备为手机、微信、PC工具类 下篇帖子: linux系统中rsync+inotify实现服务器之间文件实时同步
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表