问题
The title is quite self-explanatory, but I will try to explain the issue further here so as to be more precise. My code runs on an ESP8266-01 connected to a fan and is used to control it through Telegram (with its own bot) and Adafruit MQTT, from both of which it receives a command (not at the same time, it's just to have multiple ways to control the fan in case I don't have my phone by me).
Anyway, this is where the problems kick in: after an indeterminate amount of time (could be 5 minutes, just as well as it could be 4+ hours, like it did when I was testing it on Serial), the ESP01 restarts, throwing this Exception
Exception (28):
epc1=0x40222dc2 epc2=0x00000000 epc3=0x00000000 excvaddr=0x040c102c depc=0x00000000
>>>stack>>>
ctx: bearssl
sp: 3fff1008 end: 3fff1478 offset: 0190
3fff1198: 0000000a 3fff8900 000009e6 4022270d
3fff11a8: f0ccf003 3cc30f3c 0f3cff03 03c3330f
3fff11b8: f0fc33c2 03c0330f 3c0c300c c000300c
3fff11c8: cfc3cfff f33ffc0c fc0c3300 ffc00ffc
3fff11d8: cf330f3f ffc00f03 0cfc0f03 c0ff0ffc
3fff11e8: c3c03ccc cff3ccfc ccfcf000 cc3ffccc
3fff11f8: c3f0fc0c 333ffcff 033303ff 3fcc03cc
3fff1208: 3fc0f33c 3ccfc3cc c3cccfff 3cf333c3
3fff1218: 3fcf3303 0f0ccccc ff0fffcc 0c3c00c3
3fff1228: f3c0300c f3c33f3c 3f3cc3cc 0c30f0c0
3fff1238: 0cc3f0ff fcfcc33c 3303ccc3 03f3003f
3fff1248: cf3ff003 cf3ff3f3 f30cc03c 03f0cfc0
3fff1258: fc3fcfcc 33cc3ff3 f0ffc33f ffcffff3
3fff1268: c3f3cf00 c3f33030 cf03c0f3 ff30c3c0
3fff1278: 33f3c3c3 f03c0c30 cfcc3f0c ccc333cf
3fff1288: c0303cff 3fcf0f0f c300c030 33f0c03f
3fff1298: 057eb259 f0f6483c 0bb168c6 8e042ad6
3fff12a8: ef0e748c fb4720fa 610a5e5a 7ef262ea
3fff12b8: e4bf1c4a 9a4d7ea0 ae0d41a4 7640345a
3fff12c8: 68451f77 1d707387 9195f4c3 15642cab
3fff12d8: 3c0fdaf5 16b9dbff 0000ef82 00000000
3fff12e8: 00000000 00000000 00000000 00000030
3fff12f8: 4010372b 00040000 00000000 00040000
3fff1308: 53000000 40103728 00040000 3a2a3de0
3fff1318: 3ffed480 4010268f 8c352dcf 11402259
3fff1328: a89def83 53c2e59f 04f73e23 7d24a14f
3fff1338: 61289e0b 2c9f0300 4000050c 3fffc278
3fff1348: 401024e0 3fffc200 00000022 7d24a14f
3fff1358: 4022117c 00000030 00000008 ffffffff
3fff1368: 402068dc 3fff1d04 00000303 00000003
3fff1378: 3fff1d09 0000006c 000006b4 00000003
3fff1388: 00000000 3fffc6fc 00000001 3fff7e1c
3fff1398: 00000000 00003a98 3ffeefd4 00000030
3fff13a8: 0004f73e 3fff7e6c 008c352d 10000000
3fff13b8: 00000000 02000000 00030315 00000002
3fff13c8: 3fff1418 40257303 3fff7e5c 40223cc9
3fff13d8: 3fff8620 3fff86a4 b6cb9a6a 3fff8600
3fff13e8: 3fff1d11 3fff7e1c 3fff8620 00000000
3fff13f8: deadbeef 0000000a 3fff7e00 3fff1d09
3fff1408: 3fff1458 00000002 3fff1d11 3fff881c
3fff1418: 3fff891c 00000000 3fff7e1c 40220dbc
3fff1428: 3fff8600 000001d2 deadbeef deadbeef
3fff1438: 00000250 00000005 deadbeef 3ffeefd4
3fff1448: 00003a98 0000002e 3fff7e1c 402212a1
3fff1458: 000000dd deadbeef deadbeef 40221090
3fff1468: deadbeef 00000000 3ffeee30 402068dc
ctx: cont
sp: 3ffffe30 end: 3fffffc0 offset: 0000
3ffffe30: 00003a98 00000000 00000010 402062ce
3ffffe40: 00000200 3ffeee30 3fff1694 402052dc
3ffffe50: 00000000 00e41e9f 00000000 3ffffef0
3ffffe60: 000001bb 3ffeee30 3ffe8ab0 3ffffef0
3ffffe70: 3ffe8d96 00000000 3ffeee30 4020647d
3ffffe80: 4020b810 3fffff00 3ffeee30 40205992
3ffffe90: 3ffe8d96 3fffff00 3ffeed7c 40201e5b
3ffffea0: 3fffff0c 00000053 3ffffef0 40208840
3ffffeb0: 3fff7ca4 3fffff18 3ffffef0 40208a24
3ffffec0: 3fffff0c 3fffff0c 3ffffef0 40208a54
3ffffed0: 3fffff18 3ffffef0 3ffeed7c 3ffef028
3ffffee0: 3fffff0c 3fffff0c 3ffeed7c 40203bb5
3ffffef0: 3fff73b4 0053005f 001cac08 00000003
3fffff00: 39313700 33383838 80c6a700 3fff7300
3fffff10: 0053005f 80000000 3fff7ca4 0053005f
3fffff20: 00000000 3ffeec80 3ffeec80 402053b4
3fffff30: 241b8b42 3ffeec80 3ffeec80 4020b20c
3fffff40: 3ffeef3c 3ffeec80 3ffeec80 3ffef028
3fffff50: 3ffeef3c 00000000 3ffeed7c 4020188c
3fffff60: 007a1200 23030291 3ffeef00 40208240
3fffff70: 00000000 3ffeef68 3ffeefa0 402082b4
3fffff80: 00000000 00000000 00000001 40100154
3fffff90: 3fffdad0 00000000 3ffeefe8 3ffef028
3fffffa0: 3fffdad0 00000000 3ffeefe8 4020906c
3fffffb0: feefeffe feefeffe 3ffe8548 40100bed
<<<stack<<<
which appears so after being decoded with ESP8266 Exception Decoder:
Exception 28: LoadProhibited: A load referenced a page mapped with an attribute that does not permit loads
PC: 0x40222dc2: br_ssl_hs_client_run at src/ssl/ssl_hs_client.c line 1805
EXCVADDR: 0x040c102c
Decoding stack results
0x4022270d: br_ssl_hs_client_run at src/ssl/ssl_hs_client.c line 1379
0x4022117c: br_ssl_engine_set_buffers_bidi at src/ssl/ssl_engine.c line 449
0x402068dc: BearSSL::WiFiClientSecure::_connectSSL(char const*) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 1098
0x40223cc9: gen_chapol_process at src/ssl/ssl_rec_chapol.c line 54
0x40220dbc: cc_do_sign at src/ssl/ssl_ccert_single_rsa.c line 131
0x402212a1: br_ssl_engine_flush_record at src/ssl/ssl_engine.c line 1108
0x40221090: rng_init at src/ssl/ssl_engine.c line 470
0x402068dc: BearSSL::WiFiClientSecure::_connectSSL(char const*) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 1098
0x402062ce: BearSSL::WiFiClientSecure::WiFiClientSecure() at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 107
0x402052dc: WiFiClient::write_P(char const*, unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src/include/DataSource.h line 135
0x4020647d: BearSSL::WiFiClientSecure::_run_until(unsigned int, bool) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266/PolledTimeout.h line 66
0x40205992: BearSSL::br_ssl_client_base_init(br_ssl_client_context*, uint16_t const*, int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\WiFiClientSecureBearSSL.cpp line 948
0x40208840: Stream::readBytes(char*, unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266\Stream.cpp line 222
0x40208a24: String::changeBuffer(unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266\WString.cpp line 200
0x40208a54: String::reserve(unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266\WString.cpp line 144
0x40203bb5: UniversalTelegramBot::processResult(ArduinoJson::JsonObject&, int) at C:\Users\window\Documents\Arduino\libraries\UniversalTelegramBot\src\UniversalTelegramBot.cpp line 467
0x402053b4: WiFiClient::read(unsigned char*, unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\WiFiClient.cpp line 278
0x4020b20c: BearSSL::PublicKey::getEC() const at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\libraries\ESP8266WiFi\src\BearSSLHelpers.cpp line 695
0x4020188c: checkUpdates(int) at H:\Programming\Arduino\Fan_remote_control\Versions\V 2.0\Fan_remote_control/Fan_remote_control.ino line 119
0x40208240: HardwareSerial::readBytes(char*, unsigned int) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266/PolledTimeout.h line 186
0x402082b4: _GLOBAL__sub_D__ZN14HardwareSerialC2Ei() at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266/HardwareSerial.h line 72
0x40100154: ets_post(uint8, ETSSignal, ETSParam) at C:\Users\window\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.7.2\cores\esp8266\core_esp8266_main.cpp line 177
I suspect that the issue might be caused by the connection to two different types of WiFiClients, although either Telegram or Adafruit MQTT won't work unless both of them are in use (as far as I can tell from my tests). Any help or suggestion would be very appreciated, feel free to ask for more information if it's needed.
Code here (replaced sensitive info with the word "private"):
#include "UniversalTelegramBot.h"
#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <Adafruit_MQTT.h>
#include <Adafruit_MQTT_Client.h>
#define BOTtoken "private"
#define ledPin 2
#define myChatId "private"
#define AIO_SERVER "io.adafruit.com"
#define AIO_SERVERPORT 1883
#define AIO_USERNAME "private"
#define AIO_KEY "private"
char ssid[] = "private";
char password[] = "private";
bool fanState;
unsigned long lastTimeBotRan = 0;
unsigned long checkTime = 1000;
int numNewMessages;
unsigned long timerStartPoint = 0;
bool timerStart;
String chat_id;
String text;
int messagesNumber;
String timerString;
String Request;
const unsigned long rst = 300000;
boolean MQTT_connect();
WiFiClientSecure secureClient;
WiFiClient client;
UniversalTelegramBot bot(BOTtoken, secureClient);
Adafruit_MQTT_Client mqtt(&client, AIO_SERVER, AIO_SERVERPORT, AIO_USERNAME, AIO_KEY);
Adafruit_MQTT_Subscribe private = Adafruit_MQTT_Subscribe(&mqtt, AIO_USERNAME "/feeds/private");
void checkUpdates(int numNewMessages) {
for (int i = 0; i < numNewMessages; i++) {
chat_id = String(bot.messages[i].chat_id);
text = bot.messages[i].text;
String from_name = bot.messages[i].from_name;
if (chat_id != myChatId) {
bot.sendMessage(chat_id, "Unauthorized user, please refrain from texting this bot again.", "");
continue;
}
if (text == "/start") {
String welcome = "Welcome " + from_name + "!\n";
welcome += "Control your fan remotely!\n\n";
welcome += "/fanon : to switch the fan ON\n";
welcome += "/fanoff : to switch the fan OFF\n";
welcome += "/state : returns current state of the fan\n";
welcome += "/timer15 : runs fan for 15 minutes\n";
welcome += "/timer30 : runs fan for 30 minutes\n";
welcome += "/timer60 : runs fan for 1 hour\n";
welcome += "/timer : runs fan for specified amount of time\n";
bot.sendMessage(chat_id, welcome, "Markdown");
}
if (text == "/fanon") {
digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level)
fanState = true;
bot.sendMessage(chat_id, "Your fan is ON", "");
}
if (text == "/fanoff") {
fanState = false;
timerStart = false;
digitalWrite(ledPin, LOW); // turn the LED off (LOW is the voltage level)
bot.sendMessage(chat_id, "Your fan is OFF", "");
}
if (text == "/state") {
if (fanState) {
bot.sendMessage(chat_id, "Your fan is ON", "");
} else {
bot.sendMessage(chat_id, "Your fan is OFF", "");
}
}
if (text == "/timer15") {
timerStartPoint = millis();
digitalWrite(ledPin, HIGH);
timerStart = true;
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(chat_id, "Your fan will run for 15 minutes", "");
launchTimer(15);
}
if (text == "/timer30") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(chat_id, "Your fan will run for 30 minutes", "");
launchTimer(30);
}
if (text == "/timer60") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(chat_id, "Your fan will run for 1 hour", "");
launchTimer(60);
}
if (text == "/timer") {
messagesNumber = bot.last_message_received + 1;
bot.sendMessage(chat_id, "How long do you want the fan to run for? (in minutes)", "");
Serial.println(messagesNumber);
while (messagesNumber == (bot.last_message_received + 1)) {
checkUpdates(bot.getUpdates(bot.last_message_received + 1));
timerString = bot.messages[i].text;
yield();
}
if (messagesNumber < (bot.last_message_received + 1)) {
unsigned long timer = timerString.toInt();
Serial.println(timer);
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(chat_id, "Your fan will run for " + timerString + " minutes", "");
launchTimer(timer);
}
}
text = "";
}
}
void launchTimer(unsigned long timeInMinutes) {
unsigned long timeInMillis = timeInMinutes * 60 * 1000;
while (timerStart) {
checkUpdates(bot.getUpdates(bot.last_message_received + 1));
if (MQTT_connect()) {
Adafruit_MQTT_Subscribe *subscription_name;
while ((subscription_name = mqtt.readSubscription(4000))) {
if (subscription_name == &private) {
Request = ((char *)private.lastread);
if (Request == "fanon") {
digitalWrite(ledPin, HIGH);
fanState = true;
bot.sendMessage(myChatId, "Fan turned on through Control Panel", "");
}
if (Request == "fanoff") {
fanState = false;
timerStart = false;
digitalWrite(ledPin, LOW);
bot.sendMessage(myChatId, "Fan turned off through Control Panel", "");
}
if (Request == "timer15") {
timerStartPoint = millis();
digitalWrite(ledPin, HIGH);
timerStart = true;
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 15 minutes through Control Panel", "");
launchTimer(15);
}
if (Request == "timer30") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 30 minutes through Control Panel", "");
launchTimer(30);
}
if (Request == "timer60") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 1 hour through Control Panel", "");
launchTimer(60);
}
}
}
}
if (millis() - timerStartPoint > timeInMillis) {
digitalWrite(ledPin, LOW);
timerStart = false;
Serial.print("Fan off at ");
Serial.println(millis());
bot.sendMessage(myChatId, "Fan turned off because timer ran out", "");
}
yield();
}
}
boolean MQTT_connect() {
int8_t ret;
if (mqtt.connected()) {
return true;
} uint8_t retries = 3;
while ((ret = mqtt.connect()) != 0) {
mqtt.disconnect();
delay(2000);
retries--;
if (retries == 0) {
return false;
}
} return true;
}
void setup() {
Serial.begin(115200);
secureClient.setInsecure();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
Serial.print("Connecting Wifi: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
pinMode(ledPin, OUTPUT);
delay(10);
digitalWrite(ledPin, LOW);
Request = "";
mqtt.subscribe(&private);
if (MQTT_connect()) {
Serial.println("mqtt connected");
}
else {
Serial.println("mqtt connection failed");
}
}
void loop() {
if (millis() - lastTimeBotRan > checkTime) {
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
while (numNewMessages) {
checkUpdates(numNewMessages);
numNewMessages = bot.getUpdates(bot.last_message_received + 1);
}
lastTimeBotRan = millis();
}
delay(1000);
if (MQTT_connect()) {
Adafruit_MQTT_Subscribe *subscription_name;
while ((subscription_name = mqtt.readSubscription(4000))) {
if (subscription_name == &private) {
Request = ((char *)private.lastread);
if (Request == "fanon") {
digitalWrite(ledPin, HIGH);
fanState = true;
bot.sendMessage(myChatId, "Fan turned on through Control Panel", "");
}
if (Request == "fanoff") {
fanState = false;
timerStart = false;
digitalWrite(ledPin, LOW);
bot.sendMessage(myChatId, "Fan turned off through Control Panel", "");
}
if (Request == "timer15") {
timerStartPoint = millis();
digitalWrite(ledPin, HIGH);
timerStart = true;
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 15 minutes through Control Panel", "");
launchTimer(15);
}
if (Request == "timer30") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 30 minutes through Control Panel", "");
launchTimer(30);
}
if (Request == "timer60") {
digitalWrite(ledPin, HIGH);
timerStart = true;
timerStartPoint = millis();
Serial.print("Fan on at ");
Serial.println(timerStartPoint);
bot.sendMessage(myChatId, "Fan turned on for 1 hour through Control Panel", "");
launchTimer(60);
}
}
}
}
if (!mqtt.ping()) {
mqtt.disconnect();
}
}
Also, in case any of my private/inappropriate-to-show data is shown here, please suggest an edit or kindly tell me, as I am new to the world of StackOverflow. Thanks in advance to all of those who will be willing to help me.
来源:https://stackoverflow.com/questions/63237135/exception-28-thrown-on-esp8266-01-when-connected-to-adafruit-mqtt-and-telegram