Skip to content
Snippets Groups Projects
Commit 3fbdb4cf authored by Junya Hayashi's avatar Junya Hayashi
Browse files

Implement mqtt_private_path feature

parent 483963d9
No related branches found
No related tags found
No related merge requests found
...@@ -110,6 +110,10 @@ Parameters under `mqtt` section are used for creating paho's `mqtt.Client` and i ...@@ -110,6 +110,10 @@ Parameters under `mqtt` section are used for creating paho's `mqtt.Client` and i
See `mqtt_bridge.mqtt_client` for detail. See `mqtt_bridge.mqtt_client` for detail.
### mqtt private path
If `mqtt/private_path` parameter is set, leading `~/` in MQTT topic path will be replaced by this value. For example, if `mqtt/pivate_path` is set as "device/001", MQTT path "~/value" will be converted to "device/001/value".
### selializer and deselializer ### selializer and deselializer
`mqtt_bridge` uses `json` as a selializer in default. But you can also configure other selializers. For example, if you want to use messagepack for selialization, add following configuration. `mqtt_bridge` uses `json` as a selializer in default. But you can also configure other selializers. For example, if you want to use messagepack for selialization, add following configuration.
......
...@@ -5,6 +5,7 @@ mqtt: ...@@ -5,6 +5,7 @@ mqtt:
host: localhost host: localhost
port: 1883 port: 1883
keepalive: 60 keepalive: 60
private_path: device/001
selializer: msgpack:dumps selializer: msgpack:dumps
deselializer: msgpack:loads deselializer: msgpack:loads
bridge: bridge:
...@@ -26,3 +27,12 @@ bridge: ...@@ -26,3 +27,12 @@ bridge:
msg_type: std_msgs.msg:String msg_type: std_msgs.msg:String
topic_from: echo topic_from: echo
topic_to: /back topic_to: /back
# private path
- factory: mqtt_bridge.bridge:RosToMqttBridge
msg_type: std_msgs.msg:String
topic_from: /private/echo
topic_to: ~/echo
- factory: mqtt_bridge.bridge:MqttToRosBridge
msg_type: std_msgs.msg:String
topic_from: ~/echo
topic_to: /private/back
...@@ -6,18 +6,21 @@ import paho.mqtt.client as mqtt ...@@ -6,18 +6,21 @@ import paho.mqtt.client as mqtt
import rospy import rospy
from .bridge import create_bridge from .bridge import create_bridge
from .mqtt_client import create_private_path_extractor
from .util import lookup_object from .util import lookup_object
def create_config(mqtt_client, selializer, deselializer): def create_config(mqtt_client, selializer, deselializer, mqtt_private_path):
if isinstance(selializer, basestring): if isinstance(selializer, basestring):
selializer = lookup_object(selializer) selializer = lookup_object(selializer)
if isinstance(deselializer, basestring): if isinstance(deselializer, basestring):
deselializer = lookup_object(deselializer) deselializer = lookup_object(deselializer)
private_path_extractor = create_private_path_extractor(mqtt_private_path)
def config(binder): def config(binder):
binder.bind('selializer', selializer) binder.bind('selializer', selializer)
binder.bind('deselializer', deselializer) binder.bind('deselializer', deselializer)
binder.bind(mqtt.Client, mqtt_client) binder.bind(mqtt.Client, mqtt_client)
binder.bind('mqtt_private_path_extractor', private_path_extractor)
return config return config
...@@ -29,6 +32,7 @@ def mqtt_bridge_node(): ...@@ -29,6 +32,7 @@ def mqtt_bridge_node():
params = rospy.get_param("~", {}) params = rospy.get_param("~", {})
mqtt_params = params.pop("mqtt", {}) mqtt_params = params.pop("mqtt", {})
conn_params = mqtt_params.pop("connection") conn_params = mqtt_params.pop("connection")
mqtt_private_path = mqtt_params.pop("private_path", "")
bridge_params = params.get("bridge", []) bridge_params = params.get("bridge", [])
# create mqtt client # create mqtt client
...@@ -42,7 +46,8 @@ def mqtt_bridge_node(): ...@@ -42,7 +46,8 @@ def mqtt_bridge_node():
deselializer = params.get('deselializer', 'json:loads') deselializer = params.get('deselializer', 'json:loads')
# dependency injection # dependency injection
config = create_config(mqtt_client, selializer, deselializer) config = create_config(
mqtt_client, selializer, deselializer, mqtt_private_path)
inject.configure(config) inject.configure(config)
# configure and connect to MQTT broker # configure and connect to MQTT broker
......
...@@ -46,6 +46,7 @@ class Bridge(object): ...@@ -46,6 +46,7 @@ class Bridge(object):
_mqtt_client = inject.attr(mqtt.Client) _mqtt_client = inject.attr(mqtt.Client)
_selialize = inject.attr('selializer') _selialize = inject.attr('selializer')
_deselialize = inject.attr('deselializer') _deselialize = inject.attr('deselializer')
_extract_private_path = inject.attr('mqtt_private_path_extractor')
class RosToMqttBridge(Bridge): class RosToMqttBridge(Bridge):
...@@ -59,7 +60,7 @@ class RosToMqttBridge(Bridge): ...@@ -59,7 +60,7 @@ class RosToMqttBridge(Bridge):
def __init__(self, topic_from, topic_to, msg_type, frequency=None): def __init__(self, topic_from, topic_to, msg_type, frequency=None):
self._topic_from = topic_from self._topic_from = topic_from
self._topic_to = topic_to self._topic_to = self._extract_private_path(topic_to)
self._last_published = rospy.get_time() self._last_published = rospy.get_time()
self._interval = 0 if frequency is None else 1.0 / frequency self._interval = 0 if frequency is None else 1.0 / frequency
rospy.Subscriber(topic_from, msg_type, self._callback_ros) rospy.Subscriber(topic_from, msg_type, self._callback_ros)
...@@ -88,7 +89,7 @@ class MqttToRosBridge(Bridge): ...@@ -88,7 +89,7 @@ class MqttToRosBridge(Bridge):
def __init__(self, topic_from, topic_to, msg_type, frequency=None, def __init__(self, topic_from, topic_to, msg_type, frequency=None,
queue_size=10): queue_size=10):
self._topic_from = topic_from self._topic_from = self._extract_private_path(topic_from)
self._topic_to = topic_to self._topic_to = topic_to
self._msg_type = msg_type self._msg_type = msg_type
self._queue_size = queue_size self._queue_size = queue_size
......
...@@ -53,4 +53,12 @@ def default_mqtt_client_factory(params): ...@@ -53,4 +53,12 @@ def default_mqtt_client_factory(params):
return client return client
__all__ = ["default_mqtt_client_factory"] def create_private_path_extractor(mqtt_private_path):
def extractor(topic_path):
if topic_path.startswith('~/'):
return '{}/{}'.format(mqtt_private_path, topic_path[2:])
return topic_path
return extractor
__all__ = ['default_mqtt_client_factory', 'create_private_path_extractor']
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment