Mosquitto - 订阅一个经纪人并使用 C 推送到另一个经纪人
Mosquitto - subscribe to one broker and push to another using C
是否有可能,如果可以,如何将使用 libmosquit 的应用程序从一个代理获取消息并将其发布到另一个代理?
在 mosquito_publish 函数中更改主题非常简单,但是在
中设置代理
mosquitto_connect(mosq, "localhost",1883 , 60);
运行mosquitto_connet第二次
例如
mosquitto_connect(mosq, "mqtt.example.io",1883 , 60);
最终连接到最后一个。
我试图创建两个 mosquitto 结构,但我不知道如何通知第二个关于消息表单子通道的信息,以便从中获取信息、更改它并推送到适当的代理。
是的,
您需要两个完全独立的客户端实例。这意味着 mosquitto_new()
函数返回 mosquitto
结构的两个单独实例。每个经纪人一个。
目前您正在重复使用相同的结构,因此它只包含最后一次调用 mosquitto_connect()
的详细信息
像这样的东西应该可以完成工作(不过我还没有测试过)。您必须添加错误检查。
#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 的命令行可以完成这项工作:
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 ; }
如果您只是想转发消息,那么在 mosquitto broker 中有一个 'bridge' 功能。它通过配置使它更容易。它有一个功能,您可以在其中指定要转发的主题以及身份验证选项。它的功能非常丰富。
是否有可能,如果可以,如何将使用 libmosquit 的应用程序从一个代理获取消息并将其发布到另一个代理?
在 mosquito_publish 函数中更改主题非常简单,但是在
中设置代理mosquitto_connect(mosq, "localhost",1883 , 60);
运行mosquitto_connet第二次 例如
mosquitto_connect(mosq, "mqtt.example.io",1883 , 60);
最终连接到最后一个。
我试图创建两个 mosquitto 结构,但我不知道如何通知第二个关于消息表单子通道的信息,以便从中获取信息、更改它并推送到适当的代理。
是的,
您需要两个完全独立的客户端实例。这意味着 mosquitto_new()
函数返回 mosquitto
结构的两个单独实例。每个经纪人一个。
目前您正在重复使用相同的结构,因此它只包含最后一次调用 mosquitto_connect()
像这样的东西应该可以完成工作(不过我还没有测试过)。您必须添加错误检查。
#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 的命令行可以完成这项工作:
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 ; }
如果您只是想转发消息,那么在 mosquitto broker 中有一个 'bridge' 功能。它通过配置使它更容易。它有一个功能,您可以在其中指定要转发的主题以及身份验证选项。它的功能非常丰富。