Arduino MQTT

Bonjour,

je rencontre actuellement un soucis de programmation

j'ai un programme principal (Remora.ino) dans lequel je fais appel à la bibliothèque PubSubClient (MQTT).
Je déclare tout au sein du fichier Remora.ino (la connexion, la souscription à des messages, l'envoi de messages) et tout fonctionne très bien.

Associés à mon fichier Remora.ino, j'ai plusieurs fichiers de librairie (i2c, fils pilotes, ...).

Dans un de ces fichiers de librairie, j'ai besoin d'envoyer un message MQTT mais j'ai un problème de portée de mon constructeur PubSubClient (j'ai l'erreur client was not declared in this scope à la compilation).

Je n'arrive pas à déclarer le constructeur en extern.

Est ce que quelqu'un a une idée sur comment faire?

Merci beaucoup.

Franchement, sans une seule ligne de code, comment veux-tu que quelqu'un t'aide ?

Désolé mais le code est tellement long que je ne voulais pas polluer le message mais je vais mettre quelques morceaux de code

Remora.ino

#include <PubSubClient.h>

WiFiClient espClient;
PubSubClient client(espClient);

boolean MQTT_Connect()
{
  Serial.print("Attente connexion MQTT...");
  // Attente connexion
  if (client.connect("ESP8266_Client"))
  {
    Serial.println("connecte");
    // Once connected, publish an announcement...
    client.publish("Remora/State","ESP8266/connecté");
    // ... and resubscribe
    client.subscribe("Remora/Actuator/Relais");
    client.subscribe("Remora/Actuator/FP");
    client.subscribe("Remora/Actuator/AllFP");
  }
  else
  {
    Serial.print("failed, rc=");
    Serial.println(client.state());
  }
}

void setup()
{

  // says main loop to do setup
  first_setup = true;

  // Init de la téléinformation
  Serial.begin(1200, SERIAL_7E1);

  // Init MQTT
  client.setServer(DEFAULT_MQTT_SERVER, DEFAULT_MQTT_PORT);
  client.setCallback(MQTT_Receipt);

  Serial.println("Demarrage programme principal");
  Serial.flush();

}

void loop()
{
  static bool lastcloudstate;
  bool currentcloudstate ;

  #ifdef MOD_MQTT
    if (!client.connected())
    {
      MQTT_Connect();
    }
    // Réception d'une info MQTT
    client.loop();
  #endif

  // recupération de l'état de connexion au Wifi
  currentcloudstate = WiFi.status()==WL_CONNECTED ? true:false;

  // La connexion cloud vient de changer d'état ?
  if (lastcloudstate != currentcloudstate)
  {
    // Mise à jour de l'état
    lastcloudstate=currentcloudstate;

    // on vient de se reconnecter ?
    if (currentcloudstate)
    {

    }
    else
    {
      // on compte la deconnexion led rouge
      my_cloud_disconnect++;
      Serial.print("Perte de connexion au cloud #");
      Serial.println(my_cloud_disconnect);
    }
  }

}

Cette partie de code fonctionne très bien (j'ai pas mis dans le code la fonction de réception des messages MQTT) et j'envoi et réceptionne les messages sans problème.

Maintenant j'ai d'autres librairies associées (je ne met pas le code car pas d'utilité) dans lesquelles j'ai besoin d'appeler la fonction

client.publish("Remora/State","xxxxx");

A la compilation je rencontre l'erreur client was not declared in this scope

Je voudrais déclarer client en externe mais ça ne fonctionne pas.

Merci

Bonjour,

Il faut que tu déclares client dans tes 'librairies'

#include <PubSubClient.h>
extern PubSubClient client;

Bonjour,

merci de ta réponse kamill, ça marche effectivement mais maintenant je rencontre un dernier soucis

j'ai intégré dans une fonction, l'appel de client.publish()

void MQTT_Send(topic, msg)
{
...
traitement de topic et msg
...

client.publish(topic, msg)
}

Je réalisé l'appel de la fonction MQTT_Send depuis plusieurs endroits avec à chaque fois des paramètres différents donc forcément je rencontre des problèmes de conversion. Voici les différents types utilisés :

client.publish (const char topic, const char msg)

1er appel de MQTT_Send : MQTT_Send(uint8_t fp, char cOrdre)
2éme appel de MQTT_Send : MQTT_Send(char * name, char * value)
3 âme appel de MQTT_Send : MQTT_Send("Bonjour", int etatrelais)

Si quelqu'un à une idée pour le choix du type des paramètres topic et const de la fonction MQTT_Send qui conviendront le mieux afin de simplifier les conversions

Merci beaucoup.

Bonjour,

Je ne sais pas si j'ai bien compris ta question, mais si tu as besoin que MQTT_Send accepte des paramètres de type différents tu peux (et tu dois) écrire plusieurs versions de MQTT_Send qui vont accepter ces paramètres.

Merci de ta réponse,

en fait dans la fonction MQTT_Send, j'appel au final toujours la même fonction à savoir client.publish qui accepte en entrée 2 paramètres de type const char.

Je ne peux donc pas créer plusieurs fonctions MQTT_Send

Si tu peux créer plusieurs fonctions MQTT_Send, il faut qu'elles n'acceptent pas le même type de paramaètres.
Par exemple ceci est tout à fait valide:

void MQTT_Send(uint8_t fp, char cOrdre)
{
  char buf[20];
  char buf2[20];
  sprintf(buf,"%d",fp);
  sprintf(buf2,"%c",cOrdre);
  
  client.publish (buf,buf2);
}

void MQTT_Send(char * name, char * value)
{
  client.publish (name,value);
}

void MQTT_Send(char *txt, int etatrelais)
{
  char buf[20];
  sprintf(buf,"%d",etatrelais);
  
  client.publish (txt,buf);
}

Bonjour,

merci Kamill pour tes réponses qui m'ont été d'une grande aide, je ne connaissais pas cette subtilité sur la possibilité de déclarer plusieurs fois la même fonction avec des paramètres différents.

Ma fonction d'envoi MQTT fonctionne très bien, je vais pouvoir déployer mon projet IoT.

Merci.