企业版TCP编解码问题

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>>.

即包含

  1. MsgType: 占 4 个比特位
  2. Code:占 4 个比特位
  3. MsgId: 占 32个比特位 (4个字节)
  4. LenSchemaId (Schema Name 长度指示位)占 16比特位 (2字节)
  5. SchemaName:占 LenSchemaId 个字节
  6. LenOpts: 配置项 Opts 的的长度指示,占 16 比特
  7. Opts:配置项,占 LenOpts 字节
  8. Data:真正的数据位

我发现在创建第三方编解码时,有一个编解码配置这个选线,能否通过这个选项,将数据透传出去呢?

使用 TCP 的第三方编解码是一个实验性的工作,没有文档也没有任何测试覆盖,所以现在没办法保证它能正常工作。
另外从性能上讲,它应该不会比 HTTP 或者 gRPC 的方式有优势。我推荐你用 gRPC 的方式。