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

    创建 Parser HTTP 资源

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

    • Request Method: POST

    其他保持默认,点击创建之后,得到 Resource ID,比如:resource:606631

    在 EMQX Dashboard 的 Schema 创建HTTP 编解码举例 - 图2 (opens new window) 界面,使用下面的参数创建一个 3rd-Party Schema:

    1. 名称: my_http_parser
    2. 编解码类型: 3rd-party
    3. 第三方类型: Resources
    4. Resource: resource:606631(这里选择我们刚才创建的 Parser HTTP 资源)
    5. 编解码配置: xor

    其他配置保持默认。

    上面第 5 项编解码配置是个可选项,是个字符串,内容跟编解码服务的业务相关。

    创建规则

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

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

    最终这个 SQL 语句的筛选结果是 encoded_datadecoded_data 这两个变量。

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

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

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

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

    下面的代码使用 Python 语言实现了一个 HTTP 编解码服务,为简单起见,这个服务提供两种简单的方式来进行编解码(加解密),详见 :

    • 按位异或
    • 字符替换

    将这个服务运行起来:

    检查规则执行结果

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

    1. 在 Dashboard 的 工具里,登录一个 MQTT Client 并发布一条消息到 “t/1”,内容为 “hello”。

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

    Selected Data 里面的两个字段 decoded_dataencoded_data 对应 SELECT 语句里面的两个 AS。因为 是编码然后再解码之后的结果,所以它又被还原为了我们发送的内容 “hello”,表明编解码插件工作正常。