ESP8266上MicroPython的HTTPS GET请求失败求助
解决ESP8266 MicroPython HTTPS请求失败问题
问题分析
ENOTCONN错误大多是WiFi连接未完全建立(即便isconnected()返回True,实际网络链路可能不通);ECONNABORTED则是HTTPS握手失败——ESP8266的MicroPython默认固件可能缺少Telegram API对应的根证书,或是SSL版本不兼容导致的。
解决方案
1. 升级固件到最新稳定版
你当前使用的是2022年6月的v1.19.1固件,MicroPython后续版本修复了不少ESP8266的SSL相关bug,建议下载官方最新的ESP8266标准版固件(带SSL支持)重新刷入。
2. 优化WiFi连接逻辑
原代码的连接函数没有超时机制,容易出现"假连接",修改为带超时的可靠连接逻辑:
def connect_wifi(wlan, ssid, password, timeout=10): import time if wlan.isconnected(): print(f"已连接: {wlan.ifconfig()}") return True print("\n正在连接WiFi...") wlan.connect(ssid, password) start_time = time.time() while not wlan.isconnected(): if time.time() - start_time > timeout: print("WiFi连接超时") return False time.sleep(0.5) print(f"WiFi已连接: {wlan.ifconfig()}") return True
调用后需确认返回值为True,再发起网络请求。
3. 为HTTPS请求添加根证书
Telegram API使用DigiCert Global Root G2根证书,需将该证书的PEM内容加入代码,建立SSL连接时指定:
import network import socket import ussl # DigiCert Global Root G2根证书PEM内容 CA_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----- """ WIFI_SSID = "***********" WIFI_PW = "************" wlan = network.WLAN(network.STA_IF) wlan.active(True) if connect_wifi(wlan, WIFI_SSID, WIFI_PW): # 自定义HTTPS请求逻辑 url = "https://api.telegram.org/bot*****:***********/sendMessage?text=Klingel&chat_id=*****" _, _, host, path = url.split('/', 3) path = '/' + path addr = socket.getaddrinfo(host, 443)[0][-1] s = socket.socket() s.connect(addr) # 包装SSL套接字,指定根证书和主机名 s = ussl.wrap_socket(s, server_hostname=host, ca_certs=CA_CERT) # 发送GET请求 s.write(f"GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n") # 读取响应 response = s.read() s.close() print(response.decode())
4. 替换兼容的urequests版本
部分第三方urequests版本对ESP8266的SSL支持不佳,建议使用MicroPython官方仓库的urequests实现,确保版本支持传入SSL上下文参数。
关键注意事项
- ESP8266内存有限,硬编码证书时仅保留必要的根证书内容
- SSL握手需要稳定的WiFi信号,避免因丢包导致握手失败
- 可先测试访问
https://httpbin.org/get验证HTTPS请求是否正常
内容的提问来源于stack exchange,提问作者heyeck
相关产品推荐
相关产品推荐

