probleme de pointeur ou de type (je crois)

bonjour
je débute en c avec 2 esp32, j’ai fait un ESP32 qui envoit sa position GPS a un serveur MQTT sous la forme
{ “latitude” : “47.65478546” , “longitude” : “2.36545216”, “altitude” : “1230” }

Je cherche maintenant a récuperer ces valeurs sur l’autre ESP.

je re oit bien le feed MQTT grace au code suivant :

  MQTT_connect();
  
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(10))) {
    if (subscription == &target_01) {
      Serial.print(F("Got: "));
      Serial.println((char *)target_01.lastread);
      
      uint8_t*      mqtt_position = target_01.lastread;

    }
  }

je récupere bien la bonne chaine sur le port com

connected to mqtt
Got: { "latitude" : "47.65478546" , "longitude" : "2.36545216", "altitude" : "1230" }

jusque la ça va. la ou ça se gate, c’est pour récuperer les valeurs latitude, longitude et altitude.

j’ai donc ajouté cette ligne

uint8_t*      mqtt_position = target_01.lastread;

ceci dans le but de récuperer la valeur de target_01.lastread
le type uinit8_t* est imposé par le compilateur, c’est donc un pointeur n’est ce pas ?

j’ai donc poursuivi comme ceci :

DynamicJsonDocument doc(1024);
deserializeJson(doc, &mqtt_position);
Serial.print(doc["latitude"]); 
[code]


j'ai alors l'erreur suivante a la compilation :
[code]
call of overloaded 'print(ArduinoJson6172_91::enable_if<true, ArduinoJson6172_91::MemberProxy<ArduinoJson6172_91::JsonDocument&, const char*> >::type)' is ambiguous

Je tourne en rond depuis 2 jours, alors que ça doit etre tout bete. Si une ame charitable pouvait m’aider a comprendre pourquoi ca ne fonctionne pas ce serait deja une belle avancée^^

Afin de ne pas décourager ceux qui te lisent,va sur le lien quickedit en bas à droite de ton premier post, ce qui va permettre de le modifier. Puis remplace les <> par . Pour mettre des balises on peut les écrire à la main (mais avec des et pas des <>) ou passer par l’icône </>

ne pas poster de snippets (Snippets R Us!) SVP

on ne sait pas trop ce qu’est target_01…

Si c’est une cString dans last read, il faut un char* et pas un uint8_t*char* mqtt_position = (char*) target_01.lastread;

Pour décoder, essayez comme cela

#include <ArduinoJson.h>

char json[] = "{\"latitude\" : \"47.65478546\" , \"longitude\" : \"2.36545216\", \"altitude\" : \"1230\" }";

void setup() {
  Serial.begin(115200);
  StaticJsonDocument<200> doc;
  DeserializationError erreur = deserializeJson(doc, json);
  if (erreur) {
    Serial.print(F("problème JSON "));
    Serial.println(erreur.c_str());
    return;
  }

  double latitude = doc["latitude"];
  double longitude = doc["longitude"];
  double altitude = doc["altitude"];

  Serial.print(F("latitude: ")); Serial.println(latitude, 6);
  Serial.print(F("longitude: ")); Serial.println(longitude, 6);
  Serial.print(F("altitude: ")); Serial.println(altitude, 0);
}

void loop() {}

le moniteur série (à 115200 bauds) affichera

[color=purple]
latitude: 47.654781
longitude: 2.365452
altitude: 1230
[/color]

c'est e que j'avais commencé par faire :
char* mqtt_position = (char*) target_01.lastread;
sauf que j'obtenais une erreur de conversion de type a la compilation qui m'a amené a utiliser ce uint8_t*

en rentrant je ferais un nouveau fichier avec juste ce qui concerne ce probleme pour pouvoir le poster en entier
merci

et bien le probleme est résolu !
merci pour le tuyau pour l'affichage du message d'erreru de deserializeJson
ça m'a permis de comprendre que mon code initial fonctionnait, le resultat etait vide en raison de l'absence de message mqtt.
je me suis ensuite lancé dans des essais hazardeux, le message d'erreur m'a sauvé
Merci beaucoup !

:slight_smile:

bonne continuation

