《用于物联网的Arduino项目开发:实用案例解析》—— 3.3 MQTT

简介: MQTT是一个轻量级的机器对机器的协议。它采用的是发布者-订阅者模型,就是说由一个发布者把数据发布给服务器(也叫作代理),然后订阅者就能收到这个数据。发布者和订阅者彼此互不相识,但他们都连接在代理上,代理异步地完成这个通信。

本节书摘来自华章出版社《用于物联网的Arduino项目开发:实用案例解析》一 书中的第3章,第3.3节,作者[美]安德尔·杰韦德(Adeel Javed),更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 MQTT

MQTT是一个轻量级的机器对机器的协议。它采用的是发布者-订阅者模型,就是说由一个发布者把数据发布给服务器(也叫作代理),然后订阅者就能收到这个数据。发布者和订阅者彼此互不相识,但他们都连接在代理上,代理异步地完成这个通信。
代理用话题的概念来通知所有的订阅者相关的数据已经发布这一消息。话题就像新闻推送,你可以订阅某些想要接收的新闻的话题。发布者和订阅者可以是传感器、机器或移动应用。图3-4是MQTT协议的高层概览。
理解MQTT协议对于构建物联网应用是很重要的,接下来,看几个场景来进一步理解MQTT。

3.3.1 入侵检测系统

图3-5为一个简单的入侵检测系统,包括三个部件:检测入侵发布数据的运动传感器、接收这个数据通知用户的移动应用,以及MQTT代理上的一个话题。

21a11122315f5198eb7d1cfae5b011a7789778d1

传感器一检测到入侵,就会作为发布者向MQTT代理商的codifythings/intrusion-Detected话题发布新的消息。MQTT代理会把这个消息加到话题中。移动应用可以订阅codifythings/intrusionDetected话题,当有新的消息被发布到这个话题时,它就会得到通知,继而可以通知用户。第6章将构建一个这样的系统。

3.3.2 远程灯光控制

MQTT另一种很棒的用处是为各种类型的设备开发遥控器,比如做一个灯光控制应用。如图3-6所示,一个遥控应用也是由三个部分组成,不过和上一个例子相比,前两个部件的顺序交换了一下。也就是说,首先是移动应用,它的用户可以控制灯光的开关,然后是连着灯光的设备,第三个部分是MQTT代理商的一个话题。
用户与移动应用交互来开灯或关灯,无论做哪种动作,移动应用就会给MQTT代理商的codifythings/lightsControl话题发布一条消息。MQTT代理会把这个消息加到话题中。连接到实际的灯的设备可以订阅codifythings/intrusionDetected话题,当有新的消息被发布到这个话题时,它就会得到通知,继而可以开关灯光。第8章将构建一个这样的遥控器。

7098a3c62aea5c4fbab8c362c7296246969c65a9

所需的硬件、软件和电路,请阅读2.3节。

3.3.3 代码(Arduino)

接下来,我们来写用WiFi将Arduino和互联网相连,并通过MQTT协议发布数据给服务器的代码。
启动Arduino IDE,输入下面的代码,或者从本书的网站下载代码文件然后打开。所有的文件都在单个源文件(*.ino)中,不过为了便于理解和重用,这个代码被分成以下四个部分:

  • 外部库
  • 互联网连接(无线)
  • 数据发布(MQTT)
  • 数据订阅(MQTT)

外部库

程序3-6给出了代码的第一部分,引入了运行代码所需的全部外部库。这个程序主要有两个依赖。为了实现互联网连接,需要包含(假设用的是WiFi盾板),而为了实现与MQTT代理的通信,需要包含。

92a3b1150fa42524b87f14c1d4217e5a1d7f874b

互联网连接(无线)

代码的第二部分定义了连接互联网要用的变量、常量和函数。在这里使用了程序2-7、程序2-8和程序2-9中的代码。
MQTT的数据发布和订阅
代码的第三部分定义了将来向MQTT代理发布和订阅要用到的变量、常量和函数。这个代码会发布和订阅同一个话题。
程序3-7首先定义了要Arduino连接的MQTT代理的地址和端口(默认为1883)。topic变量定义了在代理上发布和订阅所用的话题。如果你的电脑上没有安装MQTT代理,可以使用Eclipse基金会设立的公共MQTT代理(iot.eclipse.org)或Mosquitto(test.mosquitto.org)。

fbf0b62187ba8d99e2ac42ca8366e70c52771dfa

如程序3-8所示来初始化MQTT客户端。callback()函数把从代理收到的消息内容的细节封装了起来。

de3b392e86e7e5c2bbb7b7983a5695a44a05e045

标准函数

最后,程序3-9是代码的最后一部分,实现了Arduino标准函数setup()和loop()。
在setup()函数中,代码初始化串口,然后连接到互联网。如果连上了MQTT代理,就订阅codifythings/testMessage话题。一旦订阅成功,代码就向codifythings/testMessage话题发布一条新消息。代码订阅了它所发布的同一个话题,所以消息一发布出去,callback()函数就会被调用。loop()函数只是等待MQTT代理来的新消息。

0181828a6cac5dc996f612d3a76ea945bf1a4a78

这样,Arduino代码就完成了。

3.3.4 最终的作品

