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

ESP32控制Telegram Bot无法发送消息的故障排查求助

ESP32 Telegram Bot无法发送消息的排查与解决建议

我正在开发基于ESP32的Telegram Bot控制程序,目标是在与Telegram成功建立连接后发送消息。已通过UniversalTelegramBot库完成ESP32与Telegram API的连接配置,但遇到Bot无法发送消息的问题。已确认ESP32与Telegram API的连接状态正常,且Bot Token和Chat ID均正确无误。

我的代码

#include "WiFi.h"
#include <WiFiClient.h>
#include "UniversalTelegramBot.h"
#include "EEPROM.h"

#define LENGTH(x) (strlen(x) + 1)
#define EEPROM_SIZE 200
#define WIFI_RESET 0
String ssid;
String password;
unsigned long millis_RESET;

#define BOT_TOKEN "YOUR_BOT_TOKEN"  // 替换为你的Bot Token
WiFiClient client;
UniversalTelegramBot bot(BOT_TOKEN, client);

void setup() {
    Serial.begin(115200);
    pinMode(WIFI_RESET, INPUT);
    if (!EEPROM.begin(EEPROM_SIZE)) {
        Serial.println("Failed to init EEPROM");
        delay(1000);
    } else {
        ssid = read_flash(0);
        Serial.print("SSID = ");
        Serial.println(ssid);
        password = read_flash(40);
        Serial.print("Password = ");
        Serial.println(password);
    }

    WiFi.begin(ssid.c_str(), password.c_str());

    delay(3500);

    if (WiFi.status() != WL_CONNECTED) {
        WiFi.mode(WIFI_AP_STA);
        WiFi.beginSmartConfig();

        Serial.println("Waiting for SmartConfig.");
        while (!WiFi.smartConfigDone()) {
            delay(500);
            Serial.print(".");
        }

        Serial.println("");
        Serial.println("SmartConfig received.");

        Serial.println("Waiting for WiFi");
        while (WiFi.status() != WL_CONNECTED) {
            delay(500);
            Serial.print(".");
        }

        Serial.println("WiFi Connected.");

        Serial.print("IP Address: ");
        Serial.println(WiFi.localIP());

        ssid = WiFi.SSID();
        password = WiFi.psk();
        Serial.print("SSID:");
        Serial.println(ssid);
        Serial.print("password:");
        Serial.println(password);
        Serial.println("Store SSID & password in Flash");
        write_flash(ssid.c_str(), 0);
        write_flash(password.c_str(), 40);
    } else {
        Serial.println("WiFi Connected");
    }

    // 尝试与Telegram Bot建立连接
    if (client.connect("api.telegram.org", 443)) {
        Serial.println("Bot Connected");
        // 发送连接成功消息到Telegram Bot
        String message = "Conexión exitosa. El dispositivo se ha conectado a Wi-Fi.";
        bot.sendMessage("YOUR_CHAT_ID", message);
        Serial.println("Prueba");
    } else {
        Serial.println("Failed to connect to Bot");
    }
}

void loop() {
    millis_RESET = millis();
    while (digitalRead(WIFI_RESET) == LOW) {
    }

    if (millis() - millis_RESET >= 5000) {
        Serial.println("Reseting the WiFi credentials");
        write_flash("", 0);
        write_flash("", 40);
        Serial.println("Wifi credentials erased");
        Serial.println("Restarting the ESP");
        delay(500);
        ESP.restart();
    }

    // 其余代码
}

void write_flash(const char* toStore, int startAddr) {
    int i = 0;
    for (; i < LENGTH(toStore); i++) {
        EEPROM.write(startAddr + i, toStore[i]);
    }
    EEPROM.write(startAddr + i, '\0');
    EEPROM.commit();
}

String read_flash(int startAddr) {
    char in[128];
    int i = 0;
    for (; i < 128; i++) {
        in[i] = EEPROM.read(startAddr + i);
    }
    return String(in);
}

解决建议

  • 改用HTTPS客户端:Telegram API仅支持HTTPS连接,原代码使用的WiFiClient是明文HTTP客户端,无法完成加密请求。替换为WiFiClientSecure并配置:

    WiFiClientSecure client;
    // 测试阶段可跳过证书验证(生产环境建议添加根证书)
    client.setInsecure();
    
  • 移除手动client连接逻辑:UniversalTelegramBot库会自行处理与API的连接,手动调用client.connect()会干扰库的内部流程,直接删除该判断块,直接调用bot.sendMessage()即可。

  • 添加消息发送结果验证:通过sendMessage的返回值判断发送状态,便于排查问题:

    String message = "Conexión exitosa. El dispositivo se ha conectado a Wi-Fi.";
    bool sendSuccess = bot.sendMessage("YOUR_CHAT_ID", message);
    if (sendSuccess) {
        Serial.println("消息发送成功");
    } else {
        Serial.println("消息发送失败");
    }
    
  • 修复EEPROM读取函数:原read_flash函数未检测字符串终止符,可能读取到无效字符导致WiFi连接异常。修改为:

    String read_flash(int startAddr) {
        char in[128];
        int i = 0;
        while (i < 127) {
            in[i] = EEPROM.read(startAddr + i);
            if (in[i] == '\0') break;
            i++;
        }
        in[i] = '\0'; // 确保字符串正确终止
        return String(in);
    }
    
  • 增加网络稳定延迟:在WiFi连接成功后,添加2-3秒延迟确保网络状态稳定后再调用Telegram API:

    Serial.println("WiFi Connected");
    delay(2000); // 增加延迟
    

内容的提问来源于stack exchange,提问作者diego rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 22:02:22