msgpack-python无法反序列化 - >得到ExtraData错误

时间:2017-04-19 14:02:15

标签: python mqtt ros msgpack

我正在尝试使MQTTtoROS Bridge工作,并且我一直收到此错误:

Traceback (most recent call last):
  File "/usr/lib/python2.7/threading.py", line 801, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.7/threading.py", line 754, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2627, in _thread_main
    self.loop_forever(retry_first_connection=True)
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1407, in loop_forever
    rc = self.loop(timeout, max_packets)
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 923, in loop
    rc = self.loop_read(max_packets)
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1206, in loop_read
    rc = self._packet_read()
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 1799, in _packet_read
    rc = self._packet_handle()
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2275, in _packet_handle
    return self._handle_publish()
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2461, in _handle_publish
    self._handle_on_message(message)
  File "/home/animu/.local/lib/python2.7/site-packages/paho/mqtt/client.py", line 2615, in _handle_on_message
    t[1](self, self._userdata, message)
  File "/home/animu/catkin_ws/src/mqtt_bridge-master/src/mqtt_bridge/bridge.py", line 114, in _callback_mqtt
    ros_msg = self._create_ros_message(mqtt_msg)
  File "/home/animu/catkin_ws/src/mqtt_bridge-master/src/mqtt_bridge/bridge.py", line 124, in _create_ros_message
    msg_dict = self._deserialize(mqtt_msg.payload)
  File "msgpack/_unpacker.pyx", line 143, in msgpack._unpacker.unpackb (msgpack/_unpacker.cpp:2143)
ExtraData: unpack(b) received extra data.

我在互联网上找不到任何东西,因为这个桥我觉得不常用。唯一类似的问题是盐和卡夫卡,但解决方案无处可寻。所有python库都是最新的,我仔细检查过。桥接器将消息从RoS发送到MQTT而没有任何问题,包括STR和BOOL类型。从MQTT发送的任何消息都会以此错误结束,而不会收到ROS的接收。

2 个答案:

答案 0 :(得分:0)

有点晚了,但我会为未来的读者提供一些建议。 首先,确保已安装桥接器的所有要求。通过阅读requirement.txt检查它们 其次,编辑mqtt_bridge配置文件以匹配来自ROS和MQTT服务器的主题。也是MQTT服务器的IP地址/端口。 多数民众赞成。

答案 1 :(得分:0)

由于Animu是一名学生,因此我认为这是他的培训或实习公司的一项任务。答案可能不再有用,但是由于我也遇到了这个问题,因此我为将来的读者提供一种解决方案:

在网桥存储库中,有一个名为“ demo_params.yaml”的文件。或者,如果您已经使用不同的名称命名,则包含您的“设置”的.yaml文件。

此文件包括以下内容:

mqtt:
  client:
    protocol: 4 # MQTTv311
  connection:
    host: localhost
    postage: 1883
    keepalive: 60
  private_path: device / 001
serializer: msgpack: dumps
deserializer: msgpack: loads
bridge:
  # ping pong
  - factory: mqtt_bridge.bridge: RosToMqttBridge
    msg_type: std_msgs.msg: Bool
    topic_from: / ping
    topic_to: ping
  - factory: mqtt_bridge.bridge: MqttToRosBridge
    msg_type: std_msgs.msg: Bool
    topic_from: ping
    topic_to: / pong

如您所见,它说msgpack用于序列化和反序列化来回发送的消息。这主要适用于MQTT的ROS。反之,则不起作用,因为在Python代码中未执行正确的操作。您有两种解决方案。

继续使用msgpack,并确保您已发布的MQTT消息已被编码为msgpack,可以对它们本身进行序列化。 (二进制)。这是一个棘手的解决方案,因为如果您手动发布MQTT消息,则只想使其易于阅读。如果您编写了另一个发布MQTT消息的程序,请随时先使用msgpack序列化消息,然后再发布。然后桥也可以工作。

另一个选择是进行JSON序列化,而不是msgpack序列化。这是网桥的默认选项,但是您也可以在.yaml文件中指定它。您可以通过编辑以下代码来做到这一点:

serializer: msgpack: dumps
deserializer: msgpack: loads

对此:

serializer: json: dumps
deserializer: json: loads

现在,您可以手动或在软件的帮助下发布mqtt消息。 您可以按照以下步骤进行操作:

mosquitto_pub -t 'echo' -m '{"data": "test"}