Mosquitto - подписывайтесь на одного брокера и нажимайте на другого с помощью C

Возможно ли, и если да, то как заархивировать, чтобы одно приложение с помощью libmosquit получало сообщения от одного брокера и публиковало их для другого?

Схема

Достаточно просто изменить тему в функции mosquito_publish, но набор брокера происходит в

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

Запуск mosquitto_connet второй раз, например.

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

заканчивается подключением к последнему.

Я попытался создать две структуры mosquitto, но я не знаю, как сообщить второй о канале субстрата формы сообщения, чтобы получить от него информацию, изменить ее и отправить соответствующему брокеру.


person pzydziak    schedule 31.05.2017    source источник
comment
конечно, другой вопрос, почему вы не можете просто соединить двух брокеров вместо того, чтобы использовать клиента в середине?   -  person hardillb    schedule 31.05.2017
comment
Мне нужно изменить содержание сообщений для публикации на основе сообщений от первого брокера.   -  person pzydziak    schedule 31.05.2017


Ответы (3)


Что-то вроде этого должно сработать (хотя я это не тестировал). Вам нужно будет добавить проверку ошибок.

#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;
}
person ralight    schedule 31.05.2017
comment
Спасибо, я уже справился с этой проблемой, но благодаря вашему ответу я знаю, как использовать третий mosquitto_new arg. - person pzydziak; 31.05.2017

Да,

Вам нужны два совершенно разных экземпляра client. Это означает два отдельных экземпляра структуры mosquitto, возвращаемых функцией mosquitto_new(). По одному на каждого брокера.

В настоящий момент вы повторно используете ту же структуру, поэтому она содержит только сведения о последнем вызове mosquitto_connect()

person hardillb    schedule 31.05.2017

Эта командная строка с использованием mosquitto может выполнить эту работу:

mosquitto_sub -h localhost -t '#'  | {  while [ 1 -lt 2 ] ;   do   read message ;   if [[ "$message" != "$prev_message" ]]; then  mosquitto_pub -h localhost -t "tenewtest" -m "$message" ; prev_message=$message ; fi ;    done ;  }
person Dev    schedule 19.05.2020
comment
Вы пропустили требование изменять сообщение по ходу до середины (в комментариях под вопросом) - person hardillb; 19.05.2020
comment
Да, это просто проход. Опубликовать можно на другом сервере. Вы также можете изменить сообщение после прочтения. - person Dev; 19.05.2020