J'ai un problème concernant ma carte MKR WAN 1310 qui n'arrive pas à se connecter à mon MQTT Broker situé sur ma Raspberry Pi 4. J'utilise une passerelle LoRa entre les deux pour un projet, j'ai bien configuré le service MQTT sur ma Raspberry Pi (Le service démarre bien, il envoie et reçois des données de Node Red) mais du côté de mon PC rien ne se fait, rien ne s'envoie lorsque j'execute mon programme. La seule requête qui s'envoie est la requête à la passerelle LoRa qui est un succès, mais la requête MQTT ne passe pas et reste bloqué à "Attempting MQTT connection" et je n'ai pas de message d'erreurs...
Voici le code :
#include <MKRWAN.h>
#include <DHT.h>
#include <LoRa.h>
#include <PubSubClient.h>
#define DHTTYPE DHT11 // DHT 11
const char *appEui = "***************";
const char *appKey = "**********************************";
const char *mqtt_server = "127.0.1.1";
const int mqtt_port = 1883;
const char *topic_temperature = "iotfrontier/temperature";
const char *topic_humidity = "iotfrontier/humidity";
const int DHTPin = 2;
DHT dht(DHTPin, DHTTYPE);
LoRaModem modem;
PubSubClient client;
const unsigned long interval = 30000; // Interval de mesure de 30 secondes
unsigned long previousMillis = 0;
void setup_lora() {
Serial.begin(115200);
while (!Serial);
if (!modem.begin(EU868)) {
Serial.println("Failed to start module");
while (1) {}
}
Serial.println("LoRa module started");
int connected = modem.joinOTAA(appEui, appKey);
if (!connected) {
Serial.println("Something went wrong; are you indoor? Move near a window and retry");
while (1) {}
}
Serial.println("OTAA joined");
}
void callback(char *topic, byte *message, unsigned int length) {
Serial.print("Message arrived on topic: ");
Serial.print(topic);
Serial.print(". Message: ");
String messageTemp;
for (int i = 0; i < length; i++) {
Serial.print((char)message[i]);
messageTemp += (char)message[i];
}
Serial.println();
if (strcmp(topic, topic_temperature) == 0) {
// Convert temperature from string to float
float temperatureC = messageTemp.toFloat();
float temperatureF = (temperatureC * 9/5) + 32;
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.print(" ºC / ");
Serial.print(temperatureF);
Serial.println(" ºF");
} else if (strcmp(topic, topic_humidity) == 0) {
// Convert humidity from string to float
float humidity = messageTemp.toFloat();
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
}
}
void setup() {
dht.begin();
setup_lora();
client.setServer(mqtt_server, mqtt_port);
client.setCallback(callback);
}
void reconnect() {
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
if (client.connect("MKRWANClient")) {
Serial.println("connected");
client.subscribe(topic_temperature);
client.subscribe(topic_humidity);
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
delay(5000);
}
}
}
void loop() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
float humidity = dht.readHumidity();
float temperatureC = dht.readTemperature();
if (isnan(humidity) || isnan(temperatureC)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Envoie des données via LoRa
LoRa.beginPacket();
LoRa.print("Humidity: ");
LoRa.print(humidity);
LoRa.print(" %, Temperature: ");
LoRa.print(temperatureC);
LoRa.println(" ºC");
LoRa.endPacket();
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println(" %");
Serial.print("Temperature: ");
Serial.print(temperatureC);
Serial.println(" ºC");
}
if (!client.connected()) {
reconnect();
}
client.loop();
}
Si vous avez des solutions pour palier ce problème, je suis preneur
Ceci laisse penser que tu utilses LoRaWAN (réseau étendu ) et non seulement LoRa
Quel réseau utilises tu ? réseau LoRAWAN public ? (TTN, Orange....) , réseau LoRAWAN privé ?
Où est le serveur LoRaWAN qui accepte et décrypte les trames émises par ta carte MKRWAN1310 et effectue la publication sur ton serveur MQTT ?
En quoi consiste ta 'passerelle LoRa', elle fait passerelle entre quoi et quoi ? (en général entre, d'une part des capteurs et d'autre part un serveur LoRAWAN )
(dans mon cas ma passerelle légère TTIG relaie les trames LoRAWAN émises par diverses cartes vers un serveur 'The Things Networks' situé en Irlande. Ce serveur décrypte les trames et, si je lui demande, publie des données vers le broker MQTT de mon choix )
J'utilise un réseau LoRaWAN public (TTN), et j'ai limite la même passerelle légère que vous, et le serveur est situé pareil que vous en Irelande. Ma passerelle LoRa consiste à faire passerelle entre ma carte MKR WAN 1310 et ma raspberry Pi, pour un projet de ruche connecté
Ma passerelle LoRa consiste à faire passerelle entre ma carte MKR WAN 1310 et ma raspberry Pi
La passerelle TTIG ne peut en aucun cas faire un lien direct entre ta carte MKRWAN1310 et ton Raspberry PI
Tout passes par les serveurs TTN, elle ne connait rien d'autre sur Internet !
Assures toi dans le Backoffice de TTN :
-que ta passerelle voit et relaie sous forme cryptée les trames émises par ta carte (Console/ Go To Gateways)
-que le serveur reçoit bien les trames émises par ta carte MKRWAN , puis relayées par ta passerelle . (Console / Goto Applications) A ce niveau tu dois enfin pouvoir retrouver 'en clair , décryptées , les données émises par la carte MKR
-Si tout ça est OK sélectionnes ton 'Device' puis va dans Integration/MQTT pour configurer le lien vers ton broker MQTT
Merci pour vos réponses rapide, dès que j'ai mon matériel à disposition j'essayerai tout sa, mais normalement c'est censé être bon car ma passerelle recevait bien les données sous formes crypté, et pareil pour le serveur qui recevait bien les trames émise par ma carte, mais du coup comment les données de température et d'humidité vont être envoyé sur la raspberry? Et doi-je modifier/rajouter quelque chose à mon code?
pour répondre à cette question il me faudrait réviser , j'ai oublié
de mémoire , dans les grandes lignes :
The Things Networks offre son broker MQTT (en Irlande avec les autres serveurs)
Tout 'device' y publie implicitement des données dans une structure de topics prédéfinie.
Ton Raspberry PI doit juste s'y connecter pour souscrire à certains topics
SI c'est bien ça , reste à comprendre comment former les trames à émettre à partir de ta carte
Des infos ici : Data API (MQTT) | The Things Network
j'ai peut être dans un coin un ou deux sketches 'étudiés pour'
Merci pour tout les renseignements indiquées, j'ai mon matériel demain j'essayerai tout et si j'ai le moindre problème ou la moindre questions je demanderai directement sur ce topic, en tout cas merci de m'avoir aidé
Le code que tu a mis en #1 n'a aucune chance de fonctionner, faute de WiFi ou d'Ethernet ta carte MKRWAN 1310 n'a aucun moyen de connection au broker MQTT de la carte Raspberry Pi
Si tu envisages de passer par le réseau LoRAWAN 'The Thing Maker/ The Things Stack' , ta carte MKR n'a pas à gérer elle même protocole MQTT avec la bibliothèque PubSubClient comme tu le fais.
Elle se contentera d'envoyer sur le serveur TTN des trames contenant les valeurs mesurées, TTN se chargera de les publier dans son Broker , à disposition de tout client MQTT souhaitant souscrire à tel ou tel topic crée par TTN
MQTT ça deviendra pour toi l'affaire exclusive de TTN et de ton RaspberryPI,
La carte MKR se limitant à transmettre des valeurs qui aboutiront automatiquement dans des topics MQTT
Je dois rajouter quoi au code afin qu'il puisse être fonctionnel pour une connexion MQTT de ma carte à ma passerelle? Et je dois enlever quoi pour éviter tout conflits/problème dans le programme s'il te plait?
je ne suis plus en mesure d'entrer dans les détails (méconnaissance des cartes MKRWAN non retenues pour mes usages de LoRaWAN, mémoire défaillante, notes non retrouvées, temps disponible.....)
Dans les grandes lignes :
Enlèves dans ton programme pour MKRWAN 1310 toute référence au protocole MQTT, ce n'est pas son affaire, MQTT ne passe pas par LoRaWAN Il est impossible de connecter la carte MKRWAN1310 à un broker MQTT via LoRAWAN .
Contentes toi de demander à ta carte MKR d'envoyer au serveur TTN les mesures issues du DHT11, vérifies qu'elles arrivent correctement dans le 'payload' décrypté .
Nombreux tutoriels pour apprendre à faire cela , y compris le paramétrage du 'payload formatter'
Quand ce sera fonctionnel : connectes ton Raspberry PI (avec mosquitto sans doute) au broker MQTT de The Things Networks et souscris aux topics créés d'office par TTN pour mettre à disposition les valeurs numériques reçues de la carte MKR via LoRaWAN
D'accord sa marche merci pour la réponse, je comprends mieux comment cela fonctionne, je vais me renseigner pour le payload et mettre sa en place afin de recevoir les données de température et d'humidité
j'ai lancé le client MQTT.FX pour ordinateur de bureau pour explorer rapidement l'utilisation de MQTT pour récupérer mes données sur le broker de TTN
je résume :
Ta carte MKRWAN1310 est définie dans le réseau LoRaWAN comme un 'device' appartenant à une 'application'
Supposons qu'il s'agisse du device 'ruche1' dans l'application 'gest_ruches'
The Thing Networks établit de lui même une terminaison MQTT pour ton application 'gest-ruches' et te fournit les identifiants de connection à son broker sur la page Integrations/MQTT de l'application (username et password)
Tu peux donc y connecter ton client MQTT puis lui faire souscrire au topic suivant :
v3/gestion_ruches@ttn/devices/ruche1/up
Ce topic contient un descriptif exhaustif de la dernière trame LoRaWAN reçue de ta carte MKRWAN1310
C'est au format json sur presque 2ko, il te reste à en extraire le contenu de l'item 'decoded_payload'
exemple pour un de mes capteurs : la partie du topic MQTT comportant la valeur 33.28 destinée au final à ThingSpeak, d'où l'ajout de field1