python - 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 恐慌(双重例外)
如果有人可以提供帮助,我将不胜感激。非常感谢您!!!!!!!!!!
解决方案
据我所知,您从脚本中发布了不止一条消息。这里发生的事情的一个可能原因是 esp8266 可能无法全部处理它们——要么是内存不足,要么是 MCU 速度问题。我建议您尝试仅从您的代码中发布一条消息。如果可行,请尝试通过在发布之间添加延迟来降低发送速度。
一般来说,如果您无法控制随机发布者的发布速率,您可能需要设置一个脚本/守护程序,该脚本/守护程序将监听所有有问题的主题并以新的主题名称重新发布,注意适当的限制。ESP 将只听一个新主题,从而解决问题。
推荐阅读
- hook - Ionic 4/Angular 7 生命周期钩子每页只调用一次
- android - Dagger 2 - 了解进行字段和方法注入的不同方式
- conv-neural-network - 神经网络剪枝机制
- python-3.x - 第一列未作为索引 Pandas 导入
- python - AttributeError:未知属性颜色:Python
- hadoop - Cloudera 安装代理问题
- r - 如何用闪亮的书签上传文件?
- python - 无法修改 numpy 数组
- javascript - Javascript - 将参数传递给函数的问题:以不同的顺序传递它们会返回错误的值
- python - 为什么我的 python 程序没有从 sql 查询中打印出我想要的结果?