《用于物联网的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
相关文章
|
4月前
|
数据采集 人工智能 安全
数据治理的实践与挑战:大型案例解析
在当今数字化时代,数据已成为企业运营和决策的核心资源。然而,随着数据量的爆炸性增长和数据来源的多样化,数据治理成为了企业面临的重要挑战之一。本文将通过几个大型案例,探讨数据治理的实践、成效以及面临的挑战。
数据治理的实践与挑战:大型案例解析
|
2月前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
282 75
|
5月前
|
消息中间件 Java Apache
RocketMQ消息回溯实践与解析
在分布式系统和高并发应用的开发中,消息队列扮演着至关重要的角色,而RocketMQ作为阿里巴巴开源的一款高性能消息中间件,以其高吞吐量、高可用性和灵活的配置能力,在业界得到了广泛应用。本文将围绕RocketMQ的消息回溯功能进行实践与解析,分享工作学习中的技术干货。
107 4
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
|
2月前
|
存储 监控 调度
云服务器成本优化深度解析与实战案例
本文深入探讨了云服务器成本优化的策略与实践,涵盖基本原则、具体策略及案例分析。基本原则包括以实际需求为导向、动态调整资源、成本控制为核心。具体策略涉及选择合适计费模式、优化资源配置、存储与网络配置、实施资源监控与审计、应用性能优化、利用优惠政策及考虑多云策略。文章还通过电商、制造企业和初创团队的实际案例,展示了云服务器成本优化的有效性,最后展望了未来的发展趋势,包括智能化优化、多云管理和绿色节能。
|
3月前
|
消息中间件 存储 Java
RocketMQ文件刷盘机制深度解析与Java模拟实现
【11月更文挑战第22天】在现代分布式系统中,消息队列(Message Queue, MQ)作为一种重要的中间件,扮演着连接不同服务、实现异步通信和消息解耦的关键角色。Apache RocketMQ作为一款高性能的分布式消息中间件,广泛应用于实时数据流处理、日志流处理等场景。为了保证消息的可靠性,RocketMQ引入了一种称为“刷盘”的机制,将消息从内存写入到磁盘中,确保消息持久化。本文将从底层原理、业务场景、概念、功能点等方面深入解析RocketMQ的文件刷盘机制,并使用Java模拟实现类似的功能。
73 3
|
3月前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
3月前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
131 6
|
4月前
|
网络协议 物联网 网络性能优化
物联网协议比较 MQTT CoAP RESTful/HTTP XMPP
【10月更文挑战第18天】本文介绍了物联网领域中四种主要的通信协议:MQTT、CoAP、RESTful/HTTP和XMPP,分别从其特点、应用场景及优缺点进行了详细对比,并提供了简单的示例代码。适合开发者根据具体需求选择合适的协议。
111 5
|
4月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
44 1

相关产品

  • 物联网平台
  • 推荐镜像

    更多