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
相关产品推荐
相关产品推荐