要测试这个应用,按照第1章所介绍的,校验然后上传代码到Arduino。代码上传后,打开串口监视器会看到如图3-7所示的日志消息。

7cd1caf5577a78f1806bf6b9f893435a39e5d564
相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
1月前
|
缓存 网络协议 Linux
DNS解析工具使用案例
关于如何在Windows和Linux操作系统下使用DNS解析工具的案例,包括查看和清空DNS缓存、使用whois查询工具以及安装和使用dig工具进行DNS记录查询。
19 2
DNS解析工具使用案例
|
2月前
|
人工智能 PyTorch 算法框架/工具
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
【8月更文挑战第6天】Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
Xinference实战指南:全面解析LLM大模型部署流程,携手Dify打造高效AI应用实践案例,加速AI项目落地进程
|
1月前
|
网络协议 物联网 网络性能优化
物联网江湖风云变幻!MQTT CoAP RESTful/HTTP XMPP四大门派谁主沉浮?
【9月更文挑战第3天】物联网(IoT)的兴起催生了多种通信协议,如MQTT、CoAP、RESTful/HTTP和XMPP,各自适用于不同场景。本文将对比这些协议的特点、优缺点,并提供示例代码。MQTT轻量级且支持QoS,适合大规模部署;CoAP基于UDP,适用于低功耗网络;RESTful/HTTP易于集成但不适合资源受限设备;XMPP支持双向通信,适合复杂交互应用。通过本文,开发者可更好地选择合适的物联网通信协议。
27 2
|
2月前
|
JavaScript 前端开发 UED
Javaweb之javascript的小案例的详细解析
通过上述步骤,我们得到了一个动态更新的实时时钟,这个简单的JavaScript案例展示了定时器的使用方法,并讲解了如何处理日期和时间。这个案例说明了JavaScript在网页中添加动态内容与交互的能力。对于涉足JavaWeb开发的学习者来说,理解和运用这些基础知识非常重要。
36 11
|
2月前
|
网络协议 物联网 网络性能优化
物联网江湖风云变幻!MQTT CoAP RESTful/HTTP XMPP四大门派谁主沉浮?
【8月更文挑战第14天】本文概览了MQTT、CoAP、RESTful/HTTP及XMPP四种物联网通信协议。MQTT采用发布/订阅模式,轻量高效;CoAP针对资源受限设备,基于UDP,低延迟;RESTful/HTTP易于集成现有Web基础设施;XMPP支持双向通信,扩展性强。每种协议均附有示例代码,助您根据不同场景和设备特性作出最佳选择。
27 5
|
2月前
|
JSON 数据管理 关系型数据库
【Dataphin V3.9】颠覆你的数据管理体验!API数据源接入与集成优化,如何让企业轻松驾驭海量异构数据,实现数据价值最大化?全面解析、实战案例、专业指导,带你解锁数据整合新技能!
【8月更文挑战第15天】随着大数据技术的发展,企业对数据处理的需求不断增长。Dataphin V3.9 版本提供更灵活的数据源接入和高效 API 集成能力,支持 MySQL、Oracle、Hive 等多种数据源,增强 RESTful 和 SOAP API 支持,简化外部数据服务集成。例如,可轻松从 RESTful API 获取销售数据并存储分析。此外,Dataphin V3.9 还提供数据同步工具和丰富的数据治理功能,确保数据质量和一致性,助力企业最大化数据价值。
114 1
|
2月前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
49 0
|
2月前
|
开发者
告别繁琐代码,JSF标签库带你走进高效开发的新时代!
【8月更文挑战第31天】JSF(JavaServer Faces)标准标签库为页面开发提供了大量组件标签,如`<h:inputText>`、`<h:dataTable>`等,简化代码、提升效率并确保稳定性。本文通过示例展示如何使用这些标签实现常见功能,如创建登录表单和展示数据列表,帮助开发者更高效地进行Web应用开发。
30 0
|
2月前
|
UED 存储 自然语言处理
【语言无界·体验无疆】解锁Vaadin应用全球化秘籍:从代码到文化,让你的应用畅游世界每一个角落!
【8月更文挑战第31天】《国际化与本地化实战:构建多语言支持的Vaadin应用》详细介绍了如何使用Vaadin框架实现应用的国际化和本地化,提升用户体验和市场竞争力。文章涵盖资源文件的创建与管理、消息绑定与动态加载、日期和数字格式化及文化敏感性处理等方面,通过具体示例代码和最佳实践,帮助开发者构建适应不同语言和地区设置的Vaadin应用。通过这些步骤,您的应用将更加灵活,满足全球用户需求。
35 0
|
2月前
|
前端开发 API 开发者
【React状态管理新思路】Context API入门:从零开始摆脱props钻孔的优雅之道,全面解析与实战案例分享!
【8月更文挑战第31天】React 的 Context API 有效解决了多级组件间状态传递的 "props 钻孔" 问题,使代码更简洁、易维护。本文通过电子商务网站登录状态管理案例,详细介绍了 Context API 的使用方法,包括创建、提供及消费 Context,以及处理多个 Context 的场景,适合各水平开发者学习与应用,提高开发效率和代码质量。
25 0

相关产品

  • 物联网平台
  • 推荐镜像

    更多
    下一篇
    无影云桌面