我想使用MQTT服务器将ESP32与mi PC连接。 Mi scrpts是: 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出现恐慌(双重例外)
如果有人可以提供帮助,我将非常感谢。 谢谢!!!!!!!!!!
答案 0 :(得分:0)
据我所知,您正在从脚本中发布多个消息。发生这种情况的可能原因之一是esp8266可能无法全部处理它们–内存不足或MCU速度问题。我建议您尝试仅从代码中发布一条消息。如果可行,请尝试通过增加两次发布之间的延迟来降低发送速度。
通常,如果您不能控制随机发布者的发布速度,则可能需要设置一个脚本/守护程序,该脚本/守护程序将侦听所有有问题的主题,并使用新的主题名称重新发布它,并注意适当的节流。 ESP只会听一个新话题,从而解决问题。