Go Down

Topic: Função callback MQTT. Posso usar mais de uma vez no mesmo programa? (Read 249 times) previous topic - next topic

ft7

Code: [Select]

#include <SPI.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Update these with values suitable for your network.
byte mac[]    = {  0xDE, 0xED, 0xBA, 0xFE, 0xFE, 0xED };
IPAddress ip(172, 16, 0, 100);
IPAddress server(172, 16, 0, 2);

// Callback function header
void callback(char* topic, byte* payload, unsigned int length);

EthernetClient ethClient;
PubSubClient client(server, 1883, callback, ethClient);

// Callback function
void callback(char* topic, byte* payload, unsigned int length) {
  // In order to republish this payload, a copy must be made
  // as the orignal payload buffer will be overwritten whilst
  // constructing the PUBLISH packet.

  // Allocate the correct amount of memory for the payload copy
  byte* p = (byte*)malloc(length);
  // Copy the payload to the new buffer
  memcpy(p,payload,length);
  client.publish("outTopic", p, length);
  // Free the memory
  free(p);
}

void setup()
{

  Ethernet.begin(mac, ip);
  if (client.connect("arduinoClient")) {
    client.publish("outTopic","hello world");
    client.subscribe("inTopic");
  }
}

void loop()
{
  client.loop();
}


Esse código refere-se à função callback utilizada no protocolo MQTT. Mais epecificamente na biblioteca
PubSubClient.h

Alguém pode me informar se é possível ter mais de um callback no mesmo programa?
Ou seja, um callback para cada tópico que eu desejar. Fiz um programa utilizando 2 callbacks, mas notei que somente o último declarado funcionou. Será que não que não existe essa possibilidade ou foi um erro meu?

Se é possível, podem me dar um exemplo?

hugo007

Boas
Apenas podes ter uma funçao de callback, o segredo é filtrares o topico que eventualmente tenhas subscrito e atuares de acordo com isso.Vejamos:
Code: [Select]
void callback(char* topic, byte* payload, unsigned int length) {
if (strcmp(topic,"pir1Status")==0)
  // whatever you want for this topic
}

No teu codigo subscreveste varios topicos:
Code: [Select]

    client.subscribe("topic1");
    client.subscribe("topic2");
    client.subscribe("topicX");
    client.subscribe("topicY");

Nota que o callback recebe como parametro um ponteiro para o topico logo dentro do callback consegues filtar e actuar usando algo :
Code: [Select]


void callback(char* topic, byte* payload, unsigned int length) {
  if (strcmp(topic,"topic1")==0){
    // Faz algo ..
  }
 
  if (strcmp(topic,"topic2")==0) {
     // Faz algo ..
  }
 
  if (strcmp(topic,"topicX")==0) {
     // Faz algo ..
  } 
 
  if (strcmp(topic,"topicY")==0) {
     // Faz algo ..
  } 
}


Espero que te ajude.
Bons estudos
Debian,Mint,Ubuntu
Arduino Mega 2560
Arduino Nano
Arduino Duemilanove
MAC OS Montain Lion
Raspberry PI Model B


Go Up