2017-05-31 7 views
1

Ist es möglich und wenn ja, wie es zu archivieren, dass eine Anwendung mit libmosquitto Nachrichten von einem Broker zu erhalten und zu einem anderen zu veröffentlichen?Mosquitto - Abonnieren Sie einen Broker und Push zu einem anderen mit C

Schematics

Es ist ziemlich einfach nur Thema mosquito_publish Funktion in sich ändern, aber Satz von Broker findet in

mosquitto_connect(mosq, "localhost",1883 , 60); 

Lauf mosquitto_connet zweites Mal z.B.

mosquitto_connect(mosq, "mqtt.example.io",1883 , 60); 

endet Verbinden einer dauern.

Ich habe versucht, zwei Mosquitto-Strukturen zu erstellen, aber ich weiß nicht, wie man den zweiten über den Nachrichtenformular-Subbed-Kanal informiert, um Informationen von ihm zu erhalten, ihn zu ändern und zum richtigen Broker zu wechseln.

+0

natürlich ist die andere Frage hier, warum Sie nicht einfach die 2 Makler überbrücken können, anstatt einen Kunden in der Mitte zu verwenden? – hardillb

+0

Ich muss den Inhalt von zu veröffentlichenden Nachrichten basierend auf Nachrichten von einem ersten Broker ändern. – pzydziak

Antwort

2

So etwas hält, sollte die Arbeit tun (ich habe es allerdings nicht getestet). Sie müssen eine Fehlerprüfung hinzufügen.

#include <stdio.h> 
#include <mosquitto.h> 


void on_connect1(struct mosquitto *mosq, void *obj, int result) 
{ 
    int rc = MOSQ_ERR_SUCCESS; 

    if(!result){ 
     mosquitto_subscribe(mosq, NULL, "/v1/topic1", 0); 
    }else{ 
     fprintf(stderr, "%s\n", mosquitto_connack_string(result)); 
    } 
} 

void on_message1(struct mosquitto *mosq, void *obj, const struct mosquitto_message *message) 
{ 
    struct mosquitto *mosq2 = (struct mosquitto *)obj; 

    mosquitto_publish(mosq, NULL, "/v1/topic2", message->payloadlen, message->payload, message->qos, message->retain); 
} 

int main(int argc, char *argv[]) 
{ 
    struct mosquitto *mosq1, *mosq2; 

    mosquitto_lib_init(); 

    mosq2 = mosquitto_new(NULL, true, NULL); 
    mosq1 = mosquitto_new(NULL, true, mosq2); 

    mosquitto_connect_callback_set(mosq1, on_connect1); 
    mosquitto_message_callback_set(mosq1, on_message1); 

    mosquitto_connect(mosq2, "mqtt.example.io", 1883, 60); 
    mosquitto_connect(mosq1, "localhost", 1883, 60); 

    mosquitto_loop_start(mosq2); 
    mosquitto_loop_forever(mosq1, -1, 1); 

    mosquitto_destroy(mosq1); 
    mosquitto_destroy(mosq2); 

    mosquitto_lib_cleanup(); 

    return 0; 
} 
+0

Danke, ich habe dieses Problem schon gemeistert, aber dank deiner Antwort weiß ich, wie man mosquitto_new arg benutzt. – pzydziak

1

Ja,

Sie benötigen zwei völlig separate Client-Instanzen. Das bedeutet zwei getrennte Instanzen die Struktur, die von der mosquitto_new() Funktion zurückgegeben wird. Eine für jeden Makler.

Im Moment Sie die gleiche Struktur wiederverwenden, so dass es nur die Details des letzten Anrufs mosquitto_connect()

Verwandte Themen