[Gst/MQTT] bugfix: Change default values for pub/sub-topic and client-id
authorWook Song <wook16.song@samsung.com>
Tue, 20 Apr 2021 01:45:38 +0000 (10:45 +0900)
committerMyungJoo Ham <myungjoo.ham@samsung.com>
Thu, 29 Apr 2021 09:38:19 +0000 (18:38 +0900)
This patch changes the default values which are used when the values for
the pub/sub-topic and client-id properties are not given.

Signed-off-by: Wook Song <wook16.song@samsung.com>
gst/mqtt/mqttsink.c
gst/mqtt/mqttsrc.c

index 68e9a4b..0a1b948 100644 (file)
@@ -63,11 +63,14 @@ enum
   DEFAULT_MQTT_PUB_WAIT_TIMEOUT = 1,    /* 1 secs */
 };
 
+static guint8 sink_client_id = 0;
 static const gchar DEFAULT_MQTT_HOST_ADDRESS[] = "tcp://localhost";
 static const gchar DEFAULT_MQTT_HOST_PORT[] = "1883";
 static const gchar TAG_ERR_MQTTSINK[] = "ERROR: MQTTSink";
-const gchar *DEFAULT_MQTT_CLIENT_ID;
-const gchar *DEFAULT_MQTT_PUB_TOPIC;
+static const gchar DEFAULT_MQTT_CLIENT_ID[] = "$HOST_$PID_^[0-9][0-9]?$|^255$";
+static const gchar DEFAULT_MQTT_CLIENT_ID_FORMAT[] = "%s_%u_sink%u";
+static const gchar DEFAULT_MQTT_PUB_TOPIC[] = "$client-id/topic";
+static const gchar DEFAULT_MQTT_PUB_TOPIC_FORMAT[] = "%s/topic";
 
 /** Function prototype declarations */
 static void
@@ -162,10 +165,10 @@ gst_mqtt_sink_init (GstMqttSink * self)
 
   /** init mqttsink properties */
   self->num_buffers = DEFAULT_NUM_BUFFERS;
-  self->mqtt_client_id = (gchar *) DEFAULT_MQTT_CLIENT_ID;
+  self->mqtt_client_id = g_strdup (DEFAULT_MQTT_CLIENT_ID);
   self->mqtt_host_address = g_strdup (DEFAULT_MQTT_HOST_ADDRESS);
   self->mqtt_host_port = g_strdup (DEFAULT_MQTT_HOST_PORT);
-  self->mqtt_topic = (gchar *) DEFAULT_MQTT_PUB_TOPIC;
+  self->mqtt_topic = g_strdup (DEFAULT_MQTT_PUB_TOPIC);
   self->mqtt_pub_wait_timeout = DEFAULT_MQTT_PUB_WAIT_TIMEOUT;
   self->mqtt_conn_opts.cleansession = DEFAULT_MQTT_OPT_CLEANSESSION;
   self->mqtt_conn_opts.keepAliveInterval = DEFAULT_MQTT_OPT_KEEP_ALIVE_INTERVAL;
@@ -185,10 +188,6 @@ gst_mqtt_sink_class_init (GstMqttSinkClass * klass)
   GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
   GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass);
 
-  DEFAULT_MQTT_CLIENT_ID = g_strdup_printf ("%s/%u/%u", g_get_host_name (),
-      getpid (), g_random_int_range (0, 0xFF));
-  DEFAULT_MQTT_PUB_TOPIC = g_strdup_printf ("%s/topic", DEFAULT_MQTT_CLIENT_ID);
-
   GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, GST_MQTT_ELEM_NAME_SINK, 0,
       "MQTT sink");
 
