No se puede conectar el dispositivo Arduino ClearCore al servidor MQTT alojado en raspberry pi
Mi meta:
Estoy tratando de comunicarme con un servidor MQTT (estoy usando mosquitto) alojado en una raspberry pi desde un dispositivo ClearCore que programé usando Arduino.
Mi problema:
He encontrado numerosos ejemplos en línea que logran lo que quiero usando dispositivos y técnicas similares. Sin embargo, no puedo hacer una conexión desde mi dispositivo ClearCore usando mi software Arduino al corredor MQTT alojado en mi raspberry pi.
Mi configuración:
Estoy usando una conexión Ethernet desde mi dispositivo Clear Core a mi raspberry pi. Estoy usando un Teknic CLCR-4-13 . No estoy usando DHCP. Estoy configurando la dirección IP de la frambuesa pi cada vez que se reinicia para que siempre sepa cuál es (ver el comando a continuación). He creado el archivo mosquitto.conf (puerto: 1883) y el archivo de contraseñas donde defino un "nombre de usuario" y una "contraseña".
Ejecuto este comando cada vez que reinicio mi pi para no tener que crear una IP estática.
sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0
Lo que he probado:
- Desde mi PC, usando una conexión Ethernet y un script de Python, puedo conectarme, suscribirme y publicar en mi servidor MQTT usando la dirección IP de raspberry pi como el nombre del servidor MQTT.
import paho.mqtt.publish as pub
MQTT_SERVER = "192.168.1.23"
MQTT_PATH = "dev/test"
credentials = {'username':"user",'password':"pass"}
import time
while True:
pub.single(MQTT_PATH, "Hello Pi!", hostname = MQTT_SERVER, auth = credentials)
time.sleep(3)
print(".")
- Para verificar que puedo transmitir datos desde el dispositivo ClearCore y raspberry pi usando un cable Ethernet, he enviado con éxito paquetes UDP usando un programa Arduino. Uso la misma mac y dirección IP.
- He intentado cambiar la versión de MQTT definiéndola en el programa Arduino a versiones anteriores.
- He usado Wireshark para monitorear el tráfico de Ethernet cuando ejecuto el programa para verificar que se está realizando un intento de conexión.
Mi programa Arduino:
Nota: todo se compila y el programa se ejecuta correctamente, pero no puede conectarse al servidor MQTT
#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>
//#define MQTT_VERSION MQTT_VERSION_3_1
//#define MQTT_VERSION MQTT_VERSION_3_1_1
//#define MQTT_VERSION MQTT_VERSION_5_0
// Function prototypes
void subscribeReceive(char* topic, byte* payload, unsigned int length);
// Set your MAC address and IP address here
byte mac[] = {0x24, 0x15, 0x10, 0xb0, 0x00, 0x3f};
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
// Ethernet and MQTT related objects
EthernetClient ethClient;
PubSubClient mqttClient(ethClient);
void setup() {
// Useful for debugging purposes
Serial.begin(9600);
// Start the ethernet connection
Ethernet.begin(mac, ip);
// Ethernet takes some time to boot!
delay(3000);
// Set the MQTT server to the server stated above ^
mqttClient.setServer(server, 1883);
// Attempt to connect to the server with the ID "myClientID"
if (mqttClient.connect("myClientID","user","pass"))
{
Serial.println("Connection has been established, well done");
// Establish the subscribe event
mqttClient.setCallback(subscribeReceive);
}
else
{
Serial.println("Looks like the server connection failed...");
}
}
void loop() {
mqttClient.loop();
mqttClient.subscribe("dev/test");
if(mqttClient.publish("dev/test", "Hello World"))
{
Serial.println("Publish message success");
}
else
{
Serial.println("Could not send message :(");
}
// Dont overload the server!
delay(4000);
}
void subscribeReceive(char* topic, byte* payload, unsigned int length)
{
// Print the topic
Serial.print("Topic: ");
Serial.println(topic);
// Print the message
Serial.print("Message: ");
for(int i = 0; i < length; i ++)
{
Serial.print(char(payload[i]));
}
// Print a newline
Serial.println("");
}
Comando desde Raspberry Pi
mosquitto_sub -d -u user -P pass -t dev/test
Lo uso para ver los mensajes cuando vienen del pi.
donde falla...
mqttClient.setServer(server, 1883);
if (mqttClient.connect("myClientID","user","pass"))
{
//error message
}
Pensamientos de problemas potenciales:
La mayoría de los ejemplos que he visto de proyectos similares: la gente está usando "test.mosquitto.org" como su nombre de servidor, pero debido a que configuré mi propio servidor MQTT en mi raspberry pi, en su lugar uso la dirección IP de raspberry pi como servidor. nombre. Esto funcionó cuando me conecté desde mi PC usando un script de python, pero no sé si esto es un problema en mi programa Arduino.
Espero haber proporcionado suficiente información. Por favor, hágame saber si hay algo más que desee ver que pueda ayudar. Agradezco todos los comentarios.
Respuestas
Parece que está configurando la dirección IP de su dispositivo para que sea la misma que su servidor raspberry pi.
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
Eso no va a funcionar. Haga que la IP del dispositivo sea algo diferente, como IPAddress ip(192, 168, 1, 24)
.