/* Copyright (c) 2020-2021 Roger Light All rights reserved. This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 and Eclipse Distribution License v1.0 which accompany this distribution. The Eclipse Public License is available at https://www.eclipse.org/legal/epl-2.0/ and the Eclipse Distribution License is available at http://www.eclipse.org/org/documents/edl-v10.php. SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause Contributors: Roger Light - initial implementation and documentation. */ /* * This is an *example* plugin which demonstrates how to modify the topic of * a message after it is received by the broker and before it is sent on to * other clients. * * You should be very sure of what you are doing before making use of this feature. * * Compile with: * gcc -I -fPIC -shared mosquitto_topic_modification.c -o mosquitto_topic_modification.so * * Use in config with: * * plugin /path/to/mosquitto_topic_modification.so * * Note that this only works on Mosquitto 2.0 or later. */ #include #include #include "mosquitto_broker.h" #include "mosquitto_plugin.h" #include "mosquitto.h" #include "mqtt_protocol.h" #define PLUGIN_NAME "topic-modification" #define PLUGIN_VERSION "1.0" #define UNUSED(A) (void)(A) MOSQUITTO_PLUGIN_DECLARE_VERSION(5); static mosquitto_plugin_id_t *mosq_pid = NULL; static int callback_message(int event, void *event_data, void *userdata) { struct mosquitto_evt_message *ed = event_data; bool result; UNUSED(event); UNUSED(userdata); /* This simply removes "/uplink" from the end of every matching topic. You * can of course do much more complicated message processing if needed. */ mosquitto_topic_matches_sub("device/+/data/uplink", ed->topic, &result); if(result){ ed->topic[strlen(ed->topic) - strlen("/uplink")] = '\0'; } return MOSQ_ERR_SUCCESS; } int mosquitto_plugin_init(mosquitto_plugin_id_t *identifier, void **user_data, struct mosquitto_opt *opts, int opt_count) { UNUSED(user_data); UNUSED(opts); UNUSED(opt_count); mosq_pid = identifier; return mosquitto_callback_register(mosq_pid, MOSQ_EVT_MESSAGE, callback_message, NULL, NULL); }