基于 ESP8266WiFi 模块和 MQTT 协议的物联网传感节点设计
扫描二维码
随时随地手机看文章
0 引 言
随着物联网技术日趋成熟,物联网已被广泛应用在医疗、交通与物流、能源与公用事业、零售业等领域 [1]。据思科公司(Cisco)思科视觉化网络指数显示,到 2022 年全球有超过半数设备和连接将会是机器对机器(M2M)的互联,比2017 年增加 34%。智能音箱、固定设备、移动设备及其他物件的连接数将从 2017 年的 61 亿增至 2022 年的 146 亿 [2]。互联设备的数量和类型越来越多,应用环境日趋复杂,实现资源有限或带宽有限环境下的传感器联网和保证传感数据的可靠传输成为物联网技术应用应重点考虑的问题之一。
物联网传感节点作为物联网和物理世界交互的边界节点,负责信息的采集和简单处理,与将数据传输到应用层进行数据分析和处理 [3]。传感器节点的通信方式主要分为近距离通信和远距离通信,传感器节点之间一般采用短距离无线通信,如蓝牙,ZigBee,WiFi等 ;传感器与物联网云服务器或应用服务器采用远距离通信,如固网、移动网络
(2G/3G/4G)、NB-IoT网络等。无线网络连接类型(WiFi、移动网络)是主流。现在越来越多的应用场合要求传感器节点自带接入网关,即支持物联网网络接入服务。由于传感器节点资源有限,受 CPU处理能力、内存等限制,通常在LwIP协议栈上采用轻量级物联网传输协议。目前,应用最广泛的物联网标准传输协议包括 MQTT、CoAP。MQTT是一种在 TCP/IP协议上的基于订阅 /发布模式的轻量级传输协议, 适用于引入第三方云平台的物联网应用。CoAP 即约束应用协议,类似 HTTP,是一种文档传输协议,也是一种基于请求 / 响应的客户端 / 服务器端轻量级 UDP 传输协议,适合将物联网应用嵌入到现有 Web 服务器中 [4]。
本文基于 ESP8266 WiFi 模块和 MQTT 协议设计了一种低成本物联网传感节点,以 ESP8266 嵌入式处理器为核心,采用 AM2302 传感器采集温湿度数据,进行简单处理后将传感数据通过 MQTT 协议发布到百度天工物联网云平台IoTHub。数据采集中心采用 Visual C# 实现,能自动识别传感节点和订购传感器的数据,可保存、处理和显示传感节点的温湿度数据。数据采集中心可通过云平台 IoTHub 下发命令,实现传感器节点参数配置并让传感节点执行指定操作(打开/ 关闭继电器)。传感器节点性能可靠,扩展性强,通用性好。
1 系统总体结构
系统由传感节点、数据采集中心和百度天工物联网云平台组成,如图 1 所示。传器节点由ESP8266 和 AM2302 构成, 实现温湿度的采集和上报 ;数据采集中心基于 Visual C# 开发,实现传感数据的接收、存储、分析和显示 ;百度天工物联网云平台 IoTHub 作为 MQTT 消息代理,负责主题订阅管理、消息转发和缓冲,实现传感节点与数据采集中心的信息交互。传感节点与数据采集中心的交互数据类型为 JSON 格式。
2 传感节点设计
传感节点负责采集感知对象相关信息,并通过相应的通信模块将数据通过 MQTT 消息代理推送到远端数据采集中心。
2.1 硬件设计
传感节点以 ESP8266EX WiFi 模块为核心,通过 I/O 外接传感器 AM2302 及其他设备。传感节点硬件框图如图 2 所示。
ESP8266 WiFi 模块集成了一 ESP826EX 芯片和一 4 MB SPI FLASH,带有 PCB WiFi 天线,支持三种 WiFi 工作模式(SoftAP,Station,SoftAP+Station)。ESP826EX 拥有完整的 WiFi 功能,内嵌 Tensilica’s L106 32 位内核处理器,CPU 时钟速度为 80 MHz,最高可支持 160 MHz,集成片上 SRAM, 可独立作为 MCU 并通过 I/O 外接传感器实现物联网应用。ESP8266 WiFi 模块支持 IEEE802.11 b/g/n 无线标准与 IPv4, TCP/UDP/HTTP/MQTT 等协议 [5]。AM2302 是一款含有已校准数字信号输出的温湿度复合传感器,它包括一个电容式感湿元件和一个高精度 NTC 测温元件。AM2302 的温度测量精度为 1 ℃,湿度测量精度在 5% 以内 [6]。AM2302 与ESP8266EX 通过单总线协议通信,占用一个 GPIO 端口。
2.2 软件设计
传感节点软件基于 NodeMCU 固件开发。NodeMCU 固件使用 Lua 脚本语言编程,在乐鑫 ESP8266 Non-OS SDK 上开发而来。NodeMCU 固件封装了 ESP8266 硬件操作的应用编程接口函数 API,同时还提供 I2C,SPI,UART 等外设总线驱动函数及 OLED/TFT 显示驱动、各种类型传感器驱动、网络协议库(TCP/UDP,HTTP,MQTT 等),开发者无需了解底层硬件驱动即可快速开发应用。传感节点程序主要通过数据采集模块、MQTT 客户端和网络连接模块实现。数据采集模块负责定时读取温湿度数据 ;MQTT 客户端负责维护与MQTT 消息代理 IoTHub 的连接、发布传感数据、接收并响应数据采集中心的命令 ;网络连接模块负责 WiFi 连接。系统软件主流程如图 3 所示。
2.2.1 数据采集模块
数据采集模块创建了一个 tmr 定时器,周期调用 dht 库的 read()函数读取温湿度数据,再使用 string.format 函数将温湿度数据转换为 JSON 格式。读取传感器数据代码 :
pin = pin or 2
status,temp,humi,temp_dec,humi_dec = dht.read(pin)
将温湿度转换为 JSON 格式代码 :
topicmsg='{"reported" :{"time" :"%d","temperature" :%0.2f,
"humidity" : %0.1f}}'
msg = string.format(topicmsg,rtctime.get(),temp,humi)
2.2.2 MQTT客户端
传感节点和数据采集中心基于订购 / 发布机制的 MQTT 协议通信进行信息交互。传感节点和数据采集中心作为MQTT 客户端,百度 IoTHub 云平台作为 MQTT 代理。消息的发布和订购基于主题(topic)进行。MQTT 代理负责管理订阅关系或缓存消息(保留标志为真的消息),将消息转发给已订阅主题的 MQTT 客户端。为了实现传感节点与数据采集中心的数据交互,两者发布与订阅的主题见表 1 所列。
传感节点 MQTT 客户端初始化代码如下 :
msghandler 为订购消息处理函数,用于解析和处理从数据采集中心收到的 JSON 格式数据。JSON 数据采用键(key) 值(value)对结构,key 可用来表示消息类型,value 为消息内容。JSON 格式数据用 sjson 模块的 decode()函数解析成 table 表格数据。传感节点调用 publish 函数向某个主题发布消息, 语法 :mqtt :publish(topic,payload,qos,retain[,function(client)])。topic 是发布的主题 ;payload 为将发布的消息 ;qos 为QoS 服务质量 ;0 表示只发送最多一次便可送达,1 表示至少一次可送达,2 表示一次便到达 ;Retain 为保留标志,指示服务端是否需要存储当前消息 ;function(client) 为消息发布成功回调函数,在收到代理发布确认 PUBACK 消息后执行函数。
3 数据采集中心设计
数据采集中心负责传感节点的管理及传感数据的显示, 其中传感节点管理包括节点自动识别、节点主题订阅、节点控制等。数据采集中心与传感节点通过 MQTT 协议的订购 / 发布机制进行异步通信,两者不必知道对方的 IP 地址,所有消息均通过 MQTT 消息代理转发。数据采集中心识别传感节点流程如图 4 所示。传感节点上线时向主题 $baidu/iot/ general/data/id/status 发布保留标志为真的消息“online”,离线时通过最后遗嘱(Last Will)发布离线消息“offline”。数据采集中心连接到 MQTT 消息代理 IoTHub, 在订阅主题$baidu/iot/general/data/+/status 后,会收到所有传感节点的状态消息,从消息主题解析出节点 ID(+ 通配符所对应的字段),如果是新节点,则先添加节点再更新状态,否则直接更新节点状态。
数据采集中心订购传感节点主题 $baidu/iot/general/data/ id/data 后, 当传感节点向此主题发布消息时, 消息代理IoTHub 将会把消息转发给数据采集中心。数据采集中心收到传感节点数据后,解析 JSON 格式消息获得消息的数据类型。如果是传感数据,则存储后显示 ;如果是传感节点配置信息,则存储到节点信息。信息处理流程如图 5 所示。
数据采集中心界面如图 6 所示。界面上部分显示节点列表及最新的节点传感数据,下部分显示节点数据曲线图。
4 结 语
本文设计了基于 MQTT 协议的物联网传感节点,采用ESP8266WiFi 模块 + 传感器采集数据与 NodeMCU 物联网平台的 MQTT 模块实现传感节点与数据采集中心交互,数据采集中心采用 Visual C# + MQTTnet 库实现传感节点的自动识别与控制、传感节点数据的存储与显示。系统运行稳定,扩展性强,搭配不同传感器就能实现特定的物联网传感节点。