NodeMCU/ESP8266通过HTTPS POST向Azure IoT传数据遇阻求助
NodeMCU Lua对接Azure IoT Hub HTTPS POST故障排查方案
我之前在做NodeMCU Lua对接Azure IoT Hub的项目时,正好碰到过和你一模一样的HTTPS POST失败问题!结合你说的情况——HTTP给UbiDots能成,Azure就不行,大概率是HTTPS相关的几个细节没踩对,给你梳理下最容易出问题的点:
1. 导入Azure IoT Hub的根证书
Azure IoT Hub使用DigiCert的全球根证书,NodeMCU的HTTPS客户端默认不会内置这个证书,所以必须手动添加,否则会触发SSL证书验证失败。
你可以把下面的证书内容转成Lua字符串,在请求时指定:
local digicert_root_cert = [[ -----BEGIN CERTIFICATE----- MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG 9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97 nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt 43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4 gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg 06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4= -----END CERTIFICATE----- ]]
然后在http.post请求里加上ssl_params参数指定证书:
local iot_hub_url = "https://你的IoT Hub名称.azure-devices.net/devices/你的设备ID/messages/events?api-version=2020-09-30" local auth_header = "SharedAccessSignature sr=你的IoT Hub名称.azure-devices.net%2Fdevices%2F你的设备ID&sig=你的SAS令牌&se=过期时间戳" http.post( iot_hub_url, { ["Content-Type"] = "application/json", ["Authorization"] = auth_header }, '{"temperature": 25.3, "humidity": 62}', -- 你的传感器数据JSON function(code, data) if code < 0 then print("HTTPS请求失败,错误码:" .. code) else print("请求成功,状态码:" .. code) print("响应内容:" .. data) end end, { ssl_params = { caCert = digicert_root_cert } } )
2. 严格检查SAS令牌格式
Azure对SAS令牌的格式要求非常严格,几个坑点要注意:
sr参数必须是URL编码后的IoT Hub和设备ID组合,比如你的IoT Hub名称.azure-devices.net%2Fdevices%2F你的设备ID,别直接用未编码的字符串se是Unix时间戳(秒数),确保令牌未过期- Authorization头必须是
SharedAccessSignature(注意后面有空格)加上完整的SAS字符串,别漏了空格
3. 确认NodeMCU固件支持HTTPS
很多精简版的NodeMCU固件没有编译ssl模块,导致HTTPS请求直接失败。你需要用NodeMCU定制工具(本地或在线)重新编译固件,确保勾选了ssl、http、net这些必备模块。
4. 验证请求URL的正确性
Azure IoT Hub的HTTPS消息上传URL格式必须严格遵循:
https://{IoT Hub名称}.azure-devices.net/devices/{设备ID}/messages/events?api-version=2020-09-30
注意api-version要使用当前支持的稳定版本(比如2020-09-30),太旧的版本会被Azure拒绝。
5. 增加调试输出定位问题
在代码里加上调试打印,把URL、Authorization头、错误码都输出来,方便排查:
print("请求URL:" .. iot_hub_url) print("Authorization头:" .. auth_header)
常见错误码对应的问题:
-6:SSL证书验证失败(大概率是没加根证书)-2:连接超时(可能URL错误或网络问题)401:SAS令牌无效(格式错误或过期)
按上面的步骤逐一排查,应该就能解决你的HTTPS POST问题了!
内容的提问来源于stack exchange,提问作者user37998
相关产品推荐
相关产品推荐

