创建规则

    1. 搭建 Web 服务,这里使用 命令做一个简单的Web 服务:
    1. 创建规则:

      打开 ,选择左侧的 “规则” 选项卡。

      填写用以处理 t/# 主题的规则 SQL:

      1. SELECT
      2. *
      3. FROM
      4. "t/#"
      5. WHERE
      6. qos = 1

    2. 关联动作:

      在 “响应动作” 界面选择 “添加”,然后在 “动作” 下拉框里选择 “发送数据到 Web 服务”。

      image

    3. 给动作关联资源:

      现在资源下拉框为空,可以点击右上角的 “新建资源” 来创建一个 WebHook 资源:

      选择 “WebHook 资源”:

      image

    4. 填写资源配置:

      填写 “请求 URL” 和请求头(可选):

      http://127.0.0.1:8081

    5. 返回响应动作界面,点击 “确认”。

      image

    6. 发一条消息:

      Topic: “t/1”

      QoS: 1

      Payload: “Hello web server”

      然后检查 Web 服务是否收到消息:

    通过 CLI 创建简单规则

    创建一个测试规则,当有消息发送到 ‘t/a’ 主题时,打印消息内容以及动作参数细节。

    • 规则的筛选 SQL 语句为: SELECT * FROM “t/a”;

    1. $ ./bin/emqx_ctl rules create \
    2. "SELECT * FROM \"t/a\" \
    3. '[{"name":"inspect", "params": {"a": 1}}]' \
    4. -d 'Rule for debug'
    5. Rule rule:803de6db created

    上面的 CLI 命令创建了一个 ID 为 ‘Rule rule:803de6db’ 的规则。

    参数中前两个为必选参数:

    • SQL 语句: SELECT * FROM “t/a”
    • 动作列表: [{“name”:”inspect”, “params”: {“a”: 1}}]。动作列表是用 JSON Array 格式表示的。name 字段是动作的名字,params 字段是动作的参数。注意 inspect 动作是不需要绑定资源的。

    最后一个可选参数,是规则的描述: ‘Rule for debug’。

    接下来当发送 “hello” 消息到主题 ‘t/a’ 时,上面创建的 “Rule rule:803de6db” 规则匹配成功,然后 “inspect” 动作被触发,将消息和参数内容打印到 emqx 控制台:

    • Selected Data 列出的是消息经过 SQL 筛选、提取后的字段,由于我们用的是 select *,所以这里会列出所有可用的字段。
    • Envs 是动作内部可以使用的环境变量。
    • Action Init Params 是初始化动作的时候,我们传递给动作的参数。

    创建一个规则,将所有发送自 client_id=’Steven’ 的消息,转发到地址为 ‘‘ 的 Web 服务器:

    • 规则的筛选条件为: SELECT username as u, payload FROM “t/a” where u=’Steven’;
    • 动作是: “转发到地址为 ‘http://127.0.0.1:9910‘ 的 Web 服务”;
    • 资源类型是: web_hook;
    • 首先我们创建一个简易 Web 服务,这可以使用 nc 命令实现:

      1. $ while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 9910; done;
    • 使用 WebHook 类型创建一个资源,并配置资源参数 url:

      1). 列出当前所有可用的资源类型,确保 ‘web_hook’ 资源类型已存在:

      1. $ ./bin/emqx_ctl resource-types list
      2. ...

      2). 使用类型 ‘web_hook’ 创建一个新的资源,并配置 “url”=”“:

      上面的 CLI 命令创建了一个 ID 为 ‘’ 的资源,第一个参数是必选参数 - 资源类型(web_hook)。参数表明此资源指向 URL = “http://127.0.0.1:9910“ 的 Web 服务,方法为 POST,并且设置了一个 HTTP Header: “token”。

    • 然后创建规则,并选择规则的动作为 ‘data_to_webserver’:

      1). 列出当前所有可用的动作,确保 ‘data_to_webserver’ 动作已存在:

      1. $ ./bin/emqx_ctl rule-actions list
      2. action(name='data_to_webserver', app='emqx_web_hook', for='$any', types=[web_hook], params=#{'$resource' => ...}, title ='Data to Web Server', description='Forward Messages to Web Server')
      3. ...

      2). 创建规则,选择 data_to_webserver 动作,并通过 “$resource” 参数将 资源绑定到动作上:

      1. $ ./bin/emqx_ctl rules create \
      2. "SELECT username as u, payload FROM \"message.publish\" where u='Steven'" \
      3. '[{"name":"data_to_webserver", "params": {"$resource": "resource:691c29ba"}}]' \
      4. -d "Forward publish msgs from steven to webserver"

      上面的 CLI 命令与第一个例子里创建 Inspect 规则时类似,区别在于这里需要把刚才创建的资源 ‘’ 绑定到 ‘data_to_webserver’ 动作上。这个绑定通过给动作设置一个特殊的参数 ‘$resource’ 完成。’data_to_webserver’ 动作的作用是将数据发送到指定的 Web 服务器。