【问题标题】:Mosquitto - subscribe to one broker and push to another using CMosquitto - 订阅一个代理并使用 C 推送到另一个代理
【发布时间】:2017-05-31 07:04:54
【问题描述】:

是否有可能,如果可以,如何归档一个应用程序使用 libmosquit 从一个代理获取消息并将其发布到另一个?

只需在蚊子发布函数中更改主题非常简单,但一组代理发生在

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

第二次运行 mosquitto_connet 例如

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

最终连接到最后一个。

我尝试创建两个 mosquitto 结构,但我不知道如何通知第二个有关消息表单子通道的信息,以便从中获取信息、更改它并推送到适当的代理。

【问题讨论】:

  • 当然,这里的另一个问题是为什么你不能只连接两个代理,而不是在中间使用客户端?
  • 我必须根据来自第一个代理的消息修改要发布的消息内容。

标签: c mqtt iot libmosquitto


【解决方案1】:

这样的东西应该可以完成这项工作(虽然我还没有测试过)。您必须添加错误检查。

#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;
}

【讨论】:

  • 谢谢,我已经解决了这个问题,但是感谢您的回答,我知道如何使用第三个 mosquitto_new arg。
【解决方案2】:

是的,

您需要两个完全独立的客户端实例。这意味着mosquitto_new() 函数返回的mosquitto 结构的两个单独实例。每个经纪人一个。

目前您正在重新使用相同的结构,因此它只保存上次调用mosquitto_connect()的详细信息

【讨论】:

    【解决方案3】:

    这个使用 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 ;  }
    

    【讨论】:

    • 你错过了中途修改消息的要求(在问题下的cmets中)
    • 是的,这只是一个传递。发布可以在不同的服务器上完成。您也可以在阅读后更改消息。
    【解决方案4】:

    如果您只是想转发消息,那么 mosquitto 代理中有一个“桥”功能。它通过配置使其更容易。它具有一项功能,您可以在其中指定要转发的主题以及身份验证选项。它的功能非常丰富。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-22
      • 1970-01-01
      • 2021-06-03
      • 2016-02-17
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多