规则引擎处理非 UTF8 数据

from @hydrace

@t1ger 这个问题其实没解决啊,官方误解了问题的意思。

在Hex编码的字符串转换为UTF-8编码的String时,有些编码是无法转换的,比如"9108"(0x91 0x08),此时就会用�代替这一段内容,就算转换回Hex编码的字节数组,实际意义也丢失了。

我现在遇到了这个问题,使用“有人DTU”的设备读取电表数据,使用规则引擎抓取,可是读数无法还原,因为原文被规则引擎转换为一个含有�的字符串。

一个实际的例子:DTU设备发送下面hex编码信息,被转换为字符串后无法再转换回去

6870 2842 1002 0068 9108 3333 3333 99a8 7733 0c16

@hydrace 抱歉,我最近才看到你在 MQTTX里发送主题时,我用HEX然后在主题消息框输入AA,点击Plaintext后就变成了�,请问这是怎么转变的 - #2,来自 t1ger 里的回复。这应该是一个通用的问题,而且和原帖其实不是一个问题,所以我新开了一个帖子。

方便的话,可以分享下你现在使用的规则示例和场景吗?

规则引擎被设计来的主要目的是处理结构化的 JSON 数据的,如果是二进制数据,尽量是要经过编解码完成反序列化,然后在处理的。

目前(v5.1.0)版本,也可以直接把它当做一个整体进行转换 编解码函数 来解决 “无法还原” 的问题,例如,把 Payload 整体装化为 hexstr 字符串

SELECT
  bin2hexstr(payload) as hex
FROM
  "t/#"

如果你的 DTU 是 6870 2842 1002 0068 9108 3333 3333 99a8 7733 0c16
那么规则输出的结果就是

{"hex": "687028421002006891083333333399a877330c16"}

bin2hexstr(payload) as hex 这个后台解析到的数据可以使用,就是不清楚如果需要发布16进制是否会存在乱码问题?