Impossible de connecter l'appareil Arduino ClearCore au serveur MQTT hébergé sur raspberry pi
Mon but:
J'essaie de communiquer avec un serveur MQTT (j'utilise moustique) hébergé sur un raspberry pi à partir d'un appareil ClearCore que j'ai programmé à l'aide d'Arduino.
Mon problème :
J'ai trouvé de nombreux exemples en ligne qui réalisent ce que je veux en utilisant des dispositifs et des techniques similaires. Cependant, je ne parviens pas à établir une connexion entre mon appareil ClearCore à l'aide de mon logiciel Arduino et le courtier MQTT hébergé sur mon raspberry pi.
Ma configuration :
J'utilise une connexion Ethernet entre mon appareil Clear Core et mon raspberry pi. J'utilise un Teknic CLCR-4-13 . Je n'utilise pas DHCP. Je configure l'adresse IP du raspberry pi à chaque redémarrage pour que je sache toujours ce que c'est (voir la commande ci-dessous). J'ai créé le fichier mosquitto.conf (port: 1883) et le password_file où je définis un "username" et un "password".
J'exécute cette commande chaque fois que je redémarre mon pi afin de ne pas avoir à créer une adresse IP statique.
sudo ifconfig eth0 192.168.1.23 netmask 255.255.255.0
Ce que j'ai essayé :
- Depuis mon PC - en utilisant une connexion Ethernet et un script python, je peux me connecter, m'abonner et publier sur mon serveur MQTT en utilisant l'adresse IP du raspberry pi comme nom du serveur 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(".")
- Pour vérifier que je peux transmettre des données depuis l'appareil ClearCore et Raspberry Pi à l'aide d'un câble Ethernet, j'ai envoyé avec succès des packages UDP à l'aide d'un programme Arduino. J'utilise la même adresse mac et IP.
- J'ai essayé de changer la version MQTT en la définissant dans le programme Arduino vers des versions plus anciennes.
- J'ai utilisé Wireshark pour surveiller le trafic Ethernet lorsque j'exécute le programme pour vérifier qu'une tentative de connexion est en cours.
Mon programme Arduino :
Remarque : tout se compile et le programme s'exécute correctement, mais il est incapable de se connecter au serveur 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("");
}
Commande depuis Raspberry Pi
mosquitto_sub -d -u user -P pass -t dev/test
Je l'utilise pour voir les messages lorsqu'ils arrivent du pi.
où ça échoue...
mqttClient.setServer(server, 1883);
if (mqttClient.connect("myClientID","user","pass"))
{
//error message
}
Réflexions sur les problèmes potentiels :
La plupart des exemples que j'ai vus de projets similaires - les gens utilisent "test.mosquitto.org" comme nom de serveur, mais parce que j'ai configuré mon propre serveur MQTT sur mon raspberry pi, j'utilise plutôt l'adresse IP du raspberry pi comme serveur Nom. Cela a fonctionné lorsque je me suis connecté à partir de mon PC à l'aide d'un script python, mais je ne sais pas s'il s'agit d'un problème dans mon programme Arduino.
J'espère avoir fourni suffisamment d'informations. S'il vous plaît laissez-moi savoir s'il y a quelque chose d'autre que vous pourriez vouloir voir qui pourrait aider - j'apprécie tous les commentaires.
Réponses
Il semble que vous définissiez l'adresse IP de votre appareil pour qu'elle soit la même que celle de votre serveur Raspberry Pi.
IPAddress ip(192, 168, 1, 23);
const char* server = "192.168.1.23";
Cela ne marchera pas. Faites de l'IP de l'appareil quelque chose de différent, comme IPAddress ip(192, 168, 1, 24)
.