# Save data to TDengine

TDengine (opens new window)
TaosData(https://www.taosdata.com) Enables efficient, real-time data ingestion, processing and monitoring of TB and even PB scale data per day, generated by billions of sensors and data collectors. TDengine can be widely applied to IoT, Industrial Internet, Connected Vehicles, DevOps, Energy , Finance and many other use-cases.

EMQX supports saving data to TDengine via Send to Web Server, and also provides native TDengine drivers on EMQX Enterprise for direct saving.

Install TDengine by docker or Huawei Cloud (opens new window)

docker run --name TDengine -d -p 6030:6030 -p 6035:6035 -p 6041:6041 -p 6030-6040:6030-6040/udp tdengine/tdengine 
1

Execute cmd in docker:

docker exec -it TDengine bash
taos
1
2

Create database test

create database test;
1

Create table t_mqtt_msg. More docs (opens new window):

USE test;
CREATE TABLE t_mqtt_msg (
  ts timestamp,
  msgid NCHAR(64),
  mqtt_topic NCHAR(255),
  qos TINYINT,
  payload BINARY(1024),
  arrived timestamp
);
1
2
3
4
5
6
7
8
9

Create Rule:

Open EMQX Dashboard (opens new window). Click Rule.

Write SQL:

SELECT

  *,
  now_timestamp('millisecond')  as ts

FROM

  "#"
1
2
3
4
5
6
7
8

image

The subsequent action creation operation can be selected flexibly depending on your EMQX version.

# Native SDK (EMQX Enterprise)

Add Action:

Find Action, click Add Action.

Click Data persist, Choice Data to TDengine.

Requires EMQX Enterprise 4.1.1 and later only.

Action parameters:

  1. SQL template. In this example we insert a data to TDengine, note that we should specify the database name in the SQL and the character type should be enclosed in single quotes, the SQL template:
insert into test.t_mqtt_msg(ts, msgid, mqtt_topic, qos, payload, arrived) values (${ts}, '${id}', '${topic}', ${qos}, '${payload}', ${timestamp})
1
  1. Now that the resource drop-down box is empty, you can create a TDengine resource by clicking on Create in the upper right corner:

Create new TDengine Resource:
TDEngine Username: root
TDEngine password: taosdata

image

Click Confirm.

Return to the action screen and click "Confirm".

image

Return to the rule screen and click "Create".

# Write by Web Server

To support development on different types of platforms, TDengine provides APIs that conform to REST design standards.

The RESTful Connector (opens new window) provides the simplest way to connect, i.e. using HTTP requests carrying authentication information with the SQL operation to be performed TDengine.

Add Action:

Find Action, click Add Action.

Click Data persist, Choice Data to Web Server.

Data to Web Server parameters:

  1. Using of resources: Associated Web Server resources, you can click the Create button to create new resources.
  2. Method:POST
  3. Path: /rest/sql
  4. Headers: Authorization Basic, "root:taosdata" base64 encode is cm9vdDp0YW9zZGF0YQ==
  5. Body: Request Body. In this example we are inserting a piece of data into TDengine, which should carry the INSERT SQL within the request body, noting that we should specify the database name in the SQL and the character type should be enclosed in single quotes, with the message content template as follows
-- Note: the topic is added as an identifier because in this example we will have two resources written to TDengine, and the identifier distinguishes between the data written natively and by the Web Server
insert into test.t_mqtt_msg(ts, msgid, mqtt_topic, qos, payload, arrived) values (${ts}, '${id}', 'http server ${topic}', ${qos}, '${payload}', ${timestamp})
1
2

image

Create Web Server resource:


Web Server config:
Request URL is http://127.0.0.1:6041.
Please fill in the other fields according to the server settings. If encrypted transmission is configured, please fill in the certificate information. Only the default parameters are used in the example.
Return to the rule screen and click "Create".

image

# Test

In the rule list, click on the Rule ID link to preview the rule you just created.

image

The rule has been created, now send a data:

Topic: "t/a"
QoS: 1
Payload: {"msg": "hello"}
1
2
3

Query and check:

select * from t_mqtt_msg;
1

image