bon bah en fait non, j’ai parlé trop vite .
il y a effectivement un cas de figure “json empty” mais quand je soumets un flux mqtt, j’ai alors json invalid
le code complet :

#include <WiFi.h>
#include <Wire.h>
#include "Adafruit_MQTT.h"
#include "Adafruit_MQTT_Client.h"
#include <ArduinoJson.h>

const char *ssid =  "***";     // Enter your WiFi Name
const char *pass =  "***";  // Enter your WiFi Password
const char *hname =  "***";  // Enter your WiFi Password

WiFiClient client;
#define MQTT_SERV ***
#define MQTT_PORT ***
#define MQTT_NAME ***
#define MQTT_PASS *** 

//nom des topics
char* TARGET_01_FEED="***";

//les objets 

//setup MQTT
Adafruit_MQTT_Client mqtt(&client, MQTT_SERV, MQTT_PORT, MQTT_NAME, MQTT_PASS);

//creation de l'objet subscription pour ce topic
Adafruit_MQTT_Subscribe target_01 = Adafruit_MQTT_Subscribe(&mqtt, TARGET_01_FEED );

void setup() {
  Serial.begin(115200);
  delay(10);
  Serial.println("Connecting to ");
  Serial.println(ssid);

  WiFi.config(INADDR_NONE, INADDR_NONE, INADDR_NONE);
  WiFi.setHostname(hname);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");              // print ... till not connected
  }
  Serial.println("");
  Serial.println("WiFi connected");
  
  //subscribe to mqtt feed  
  mqtt.subscribe(&target_01);
 
}
void loop() {
 
 uint8_t* mqtt_position;
 
 //connexion au serveur MQTT
  MQTT_connect();

  // recuperation du flux MQTT
  Adafruit_MQTT_Subscribe *subscription;
  while ((subscription = mqtt.readSubscription(10))) {
    if (subscription == &target_01) {
      Serial.print(F("Got: "));
      Serial.println((char *)target_01.lastread);
      Serial.println();

           mqtt_position = target_01.lastread;
           
    }
  }

  char json[] = "{\"latitude\" : \"47.65478546\" , \"longitude\" : \"2.36545216\", \"altitude\" : \"1230\" }";
  
  StaticJsonDocument<200> doc;
  //DeserializationError erreur = deserializeJson(doc, json); //=>ça marche
 // DeserializationError erreur = deserializeJson(doc, mqtt_position);//afffichage d'une erreur "probleme JSON InvalidInput" sur le port com
 // DeserializationError erreur = deserializeJson(doc, (char)mqtt_position); //erreur de compilation cast from 'uint8_t* {aka unsigned char*}' to 'char' loses precision [-fpermissive]

  if (erreur) {
    Serial.print(F("problème JSON "));
    Serial.println(erreur.c_str());
    return;
  }

  double latitude = doc["latitude"];
  double longitude = doc["longitude"];
  double altitude = doc["altitude"];

  Serial.print(F("latitude: ")); Serial.println(latitude, 6);
  Serial.print(F("longitude: ")); Serial.println(longitude, 6);
  Serial.print(F("altitude: ")); Serial.println(altitude, 0);
  Serial.println();
    
  delay(5000);
}
void MQTT_connect()
{
  int8_t ret;
  // Stop if already connected.
  if (mqtt.connected())
  {
    return;
  }
  
    Serial.println("connecting to mqtt");
  uint8_t retries = 3;
  while ((ret = mqtt.connect()) != 0) // connect will return 0 for connected
  {
    
       Serial.print(".");
    mqtt.disconnect();
    delay(5000);  // wait 5 seconds
    retries--;
//    if (retries == 0)
//    {
      // basically die and wait for WDT to reset me
//      while (1);
//    }
  }
}

Vous obtenez le json ou pas ? Quelle taille ?

non, j'avais une erreur de type
j'ai finit par trouver, c'etait tout bete, il suffisait de remplacer

[color=#222222]uint8_t* mqtt_position = target_01.lastread;[/color]
[color=#222222]

par

char* mqtt_position = (char*)target_01.lastread;
[color=#222222]

et effectivement c'est logique ^^

Ok ca on l’avait dit en #2 :wink:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.