You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:25:51