首页 > 解决方案 > Guru Meditation Error: Core 1 panic'ed (Double exception) ESP32 using MQTT

问题描述

我想使用 MQTT 服务器将我的 ESP32 与 mi PC 连接起来。我的脚本是这些:ESP32:

#include <WiFi.h>
#include <PubSubClient.h>
#include <stdlib.h>
#include <string.h>

// CONSTANTES PARA CONEXION AL BROKER
const char* ssid = "+++++++++";
const char* password = "++++++++++";
const char* mqttServer = "+++++++++";
const int mqttPort = ++++++;
const char* mqttUser = "++++++++";
const char* mqttPassword = "+++++++++";
const char *topic = "++++++++++";

//OBJETOS
WiFiClient espClient;
PubSubClient client(espClient);

//ARRAY PARA RECOGER LOS DATOS
int array_azimuth[96];
int array_zen[96];

//FUNCION DE IDENTIFICACION DE CODIGOS ASCII
int GetIntFromAscii(byte payload){
  switch(payload){
    case 48:
       return 0;
       break;
    case 49:
       return 1;
       break;
    case 50:
       return 2;
       break;
    case 51:
       return 3;
       break;
    case 52:
       return 4;
       break;
    case 53:
       return 5;
       break;
    case 54:
       return 6;
       break;
    case 55:
       return 7;
       break;
    case 56:
       return 8;
       break;
    case 57:
       return 9;
       break;
    case 63:
       return -1;
       break;

  }
}

void GetParameterFromPayload(byte* payload, int* azimuth, int *zen){
    int cont = 0;
    int cifras[3];
    int i = 0;
    int j = 0;
    // AZIMUTH
    while(GetIntFromAscii(payload[i]) != -1){
    cifras[i] = GetIntFromAscii(payload[i]);
    cont++;
    i++;
    if(cont == 3){
      *azimuth = cifras[0] * 100 + cifras[1] * 10 + cifras[2];
      //Serial.print('\n');
      //Serial.print("Resultado azimuth dentro funcion = ");
      //Serial.print(*azimuth);
    }
    if(cont == 2){
      *azimuth = cifras[0] * 10 + cifras[1];
      //Serial.print('\n');
      //Serial.print("Resultado azimuth dentro funcion = ");
      //Serial.print(*azimuth);
    }
    }

    // Actualizamos contadores
    cont = 0;
    i++;
    // ELEVACION
    while(GetIntFromAscii(payload[i]) != -1){
      cifras[j] = GetIntFromAscii(payload[i]);
      cont++;
      i++;
      j++;
      if(cont == 3){
      *zen = cifras[0] * 100 + cifras[1] * 10 + cifras[2];
      //Serial.print('\n');
      //Serial.print("Resultado elevacion dentro de funcion = ");
      //Serial.print(*zen);
    }
      if(cont == 2){
      *zen = cifras[0] * 10 + cifras[1];
      //Serial.print('\n');
      //Serial.print("Resultado elevacion dentro de funcion = ");
      //Serial.print(*zen);
    }
}
}

// Callback asociada a la recepcion de un paquete 
void callback(char* topic, byte* payload, unsigned int length) {
  static uint8_t counter;
  //Serial.print('\n');
  //Serial.print("Mensaje recibido [");
  //Serial.print(topic);
  //Serial.print("] ");
  int azimuth;
  int zen;
  GetParameterFromPayload(payload,&azimuth,&zen);
  /*Serial.print('\n');
  Serial.print("Resultado azimuth callbabck = ");
  Serial.print(azimuth);
  Serial.print('\n');
  Serial.print("Resultado elevacion callback = ");
  Serial.print(zen);
  Serial.print('\n');*/
  array_azimuth[counter] = azimuth;
  array_zen[counter] = zen;
  counter++;
  //Serial.print('\n');
  //Serial.print(counter);
  if (counter == 96){
    //Serial.print("RESULTADOS DENTRO DE LOS ARRAY");
    for(int i = 0;i < 96;i++){
      //Serial.print('\n');
      //Serial.print("Azimuth");
      //Serial.print(array_azimuth[i]);
      //Serial.print("********");
      //Serial.print(array_zen[i]);
      //Serial.print('\n');
    }
  }
}

// Funcion para reconectar en caso de que se pierda la conexion con el broker
void Reconnect() {
  // En caso de perder la conexion volveriamos a hacer lo mismo que en el setup
  while (client.connected() != true) {
    Serial.print("Conectando...");
    if (client.connect("ESP32", mqttUser, mqttPassword)) {
      Serial.println("Conectado");
      client.publish(topic,"Reconexion");
      client.subscribe(topic);
    } else {
      Serial.print("Fallido");
      Serial.print(client.state());
      Serial.println("Reintentamos en 10s");
      delay(10000);
    }
  }
}

 //CONFIG
