From b660283e64b9e26f5f23a0c0d996265a453c1a7c Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 9 Oct 2019 10:52:58 +0100 Subject: [PATCH] Basic MQTT v5 support for bridges. This gives equivalent behaviour as for v3.1.1/v3.1 bridges, there is no extra functionality yet. --- lib/send_connect.c | 2 +- man/mosquitto.conf.5.xml | 7 ++++--- mosquitto.conf | 2 +- src/bridge.c | 10 +++++++++- src/conf.c | 2 ++ 5 files changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/send_connect.c b/lib/send_connect.c index 0f13dee2..f3293cb8 100644 --- a/lib/send_connect.c +++ b/lib/send_connect.c @@ -141,7 +141,7 @@ int send__connect(struct mosquitto *mosq, uint16_t keepalive, bool clean_session packet__write_string(packet, PROTOCOL_NAME, strlen(PROTOCOL_NAME)); } #if defined(WITH_BROKER) && defined(WITH_BRIDGE) - if(mosq->bridge && mosq->bridge->try_private && mosq->bridge->try_private_accepted){ + if(mosq->bridge && mosq->bridge->protocol_version != mosq_p_mqtt5 && mosq->bridge->try_private && mosq->bridge->try_private_accepted){ version |= 0x80; }else{ } diff --git a/man/mosquitto.conf.5.xml b/man/mosquitto.conf.5.xml index 387ff36c..7d48703d 100644 --- a/man/mosquitto.conf.5.xml +++ b/man/mosquitto.conf.5.xml @@ -1505,9 +1505,10 @@ openssl dhparam -out dhparam.pem 2048 Set the version of the MQTT protocol to use with for this bridge. Can be one of - mqttv31 or - mqttv311. Defaults to - mqttv31. + mqttv50, + mqttv311 or + mqttv31. Defaults to + mqttv311. diff --git a/mosquitto.conf b/mosquitto.conf index 2117d9e8..a9b13d62 100644 --- a/mosquitto.conf +++ b/mosquitto.conf @@ -824,7 +824,7 @@ #bridge_attempt_unsubscribe true # Set the version of the MQTT protocol to use with for this bridge. Can be one -# of mqttv311 or mqttv11. Defaults to mqttv311. +# of mqttv50, mqttv311 or mqttv31. Defaults to mqttv311. #bridge_protocol_version mqttv311 # Set the clean session variable for this bridge. diff --git a/src/bridge.c b/src/bridge.c index 18cde94c..ed66a7ef 100644 --- a/src/bridge.c +++ b/src/bridge.c @@ -445,6 +445,7 @@ int bridge__on_connect(struct mosquitto_db *db, struct mosquitto *context) char *notification_topic; int notification_topic_len; char notification_payload; + int sub_opts; if(context->bridge->notifications){ notification_payload = '1'; @@ -478,7 +479,14 @@ int bridge__on_connect(struct mosquitto_db *db, struct mosquitto *context) } for(i=0; ibridge->topic_count; i++){ if(context->bridge->topics[i].direction == bd_in || context->bridge->topics[i].direction == bd_both){ - if(send__subscribe(context, NULL, 1, &context->bridge->topics[i].remote_topic, context->bridge->topics[i].qos, NULL)){ + sub_opts = context->bridge->topics[i].qos; + if(context->bridge->protocol_version == mosq_p_mqtt5){ + sub_opts = sub_opts + | MQTT_SUB_OPT_NO_LOCAL + | MQTT_SUB_OPT_RETAIN_AS_PUBLISHED + | MQTT_SUB_OPT_SEND_RETAIN_ALWAYS; + } + if(send__subscribe(context, NULL, 1, &context->bridge->topics[i].remote_topic, sub_opts, NULL)){ return 1; } }else{ diff --git a/src/conf.c b/src/conf.c index 171a6966..e4342571 100644 --- a/src/conf.c +++ b/src/conf.c @@ -1121,6 +1121,8 @@ int config__read_file_core(struct mosquitto__config *config, bool reload, struct cur_bridge->protocol_version = mosq_p_mqtt31; }else if(!strcmp(token, "mqttv311")){ cur_bridge->protocol_version = mosq_p_mqtt311; + }else if(!strcmp(token, "mqttv50")){ + cur_bridge->protocol_version = mosq_p_mqtt5; }else{ log__printf(NULL, MOSQ_LOG_ERR, "Error: Invalid bridge_protocol_version value (%s).", token); return MOSQ_ERR_INVAL;