@@ -198,8 +197,8 @@ gst_mqtt_sink_class_init (GstMqttSinkClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_MQTT_CLIENT_ID,
       g_param_spec_string ("client-id", "Client ID",
-          "The client identifier passed to the server (broker)",
-          DEFAULT_MQTT_CLIENT_ID, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          "The client identifier passed to the server (broker).", NULL,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class, PROP_MQTT_HOST_ADDRESS,
       g_param_spec_string ("host", "Host", "Host (broker) to connect to",
@@ -213,7 +212,7 @@ gst_mqtt_sink_class_init (GstMqttSinkClass * klass)
 
   g_object_class_install_property (gobject_class, PROP_MQTT_PUB_TOPIC,
       g_param_spec_string ("pub-topic", "Topic to Publish",
-          "The topic's name to publish", DEFAULT_MQTT_PUB_TOPIC,
+          "The topic's name to publish", NULL,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class,
@@ -414,6 +413,16 @@ gst_mqtt_sink_start (GstBaseSink * basesink)
       self->mqtt_host_port);
   int ret;
 
+  if (!g_strcmp0 (DEFAULT_MQTT_CLIENT_ID, self->mqtt_client_id)) {
+    self->mqtt_client_id = g_strdup_printf (DEFAULT_MQTT_CLIENT_ID_FORMAT,
+        g_get_host_name (), getpid (), sink_client_id++);
+  }
+
+  if (!g_strcmp0 (DEFAULT_MQTT_PUB_TOPIC, self->mqtt_topic)) {
+    self->mqtt_topic = g_strdup_printf (DEFAULT_MQTT_PUB_TOPIC_FORMAT,
+        self->mqtt_client_id);
+  }
+
   /**
    * @todo Support other persistence mechanisms
    *    MQTTCLIENT_PERSISTENCE_NONE: A memory-based persistence mechanism
@@ -690,8 +699,8 @@ gst_mqtt_sink_get_client_id (GstMqttSink * self)
 static void
 gst_mqtt_sink_set_client_id (GstMqttSink * self, const gchar * id)
 {
+  g_free (self->mqtt_client_id);
   self->mqtt_client_id = g_strdup (id);
-  g_free ((void *) DEFAULT_MQTT_CLIENT_ID);
 }
 
 /**
@@ -750,8 +759,8 @@ gst_mqtt_sink_get_pub_topic (GstMqttSink * self)
 static void
 gst_mqtt_sink_set_pub_topic (GstMqttSink * self, const gchar * topic)
 {
+  g_free (self->mqtt_topic);
   self->mqtt_topic = g_strdup (topic);
-  g_free ((void *) DEFAULT_MQTT_PUB_TOPIC);
 }
 
 /**
index daabf84..bf11167 100644 (file)
@@ -59,11 +59,13 @@ enum
   DEFAULT_MQTT_SUB_TIMEOUT_MIN = 1000000,       /* 1 seconds */
 };
 
+static guint8 src_client_id = 0;
 static const gchar DEFAULT_MQTT_HOST_ADDRESS[] = "tcp://localhost";
 static const gchar DEFAULT_MQTT_HOST_PORT[] = "1883";
 static const gchar TAG_ERR_MQTTSRC[] = "ERROR: MQTTSrc";
-const gchar *DEFAULT_MQTT_CLIENT_ID;
-const gchar *DEFAULT_MQTT_SUB_TOPIC;
+static const gchar DEFAULT_MQTT_CLIENT_ID[] =
+    "$HOSTNAME_$PID_^[0-9][0-9]?$|^255$";
+static const gchar DEFAULT_MQTT_CLIENT_ID_FORMAT[] = "%s_%u_src%u";
 
 /** Function prototype declarations */
 static void
@@ -139,10 +141,10 @@ gst_mqtt_src_init (GstMqttSrc * self)
   self->gquark_err_tag = g_quark_from_string (TAG_ERR_MQTTSRC);
 
   /** init mqttsrc properties */
-  self->mqtt_client_id = (gchar *) DEFAULT_MQTT_CLIENT_ID;
+  self->mqtt_client_id = g_strdup (DEFAULT_MQTT_CLIENT_ID);
   self->mqtt_host_address = g_strdup (DEFAULT_MQTT_HOST_ADDRESS);
   self->mqtt_host_port = g_strdup (DEFAULT_MQTT_HOST_PORT);
-  self->mqtt_topic = (gchar *) DEFAULT_MQTT_SUB_TOPIC;
+  self->mqtt_topic = NULL;
   self->mqtt_sub_timeout = (gint64) DEFAULT_MQTT_SUB_TIMEOUT;
   self->mqtt_conn_opts.cleansession = DEFAULT_MQTT_OPT_CLEANSESSION;
   self->mqtt_conn_opts.keepAliveInterval = DEFAULT_MQTT_OPT_KEEP_ALIVE_INTERVAL;
@@ -174,10 +176,6 @@ gst_mqtt_src_class_init (GstMqttSrcClass * klass)
   GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
   GstBaseSrcClass *gstbasesrc_class = GST_BASE_SRC_CLASS (klass);
 
-  DEFAULT_MQTT_CLIENT_ID = g_strdup_printf ("%s/%u/%u", g_get_host_name (),
-      getpid (), g_random_int_range (0, 0xFF));
-  DEFAULT_MQTT_SUB_TOPIC = g_strdup_printf ("%s/topic", DEFAULT_MQTT_CLIENT_ID);
-
   GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, GST_MQTT_ELEM_NAME_SRC, 0,
       "MQTT src");
 
@@ -207,8 +205,8 @@ gst_mqtt_src_class_init (GstMqttSrcClass * klass)
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class, PROP_MQTT_SUB_TOPIC,
-      g_param_spec_string ("sub-topic", "Topic to Subscribe",
-          "The topic's name to subscribe", DEFAULT_MQTT_SUB_TOPIC,
+      g_param_spec_string ("sub-topic", "Topic to Subscribe (mandatory)",
+          "The topic's name to subscribe", NULL,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
   g_object_class_install_property (gobject_class, PROP_MQTT_OPT_CLEANSESSION,
@@ -391,6 +389,11 @@ gst_mqtt_src_start (GstBaseSrc * basesrc)
       self->mqtt_host_port);
   int ret;
 
+  if (!g_strcmp0 (DEFAULT_MQTT_CLIENT_ID, self->mqtt_client_id)) {
+    self->mqtt_client_id = g_strdup_printf (DEFAULT_MQTT_CLIENT_ID_FORMAT,
+        g_get_host_name (), getpid (), src_client_id++);
+  }
+
   /**
    * @todo Support other persistence mechanisms
    *    MQTTCLIENT_PERSISTENCE_NONE: A memory-based persistence mechanism
@@ -534,8 +537,8 @@ gst_mqtt_src_get_client_id (GstMqttSrc * self)
 static void
 gst_mqtt_src_set_client_id (GstMqttSrc * self, const gchar * id)
 {
+  g_free (self->mqtt_client_id);
   self->mqtt_client_id = g_strdup (id);
-  g_free ((void *) DEFAULT_MQTT_CLIENT_ID);
 }
 
 /**
@@ -612,6 +615,7 @@ gst_mqtt_src_get_sub_topic (GstMqttSrc * self)
 static void
 gst_mqtt_src_set_sub_topic (GstMqttSrc * self, const gchar * topic)
 {
+  g_free (self->mqtt_topic);
   self->mqtt_topic = g_strdup (topic);
 }