MQTT发布/订阅消息机制在tcpip协议最低层Arduino传感节点的实现
【摘要】本文介绍一种全新的物联网通信协议——基于发布/订阅范式的消息队列遥测传输协议的原理、组成和实现。研究在计算和通信能力受限的基于单片机的物联网节点上,实现基于MQTT的数据传递。
【关键词】消息队列遥测传输协议;发布/订阅传递机制;基于主题
在设计和部署物联网应用系统时,选择高效、低资源占用的消息传递协议是系统架构设计关键一步。设计人员看到太多的通信协议,它们存在一些差别,而传感节点提供仅能够提供非常有限的计算能力、低可靠的通信链路和有限的电池电量,消息服务器通常部署在云端。本文讨论一种适应物联网通信需要的轻量级可靠消息传递协议——MQTT,并介绍以8位单片机为传感节点的系统实现。
1.MQTT简介
MQTTMessage Queuing Telemetry Transport,消息队列遥测传输,以下简称MQTT)是IBMEurotech开发的一个发布/订阅模式通信协议。MQTT建立在TCPIP上(图1),为计算
能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,是物联网的重要通信协议之一。
MQTT可以在支持TCPIP的不同类型设备上实现,例如:计算机、移动设备(智能手机、平板、PDA)、计算机能力有限的传感节点等;可以不用OS或者在不同OS环境下实现,包括:WindowsLinuxAndroid等;MQTT组织提供不同语言的开发包,目前已有CJAVAPython等;MQTT可以在带宽受限的不可靠通信网络实现数据在数据生产者和使用者间有效传输。
本文研究MQTTArduino单片机开发板上的实现,描述MQTT实现传感数据网络传输的原理、组成和方法。MQTT建立在Arduino上。消息生产者与接收者之间保持低耦合性。
2.发布/订阅消息传递机制
发布/订阅(Publish/subscribepub/sub)是一种消息范式,在这种机制下,多个发布应用(消息生产者)和多个订阅应用(消息消费者)通过建立在代理服务中的特定主题作为中介互相通信。生产者与消费者间不需要通过TCP建立直接的通信连接,发布的消息进入一个先
入先出的队列;订阅者对一个或多个类别表达兴趣,于是只接收感兴趣的消息,而不需要知道什么样的发布者发布的消息。这种发布者和订阅者的解耦解耦可以允许更好的可扩放性和更为动态的网络拓扑。
在发布/订阅模型中,订阅者通常接收所有发布的消息的一个子集。选择接受和处理的消息的过程被称作过滤。有两种常用的过滤形式:基于主题(例如:MQTT)和基于内容。在基于主题的系统中,发布者发布消息到一个中间的消息代理,命名一个主题或通道上(图2)。然后,订阅者向该消息代理注册订阅,由消息代理来进行过滤。订阅者将收到其订阅的主题上的所有消息,并且所有订阅同一主题的订阅者将接收到同样的消息。发布者负责定义订阅者所订阅的消息类别。消息代理通常执行存储转发的功能将消息从发布者发送到订阅者。
与点对点模型不同,使用发布/订阅模型发布到一个主题的消息,能够由多个订阅者所接收。有时候,也称这项技术为广播(broad-casting)消息。每个订阅者都会接收到每条消息的一个副本。总地来说,发布/订阅消息传送模型基本上是一个基于推送(push)的模型,其中消息自动地向消费者广播,它们无须请求或轮询主题来获得新消息。在发布/订阅消息传送模型内部,有多种不同类型的订阅者。非持久订阅者是临时订阅类型,它们只是在主动侦听主
题时才接收消息。而另一方面,持久订阅者将接收到发布的每条消息的一个副本,即便在发布消息,它们处于离线状态时也是如此。
3.基于Arduino UNOMQTT实现
3.1 支持TCPIPArduino开发板:Arduino UNO单片机板+TCPIP以太网接口板
Arduino是一个开源电子平台,板载AVRARM等单片机,使用Arduino编程语言编程,类似于C编程语言。可加载库文件所提供的类和函数提供对外围器件和通信接口的支持,库文件用C++编写。借助这个平台,物联网技术开发者可以快速验证和在实验室部署连接传感器和执行器的应用。Arduino代码主要由二部分组成:setup )和loop ),前者在程序启动后运行一次,后者在余下的时间循环运行,直至被复位。
本文中使用Arduino硬件由二部分组成:Arduino UNO单片机板和W5100 TCPIP以太网接口板(图3)。Arduino UNO是一块8AVR单片机,负责驱动传感器、执行器,经由SPI接口连接到内置了TCPIP协议的W5100以太网接口板,连接互联网和交互数据。MQTT服务器提供代理服务,介于发布与订阅者之间。
3.2 MQTT代理服务器(MQTT Broker Server
如表1所示,MQTT代理是运行MQTT协议的服务器,是介于MQTT客户端(例如:远程传感节点等装置)和企业数据集层二者间的中介通信。IBM等公司开发了商用MQTT代理服务,另有一些开源公共平台供MQTT开发者研究和测试。Mosquitto是一个开放源代码的MQTT代理服务器,支持CC++Python语言开发。
MQTT从低到高确定了三种服务质量等级:QoS 0QoS 1QoS 2。等级越高,意味需要更多的系统开销,通信效率受影响越多。
3.3 MQTT客户端在Arduino上的实现
Arduino上的客户端实现一个周期性的数据发布,通过一个库提供MQTT客户端的类与函数。这个库包含Arduino下相应代码和功能——连接、发布、订阅等。在下面这个简单的示例中,首先依次初始化以太网、TCPIP协议和MQTT协议建立连接,然后,周期性地向代理服务器发布消息。这个案例支持QoS等级为0,可设置最大消息长度和心跳间隔时间,默认值分别为128字节和15秒。Arduino设备使用MQTT协议发布消息到代理的某一个主题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。