本示例将演示如何通过 基于 ESP8266 的 NodeMCU,把通过 DHT11 传感器搜集到的温、湿度数据通过 MQTT 协议将其上报到云端的 MQTT 服务,并且展示应用端如何订阅到这些数据并对之进行处理的过程。本文使用 MQTT 协议的原因在于该协议比较轻量级,节约能耗,非常适合于物联网的相关使用场景;目前各大公有云云提供商基本上都开放了基于 MQTT 协议的 IoT Hub 服务。比如 AWS 的 IoT Core,以及 Azure 的 IoT Hub 等,通过 MQTT 协议可以非常方便的将这些数据直接接入这些公有云服务。
本示例的总体架构如下
配置
硬件配置
- NodeMCU board x 1:NodeMCU 是一个开源的 IoT (硬件)开发平台,NodeMCU 包含了可以运行在 ESP8266 Wi-Fi SoC芯片之上的固件,以及基于 ESP-12 模组的硬件。“NodeMCU” 缺省一般指的是固件,而不是开发套件。固件使用 Lua 脚本语言。
- DHT11 temperature/humidity sensor x 1:DHT11 数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器
- 面包板(Breadboard )x 1
- 跳线(Jumper wires)若干
- 连接图(Connection Graph)请参考如下截图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lje8W4Il-1609230292970)(https://static.emqx.net/images/ab1d6dee2e4870a45ada34fb584f8328.png)]
Arduino 配置
- 下载并安装 CH340G USB 驱动
- 安装 ESP8266模块
- 安装 PubSubClient 库 (by Nick O’Leary)
Sketch -> Include Library -> Manage Libraries… -> Type PubSub in Search field -> Install
MQTT 云服务配置
在本文中我们选用由 EMQ X Cloud 提供的公共 MQTT Broker 服务作为 broker 接入地址,broker 接入信息如下:
- Broker: broker.emqx.io
- TCP Port: 1883
- Websocket Port: 8083
ESP8266 代码编写
-
首先我们将导入 ESP8266WiFi 和 PubSubClient 库,ESP8266WiFi 库能够将 ESP8266 连接到 Wi-Fi 网络,PubSubClient 库能使 ESP8266 连接到 MQTT 服务器发布消息及订阅主题。
#include <ESP8266WiFi.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include "DHT.h"
-
设置 Wi-Fi 名称和密码,以及 MQTT 服务器连接地址和端口
// WiFi const char *ssid = "mousse"; // Enter your WiFi name const char *password = "qweqweqwe"; // Enter WiFi password const char *mqtt_broker = "broker.emqx.io"; const char *topic = "temp_hum/emqx"; const char *mqtt_username = "emqx"; const char *mqtt_password = "public"; const int mqtt_port = 1883;
-
打开一个串行连接,以便于输出程序的结果并且连接到 Wi-Fi 网络
// Set software serial baud to 115200; Serial.begin(115200); // connecting to a WiFi network WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.println("Connecting to WiFi.."); }
-
设置 MQTT Broker 信息
//connecting to a mqtt broker client.setServer(mqtt_broker, mqtt_port)