Create rules
- Setup a Web Service, here we setup a simple web service using the linux tool :
-
Go to EMQX Dashboard (opens new window), select the “rule” tab on the menu to the left.
Select “message.publish”, then type in the following SQL:
SELECT
*
FROM
"t/#"
WHERE
qos = 1
Bind an action:
Click on the “+ Add” button under “Action Handler”, and then select “Data to Web Server” in the pop-up dialog window.
Bind a resource to the action:
Since the dropdown list “Resource” is empty for now, we create a new resource by clicking on the “New Resource” to the top right:
then select “WebHook”:
Configure the resource:
Fill in the “Request URL” and “Request Header”(Optional):
And click on the “Testing Connection” button to make sure the connection can be created successfully, and then click on the “Create” button.
Back to the “Actions” dialog, and then click on the “Confirm” button.
We have finished, testing the rule by sending an MQTT message to emqx:
send a message
Topic: “t/1”
QoS: 1
Payload: “Hello web server”
Then check if the web service receives the message:
TIP
From EMQX Enterprise 4.4.11 and 4.3.17, we can use placeholders in ${var}
format for the HTTP headers.
WARING
Create Simple Rules using CLI
Create a rule for testing: print the content of the message and all the args of the action, when a MQTT message is sent to topic ‘t/a’.
- The filter SQL is: SELECT * FROM “message.publish” WHERE topic = ‘t/a’;
- The action is: “print the content of the message and all the args of the action”, the action we need is ‘inspect’.
$ ./bin/emqx_ctl rules create \
'[{"name":"inspect", "params": {"a": 1}}]' \
-d 'Rule for debug'
Rule rule:803de6db created
The CLI above created a rule with ID=’Rule rule:803de6db’.
The first two args are mandatory:
- SQL: SELECT * FROM “message.publish” WHERE topic = ‘t/a’
- Action List: [{“name”:”inspect”, “params”: {“a”: 1}}]. Action List is of type JSON Array. “name” is the name of the action, “params” is the parameters of the action. Note that the action
inspect
does not need a resource.
The last arg is an optional description of the rule: ‘Rule for debug’.
If a MQTT message “hello” is sent to topic ‘t/a’, the rule “Rule rule:803de6db” will be matched, and then action “inspect” will be triggered, the following info will be printed to the emqx console:
Selected Data
listed the fields that selected by the SQL. All available fields will be listed here, as we usedselect *
.Envs
is the environment variables that can be used internally in the action.Action Init Params
is the params we passed to the action.
Create a rule: Forward all the messages that send from clientid=’Steven’, to the Web Server at ‘’:
- The filter SQL: SELECT username as u, payload FROM “message.publish” where u=’Steven’;
- Actions: “Forward to ‘http://127.0.0.1:9910 (opens new window)’”;
- Resource Type: web_hook;
Create a simpile Web service using linux tool
nc
:$ while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l 127.0.0.1 9910; done;
Create a resource of resource type “WebHook”, and configure the url:
1). List all available resource types, make sure ‘web_hook’ exists:
$ ./bin/emqx_ctl resource-types list
resource_type(name='web_hook', provider='emqx_web_hook', params=#{...}}, on_create={emqx_web_hook_actions,on_resource_create}, description='WebHook Resource')
...
2). Create a new resource using resource type ‘web_hook’, configure “url”=””:
Above CLI created a resource with ID=’resource:691c29ba’, the first arg is mandatory - The resource type (web_hook). HTTP method is POST, and an HTTP Header is set: “token”.
Create a rule, and bind action ‘data_to_webserver’ to it:
1). List all available actions, make sure ‘data_to_webserver’ exists:
$ ./bin/emqx_ctl rule-actions list
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')
...
2). Create the rule, bind the action data_to_webserver, and bind resource resource:691c29ba to the action via the arg “$resource”:
$ ./bin/emqx_ctl rules create \
"SELECT username as u, payload FROM \"message.publish\" where u='Steven'" \
'[{"name":"data_to_webserver", "params": {"$resource": "resource:691c29ba"}}]' \
-d "Forward publish msgs from steven to webserver"
Above CLI is similar to the first Inspect rule, with exception that the resource ‘resource:691c29ba’ is bound to ‘data_to_webserver’. The binding is done by a special arg named ‘$resource’. What the action ‘data_to_webserver’ does is sending messages to the specified web server.
- Now let’s send a message “hello” to an arbitrary topic using username “Steven”, this will trigger the rule we created above, and the Web Server will receive an message and return 200 OK: