MQTT消息时间戳

时间:2016-09-16 04:39:20

标签: timestamp mqtt

我想恢复MQTT消息发布时间戳,但我在订阅者库中找不到支持。另一方面,我看到MQTT.fx客户端能够恢复此信息。谁知道如何处理?

MQTT. fx client -> message timestamp

3 个答案:

答案 0 :(得分:4)

消息中没有时间戳,没有在MQTT头中存储此类信息的位置。

MQTT.fx必须使用到达客户的时间。

如果您需要已发布的时间,则必须自己将其添加到消息有效内容中。

答案 1 :(得分:0)

Moment可用于解决问题。它是一个轻量级的JavaScript日期和时间库,用于解析,验证,操作和格式化日期和时间。记录消息到达订户端的时间。

 client.on('message', function (topic, message) {
          console.log(message.toString());
          var Time = moment().format('HH:mm:ss');
          console.log(Time);
 });

使用片刻,您还可以发送时间戳以及来自发布者的JSON格式的数据。

答案 2 :(得分:0)

在 Eclipse Mosquitto 中,他们添加了一个插件来支持让代理在用户属性中为消息添加时间戳(仅限 MQQTv5):plugins/message-timestamp(您可能需要拉取开发分支以获取此插件)

插件代码来自: https://github.com/eclipse/mosquitto/blob/develop/plugins/message-timestamp/mosquitto_message_timestamp.c

static int callback_message(int event, void *event_data, void *userdata)
{
    struct mosquitto_evt_message *ed = event_data;
    struct timespec ts;
    struct tm *ti;
    char time_buf[25];

    clock_gettime(CLOCK_REALTIME, &ts);
    ti = gmtime(&ts.tv_sec);
    strftime(time_buf, sizeof(time_buf), "%Y-%m-%dT%H:%M:%SZ", ti);

    return mosquitto_property_add_string_pair(&ed->properties, MQTT_PROP_USER_PROPERTY, "timestamp", time_buf);
}

用户属性不向后兼容 MQTTv3。如果您坚持使用 MQTTv3,那么您可以:

  • 为您的消息负载添加时间戳(丑陋,因为发布者时间戳可能无效并增加了负载的复杂性)
  • 避免使用保留(需要在订阅者处添加时间戳和缓存数据)。

虽然 Paho 支持 MQTTv5,但某些语言变体不支持。一些常见的调试工具,例如支持 MQTTv5 的 MQTT Explorer,还不能处理/显示用户属性。