ESP8266(NodeMCU)连接Azure IoT Hub的技术实现咨询
ESP8266(NodeMCU) 连接 Azure IoT Hub 完整指南
前置准备工作
- 在Azure门户创建IoT Hub实例:选择适合的定价层(免费层F1足够原型测试),完成创建后记录IoT Hub的主机名。
- 注册ESP8266设备:进入IoT Hub的「设备」面板,点击「添加设备」,填写设备ID,选择认证类型(默认对称密钥),完成后复制生成的设备连接字符串(格式:
HostName={YourIoTHubName}.azure-devices.net;DeviceId={YourDeviceId};SharedAccessKey={YourSharedKey})。
1. ESP8266 在 Azure IoT Hub 的认证与注册方法
目前主流有两种认证方式:
- 对称密钥认证(推荐原型使用)
注册设备时Azure自动生成主/辅助对称密钥,设备通过包含密钥的连接字符串完成身份验证,无需额外证书配置,适合快速搭建原型。 - X.509证书认证(生产环境推荐)
需为设备生成X.509证书,将根CA证书或设备证书上传至IoT Hub,设备通过证书完成TLS握手认证,安全性更高,适合大规模设备部署场景,避免密钥泄露风险。
2. 推荐的连接库
- Azure IoT Hub Arduino Library
官方封装的Arduino适配库,支持MQTT协议,内置SAS令牌生成、连接管理逻辑,无需手动处理复杂的认证细节,上手最快。 - PubSubClient
轻量级MQTT客户端库,内存占用低,适合资源有限的ESP8266。需自行实现Azure IoT Hub的SAS令牌生成逻辑,灵活性更高。 - Azure IoT C SDK
官方原生C SDK,支持MQTT/AMQP/HTTP三种协议,可直接移植到ESP8266,适合需要深度定制的场景。
3. 遥测数据上传示例代码(Arduino IDE环境)
前置依赖安装
在Arduino IDE库管理器中安装以下库:
- Azure IoT Hub
- DHT sensor library
- Adafruit Unified Sensor
- BH1750
示例代码
#include <ESP8266WiFi.h> #include <AzureIoTHub.h> #include <AzureIoTProtocol_MQTT.h> #include <DHT.h> #include <BH1750.h> // WiFi配置 const char* ssid = "YourWiFiSSID"; const char* password = "YourWiFiPassword"; // Azure IoT Hub设备连接字符串 const char* connectionString = "HostName=YourIoTHub.azure-devices.net;DeviceId=YourDeviceId;SharedAccessKey=YourSharedKey"; // 传感器初始化 #define DHTPIN D4 #define DHTTYPE DHT11 DHT dht(DHTPIN, DHTTYPE); BH1750 lightMeter; // Azure IoT客户端 AzureIoTHubClient client(connectionString, AzureIoTProtocol_MQTT); void setup() { Serial.begin(115200); // 连接WiFi WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("WiFi connected"); // 初始化传感器 dht.begin(); if (!lightMeter.begin()) { Serial.println("Failed to initialize BH1750"); while (1); } // 连接Azure IoT Hub if (client.connect()) { Serial.println("Connected to Azure IoT Hub"); } else { Serial.println("Connection failed"); } } void loop() { // 读取传感器数据 float temperature = dht.readTemperature(); float humidity = dht.readHumidity(); float soilMoisture = analogRead(A0); // 土壤湿度传感器接A0引脚 float lightLevel = lightMeter.readLightLevel(); // 检查传感器数据有效性 if (isnan(temperature) || isnan(humidity)) { Serial.println("Failed to read from DHT sensor!"); delay(2000); return; } // 构造JSON格式遥测数据 String payload = "{\"temperature\":" + String(temperature) + ",\"humidity\":" + String(humidity) + ",\"soilMoisture\":" + String(soilMoisture) + ",\"lightLevel\":" + String(lightLevel) + "}"; // 发送数据到Azure IoT Hub if (client.sendEvent(payload.c_str())) { Serial.println("Telemetry sent successfully: " + payload); } else { Serial.println("Failed to send telemetry"); client.reconnect(); } delay(5000); // 每5秒发送一次数据 }
代码说明
- 替换
ssid、password为你的WiFi信息,connectionString为之前获取的设备连接字符串。 - 土壤湿度传感器模拟输出接ESP8266的A0引脚,可根据传感器特性调整数据处理逻辑。
- 代码中每5秒读取一次传感器数据,以JSON格式发送到Azure IoT Hub。
内容的提问来源于stack exchange,提问作者Tanish Sidana
相关产品推荐
相关产品推荐

