1、创建了一个资源:TCP编解码资源。
2、在编解码模块,创建了一个第三方的编解码,使用上述资源。
3、创建规则,并使用编解码函数
规则:
SELECT
schema_encode('Schema_9202', hexstr2bin(payload.hex)) as encoded_data_9202,
schema_encode('Schema_9201', hexstr2bin(payload.hex)) as encoded_data_9201
FROM
"t/#"
问题描述:
1、发布了一条消息,内容如下
{“hex”:“AA55”}
TCP编解码服务端(即图中第4步),收到报文内容为:
00 00 00 16 20 00 00 00 00 00 0B 53 63 68 65 6D 61 5F 39 32 30 32 00 00 AA 55
2、发布了一条消息,内容如下
{“hex”:“AA5500000000000005A7”}
TCP编解码服务端(即图中第4步),收到报文内容为:
00 00 00 1E 20 00 00 00 00 00 0B 53 63 68 65 6D 61 5F 39 32 30 32 00 00 AA 55 00 00 00 00 00 00 05 A7
问题:
1、帧头部分的内容如何解析?
2、帧头部分是否是固定的?目前只看出来0x16和0x1E是数据的长度
`3、是否可以将输入内容透传至TCP编解码服务端?
是的,从代码看。emqx 4.x 企业版中的 TCP 编解码模块确实存在一个私有的协议。并暂无文档暴露
数据包结构可以参考,源码中的这一部分
pack_parse_request(#parse_request{parse_type = ParseType,
schema_name = SchemaName,
parser_opts = Opts,
msg_id = MsgId,
content = Data}) ->
MsgType = message_type(ParseType),
Code = ?CODE_REQ,
LenSchemaId = byte_size(SchemaName),
LenOpts = byte_size(Opts),
<<MsgType:4, Code:4, MsgId:32, %% Header
LenSchemaId:16, SchemaName:LenSchemaId/binary, %% SchemaName
LenOpts:16, Opts:LenOpts/binary, %% Opts
Data/binary>>.
即包含
MsgType: 占 4 个比特位
Code:占 4 个比特位
MsgId: 占 32个比特位 (4个字节)
LenSchemaId (Schema Name 长度指示位)占 16比特位 (2字节)
SchemaName:占 LenSchemaId 个字节
LenOpts: 配置项 Opts 的的长度指示,占 16 比特
Opts:配置项,占 LenOpts 字节
Data:真正的数据位
我发现在创建第三方编解码时,有一个编解码配置 这个选线,能否通过这个选项,将数据透传出去呢?
Shawn
2023 年9 月 7 日 03:01
4
使用 TCP 的第三方编解码是一个实验性的工作,没有文档也没有任何测试覆盖,所以现在没办法保证它能正常工作。
另外从性能上讲,它应该不会比 HTTP 或者 gRPC 的方式有优势。我推荐你用 gRPC 的方式。