Impossibile connettere il dispositivo Arduino ClearCore al server MQTT ospitato su Raspberry Pi
Il mio obiettivo:
Sto cercando di comunicare con un server MQTT (sto usando mosquitto) ospitato su un raspberry pi da un dispositivo ClearCore che ho programmato usando Arduino.
Il mio problema:
Ho trovato numerosi esempi online che ottengono ciò che voglio utilizzando dispositivi e tecniche simili. Tuttavia non riesco a stabilire una connessione dal mio dispositivo ClearCore utilizzando il mio software Arduino al broker MQTT ospitato sul mio raspberry pi.
La mia configurazione:
Sto usando una connessione Ethernet dal mio dispositivo Clear Core al mio Raspberry Pi. Sto usando un Teknic CLCR-4-13 . Non sto usando DHCP. Sto impostando l'indirizzo IP del raspberry pi ogni volta che si riavvia, quindi so sempre di cosa si tratta (vedi comando sotto). Ho creato il file mosquitto.conf (porta: 1883) e il file_password dove definisco un "username" e una "password".
Eseguo questo comando ogni volta che riavvio il mio pi quindi non devo creare un IP statico.
sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0
Cosa ho provato:
- Dal mio PC, utilizzando una connessione Ethernet e uno script Python, sono in grado di connettermi, iscrivermi e pubblicare sul mio server MQTT utilizzando l'indirizzo IP del raspberry pi come nome del server 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(".")
- Per verificare di poter trasmettere dati dal dispositivo ClearCore e raspberry pi utilizzando un cavo Ethernet, ho inviato con successo pacchetti UDP utilizzando un programma Arduino. Uso lo stesso mac e l'indirizzo IP.
- Ho provato a cambiare la versione MQTT definendola nel programma Arduino in versioni precedenti.
- Ho usato Wireshark per monitorare il traffico Ethernet quando eseguo il programma per verificare che sia stato effettuato un tentativo di connessione.
Il mio programma Arduino:
Nota: tutto viene compilato e il programma viene eseguito correttamente, ma non è in grado di connettersi al server 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 da Raspberry Pi
mosquitto_sub -d -u user -P pass -t dev/test
Lo uso per vedere i messaggi quando arrivano dal pi.
dove fallisce...
mqttClient.setServer(server, 1883);
if (mqttClient.connect("myClientID","user","pass"))
{
//error message
}
Considerazioni su potenziali problemi:
La maggior parte degli esempi che ho visto di progetti simili: le persone usano "test.mosquitto.org" come nome del server, ma poiché ho configurato il mio server MQTT sul mio raspberry pi, utilizzo invece l'indirizzo IP del raspberry pi come server nome. Ha funzionato quando mi sono connesso dal mio PC usando uno script Python, ma non so se questo è un problema nel mio programma Arduino.
Spero di aver fornito informazioni sufficienti. Per favore fatemi sapere se c'è qualcos'altro che potreste voler vedere che potrebbe essere d'aiuto - apprezzo tutti i feedback.
Risposte
Sembra che tu stia impostando l'indirizzo IP del tuo dispositivo in modo che sia lo stesso del tuo server Raspberry Pi.
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
Non funzionerà. Rendi l'IP del dispositivo qualcosa di diverso, come IPAddress ip(192, 168, 1, 24)
.