void setup() {
  // Inicializacion de puerto serial 
  Serial.begin(9600);
  // Iniciacion de conexion wifi
  WiFi.begin(ssid, password);
  // Inicializacion de pin 5 para saber cuando estamos conectados al broker
  pinMode(5,OUTPUT);
  // Conectando...
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.println("Conectando a red WiFi...");
  }

  // Conectado
  Serial.println("Conectado a la red WiFi");
  // Conectamos al servidor
  client.setServer(mqttServer, mqttPort);

  while (!client.connected()) {
    Serial.println("Conectando a Broquer MQTT...");

    if (client.connect("ESP32", mqttUser, mqttPassword )) {

      Serial.println("conectado");
      digitalWrite(5,HIGH);
    } else {

      Serial.print("conexion fallida ");
      Serial.print(client.state());
      delay(2000);

    }
  }


  // Nos subscribimos al tema, especificando la calidad del servicio al maximo
  if( client.subscribe(topic) != true ){
    Serial.print("Error en la subscripcion");
  }

  client.setCallback(callback);


}


 // Bucle de ejecucion continuo 
void loop() {
  digitalWrite(5,HIGH);
  if(client.connected() != true){
    Reconnect();
  }
  if(client.connected() == true){
    digitalWrite(5,LOW);
  }
  client.loop();
  delay(1000);

}



Running on PC:
import time
import paho.mqtt.client as mqtt
import paho.mqtt.publish as mqttsend
from pylab import *
from sunposition import sunpos
from datetime import datetime

# DEFINICION DE CONSTANTES PARA EL SERVIDOR
mqttServer = "++++++++++"
mqttPort = +++++
mqttUser = "+++++++"
mqttPassword = "++++++++++"
topic_az = "++++++++"
topic_zen = "++++++++"

# DEFINICION DE CONSTANTES PARA EL CALCULO DE LA POSICION DEL SOL
lat = 43.52315
lon = -5.62839
# STRING DE COMPROBACION DE LLEGADA MENSAJE
mystring = 'send'    
b = bytes(mystring, 'utf-8')

# CALLBACK PARA CONEXION CON EL BROKER
def connect( client, userdata, flags, rc):
    print ("Conectado")
    # Subscripcion al topic
    client.subscribe(topic_az)

# CALLBACK PARA RECEPCION DE MENSAJE
def recepcion( client, userdata, msg):
    print(msg.payload)
    if msg.payload == b:
     print("if correcto")
     MYhours = 0
     MYminutes = 0
     i = 0
     # Obtengo la fecha
     today = datetime.utcnow()
     while i < 96:
        print("dentro while")
        i = i + 1
        MYminutes = MYminutes + 15
        if MYminutes == 60:
          MYminutes = 0
          MYhours = MYhours + 1
        today = today.replace(hour = MYhours)
        today = today.replace(minute = MYminutes)
        print(today)
        az,zen = sunpos(today,lat,lon,0)[:2]
        az_round = round(az,0)
        zen_round = round(zen,0)
        az_round = int(az);
        zen_round = int(zen);
        #client.publish(topic_az,str(az_round)+'?'+str(zen_round)+'?'+str(today.hour)+':'+str(today.minute))
        #client.publish(topic_az,str(az_round)+'?'+str(zen_round)+'?')
        client.publish(topic_az,str(9)+'?'+str(8)+'9');
        #client.publish(topic_zen,str(az_round))
        print("Mensaje enviado")
        time.sleep(1)
        print(i)
     print('fin while')



# Creacion de objeto cliente 
client = mqtt.Client()
client.on_connect = connect
client.on_message = recepcion
client.username_pw_set(mqttUser, mqttPassword)
client.connect(mqttServer,mqttPort,60)      
client.loop_forever()

当我使用手机上运行的 MQTT 客户端发送消息时,ESP32 代码有效,但我无法理解为什么当我尝试从我的 Python 脚本发送数据时它不起作用。ESP32 显示的错误是这样的:

大师冥想错误:核心 1 恐慌(双重例外)

如果有人可以提供帮助,我将不胜感激。非常感谢您!!!!!!!!!!

标签: pythonarduinomqttesp32

解决方案


据我所知,您从脚本中发布了不止一条消息。这里发生的事情的一个可能原因是 esp8266 可能无法全部处理它们——要么是内存不足,要么是 MCU 速度问题。我建议您尝试仅从您的代码中发布一条消息。如果可行,请尝试通过在发布之间添加延迟来降低发送速度。

一般来说,如果您无法控制随机发布者的发布速率,您可能需要设置一个脚本/守护程序,该脚本/守护程序将监听所有有问题的主题并以新的主题名称重新发布,注意适当的限制。ESP 将只听一个新主题,从而解决问题。


推荐阅读