编解码举例 - 自定义 gRPC 编解码

    创建 Parser gRPC 资源

    在 EMQX Dashboard 的 Resource 创建 (opens new window) 界面,使用下面的参数创建一个 Parser gRPC 资源:

    • URL:
    • Resource ID: my_grpc_parser_resource

    在 EMQX Dashboard 的 界面,使用下面的参数创建一个 3rd-Party Schema:

    1. 名称: my_grpc_parser
    2. 编解码类型: 3rd-party
    3. 第三方类型: Resources

    其他配置保持默认。

    创建规则

    使用刚才创建好的 Schema 来编写规则 SQL 语句:

    这个 SQL 语句首先对数据做了 Encode,然后又做了 Decode,目的在于验证编解码过程是否正确:

    • 函数将 payload 字段的内容按照 ‘my_grpc_parser’ 这个 Schema 来做编码,结果存储到 encode_resp 这个 Map 里;
    • schema_decode 函数将编码结果内容按照 ‘my_grpc_parser’ 这个 Schema 来做解码,结果存储到 这个变量里;

    然后使用以下参数添加动作:

    • 动作类型:检查(调试)

    这个检查动作会把 SQL 语句筛选的结果打印到 emqx 控制台 (erlang shell) 里。

    如果是使用 emqx console 启动的服务,打印会直接显示在控制台里;如果是使用 emqx start 启动的服务,打印会输出到日志目录下的 erlang.log.N 文件里,这里 “N” 为整数,比如 “erlang.log.1”, “erlang.log.2”。

    规则创建好之后,就可以模拟数据进行测试了。所以首先需要编写一个自己的编解码服务。

    下面的代码使用 Python 语言实现了一个 gRPC 编解码服务。 为简单起见,这个服务在编码时,只是对收到的字符串做 base64_encode,解码时进行 base64_decode。 详见 完整代码 (opens new window):

    检查规则执行结果

    由于本示例比较简单,我们直接使用 MQTT Websocket 客户端来模拟设备端发一条消息。

    1. 在 Dashboard 的 WebsocketgRPC 编解码举例 - 图4 访问链接 (opens new window) 工具里,登录一个 MQTT Client 并发布一条消息到 “t/1”,内容为 “hello”。

    2. 检查 emqx 控制台 (erlang shell) 里的打印:

    Select Data 是经过 SQL 语句筛选之后的数据,Envs 是规则引擎内部可用的环境变量,Action Init Params 是动作的初始化参数。这三个数据均为 格式。

    Selected Data 里面的两个字段 decode_respencode_resp 对应 SELECT 语句里面的两个 AS。