EMQX 消息追加时间戳或者时间字符串

问题描述

EMQX怎样对设备发过来的json字符串添加时间戳呢,时间戳格式(yyyy-MM-dd HH:mm:ss)
,求大佬解答

原始消息

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2
}

目标消息

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2,
    "uploadDate": "2021-03-11 01:42:30"
}

环境信息

  • EMQ X 版本:EMQX开源版4.0.5
  • 操作系统及版本:Centos7
  • 其他

目前有规范的时间获取函数,你可以看看这种实现:

SELECT

  payload.msg as msg, now_rfc3339() AS ts

FROM

  "t/#"

WHERE

  msg = 'hello'

输出:

{
  "ts": "2021-04-22T10:20:05+08:00",
  "msg": "hello"
}

这个时间格式是标准国际化时间。

当前版本我们暂时只有这一种规范化时间字符串(足以应付发部分场景 因为很多语言框架都是直接支持这种串解析的),不过后期我们会增加各种花式格式化函数,请关注一下这个帖子。

这些函数绝大部分在官方文档【规则引擎】一节可以查到。如果没有请反馈一下,可能是后期新增的来不及及时补充文档。

时间格式只有这一种吗,这些函数在哪里可以查到,谢谢老哥

对,当前版本我们暂时只有这一种规范化时间字符串(足以应付发部分场景 因为很多语言框架都是直接支持这种串解析的),不过后期我们会增加各种花式格式化函数,请关注一下这个帖子。

对于含有不同字段但是都包含ts字段(或者都不包含ts字段)的payload,应该怎样写呢

能详细描述一下需求吗?这个我不太明白

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2
}

↓转

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2,
    "ts": "2021-03-11 01:42:30"
}

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2,
    "ts": 
}

↓转

{
    "deviceType": "device_type1",
    "clientId": "test_device1",
    "gpsX": 100.1,
    "gpsY": 100.2,
    "ts": "2021-03-11 01:42:30"
}

你想覆盖还是共存?

测试了一下

原始消息

{
  "msg": "hello",
  "ts": ""
}

语句

SELECT

  payload.msg as msg,
  now_rfc3339() as ts

FROM

  "t/#"

报错

Bad Arguments: {parse_error,badarg,[{erlang,list_to_existing_atom,["now_rfc3339"],[]},{emqx_rule_sqlparser,transform_select_field,2,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqlparser.erl"},{line,174}]},{emqx_rule_sqlparser,preprocess_field,2,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqlparser.erl"},{line,129}]},{emqx_rule_sqlparser,'-preprocess_columns/2-fun-0-',2,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqlparser.erl"},{line,118}]},{lists,foldl,3,[{file,"lists.erl"},{line,1263}]},{emqx_rule_sqlparser,preprocess,1,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqlparser.erl"},{line,106}]},{emqx_rule_sqlparser,parse_select,1,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqlparser.erl"},{line,61}]},{emqx_rule_sqltester,test,1,[{file,"/emqx-rel/_build/emqx/lib/emqx_rule_engine/src/emqx_rule_sqltester.erl"},{line,26}]}]}

目前不支持共存,但是可以被覆盖,你重新命名一个ts1之类的