Show last authors
1 **Table of Contents:**
2
3 {{toc/}}
4
5 {{warning}}
6 Draft Document
7 {{/warning}}
8
9 = Introduction =
10
11 This document guides you on integrating Dragino **-NB** and **-CB** series devices data with ThingsBoard. For this guide, we use ThingsBoard Cloud, which is one of the ThingsBoard versions that allows you to try it for free.
12
13 The **NB series** devices end with the suffix **-NB**, and the **CB series** devices end with the suffix **-CB**. For example, **S31B-NB** is an **NB device**, and **S31-CB** is a **CB device**.
14
15
16 = Add New Device =
17
18 In the left navigation, click **Entities** and then click **Devices**.
19
20
21 [[image:ThingsBoard-Device.png]]
22
23
24 On the **Devices **page, click on the ‘**+**’ button, and then click on the **Add new device **from the dropdown menu.
25
26
27 [[image:ThingsBoard-add-new-device.png||height="279" width="500"]]
28
29
30
31 = Data Converters =
32
33 In **ThingsBoard**, **Data Converters** are components used to transform incoming or outgoing data between different formats, typically to convert raw telemetry data from devices into a structured format that ThingsBoard can understand, or vice versa.
34
35
36 == Uplink ==
37
38 In the left navigation, click **Integrations center**, and then click **Data converters**.
39
40
41 [[image:data-converter-list-page.png]]
42
43
44 On the **Data converters** page, click on the ‘+’ button, and then click on the **Create new converter** from the dropdown menu.
45
46
47 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
48
49
50 The **Add data converter** window will appear. Name it ‘**MQTT Uplink Converter NB/CB**’ and select the Type as **Uplink**.
51
52 Click on the **JavaScript** button. Now copy and paste the following JavaScript to the **Decoder function** section. This decoder function is valid for both NB and CB series devices.
53
54 {{code language="JavaScript"}}
55 //Version: 0.1
56 // decode payload to string
57 var payloadStr = decodeToString(payload);
58
59 // decode payload to JSON
60 var objdata = {};
61 var obj1 = {};
62 var data = decodeToJson(payload);
63 var deviceName = data.IMEI;
64 delete data.IMEI;
65 var modelname = "Dragino " + data.Model;
66 //var mod = data.mod
67 delete data.Model;
68 //delete data.mod
69 var timestamp = new Date().getTime();
70
71 for (var key in data) {
72
73 if (Number(key)) {
74 obj1[key] = data[key];
75 obj1[key][obj1[key].length - 1] = Number(new Date(
76 obj1[key][obj1[key].length - 1]));
77
78 }
79 //Alec submitted25/02/25
80 //turn old key into new
81 else if (key === "Reading") {
82 objdata["reading"] = data[key];
83 } else if (key === "work mode") {
84 objdata["work_mode"] = data[key];
85 } else if (key === "hum") {
86 objdata["humidity"] = data[key];
87 }else if (key === "hum2") {
88 objdata["humidity2"] = data[key];
89 } else if (key === "hum3") {
90 objdata["humidity3"] = data[key];
91 } else if (key === "tem") {
92 objdata["temperature"] = data[key];
93 } else if (key === "tem2") {
94 objdata["temperature2"] = data[key];
95 } else if (key === "tem3") {
96 objdata["temperature3"] = data[key];
97 } else if (key === "DS18B20_Temp") {
98 objdata["temperature_pro"] = data[key];
99 } else if (key === "ds18b20_temperature") {
100 objdata["temperature_pro"] = data[key];
101 } else if (key === "DS18B20_temperature_pro") {
102 objdata["temperature_pro"] = data[key];
103 } else if (key === "tdc send flag") {
104 objdata["tdc_send_flag"] = data[key];
105 } else if (key === "trigger mode") {
106 objdata["trigger_mode"] = data[key];
107 } else if (key === "soil dielectric constant") {
108 objdata["soil_dielectric_constant"] = data[key];
109 } else if (key === "door open num") {
110 objdata["door_open_num"] = data[key];
111 } else if (key === "door duration") {
112 objdata["door_duration"] = data[key];
113 } else if (key === "count time") {
114 objdata["count_time"] = data[key];
115 } else if (key === "last open time2") {
116 objdata["last_open_time2"] = data[key];
117 } else if (key === "last open time3") {
118 objdata["last_open_time3"] = data[key];
119 }
120 //Alec submitted25/02/25
121 else {
122 objdata[key] = data[key]
123 }
124 }
125 var listdata = [{
126 "ts": timestamp,
127 "values": objdata
128 }]
129 for (var key1 in obj1) {
130 if (modelname == "Dragino RS485-NB") {
131 listdata.push({
132 "ts": obj1[key1][obj1[key1].length - 1],
133 "values": {
134 "Payload": obj1[key1][0],
135 }
136 })
137 } else {
138 listdata.push({
139 "ts": obj1[key1][obj1[key1].length - 1],
140 "values": {
141 "values": obj1[key1]
142 },
143 })
144 }
145 }
146 var result = {
147
148 deviceName: deviceName,
149 deviceType: modelname,
150 attributes: {
151 model: modelname,
152 //customerName: "NB-CB",
153 //groupName: "NB-CB",
154 //integrationName: metadata['integrationName']
155
156 },
157 telemetry: listdata
158 }
159
160 function decodeToString(payload) {
161 return String.fromCharCode.apply(String, payload);
162 }
163
164 function decodeToJson(payload) {
165 // covert payload to string.
166 var str = decodeToString(payload);
167
168 // parse string to JSON
169 var data = JSON.parse(str);
170 return data;
171 }
172
173 return result;
174
175 {{/code}}
176
177 Click on the **Add** button.
178
179
180 [[image:uplink-data-converter.png||height="529" width="500"]]
181
182
183
184 You should see that the newly added **uplink data converter** is listed on the **Data Converters** page.
185
186
187 [[image:data-converter-list-showing-uplink-dc.png]]
188
189
190 == Downlink ==
191
192 On the **Data converters** page, click on the ‘**+**’ button, and then click on the **Create new converter** from the dropdown menu.
193
194
195 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
196
197
198 The **Add data converter** window will appear. Name it ‘**MQTT Downlink Converter NB/CB**’ and select the Type as **Downlink**.
199
200 Click on the **JavaScript** button. Now copy and paste the following JavaScript to the **Encoder function **section. This encoder function is valid for both NB and CB series devices.
201
202
203 {{code language="JavaScript"}}
204 function hexToBase64(hexString) {
205 // 将16进制字符串两个字符转换为一个字节
206 var bytes = hexString.match(/.{2}/g);
207 // 对每个字节进行解析,并转换为对应的字符
208 var binaryString = bytes.map(function(byte) {
209 return String.fromCharCode(parseInt(byte, 16));
210 }).join('');
211
212 // 使用btoa进行base64编码
213 return btoa(binaryString);
214 }
215
216 // Result object with encoded downlink payload
217 var result = {
218 // downlink data content type: JSON, TEXT or BINARY (base64 format)
219 contentType: "BINARY",
220
221 // downlink data
222 data:hexToBase64(metadata.shared_value)
223
224 // Optional metadata object presented in key/value format
225 //metadata: {}
226
227 };
228
229 return result;
230 {{/code}}
231
232
233 Click on the **Add** button.
234
235
236 [[image:downlink-data-converter.png||height="530" width="500"]]
237
238
239
240 You should see that the newly added **downlink data converter** is listed on the **Data Converters** page.
241
242
243 [[image:data-converter-list.png]]
244
245
246 = Add Integration =
247
248 In the left navigation, click **Integrations center**, and then click **Integrations**.
249
250 On the **Integrations** page, click on the '**+**' button.
251
252
253 [[image:ThingsBoard-add-integration.png]]
254
255
256 The **Add integration** window appears.
257
258 In the **Add integration** window, configure the following settings:
259
260
261 **Basic settings:**
262
263 * **Integration type**: UDP
264 * **Name**: UDP Integration NB/CB
265
266 Click **Next** button.
267
268
269 [[image:add-integration-basic-settings.png||height="511" width="500"]]
270
271
272 **Uplink data converter:**
273
274 * Click on the **Select existing** button.
275 * **Uplink data converter**: Select **UDP Uplink Converter NB/CB **from the dropdown list.
276
277 Click **Next** button.
278
279
280 [[image:add-integration-uplink-data-converter.png||height="511" width="500"]]
281
282
283 **Downlink data converter:**
284
285 * Click on the **Select existing** button.
286 * **Downlink data converter**: Select **UDP Downlink Converter NB/CB **from the dropdown list.
287
288 Click **Next** button.
289
290
291 [[image:add-integration-downlink-data-converter.png||height="512" width="500"]]
292
293
294 **Connection:**
295
296 * **Port**: 11582
297 * **Size of the buffer for inbound socket (in KB)**: 64
298 * **Cache Size**: 10000000
299 * **Cache time to live in minutes**: 1440
300
301 Copy the two keys, **Integration key** and **Integration secret** into a text editor, as you will need them in the section ‘xxxxx’.
302
303 Click on the **Add** button.
304
305
306 [[image:add-integration-connection.png||height="511" width="500"]]
307
308
309 You should see that the newly added integration is listed on the **Integrations** page.
310
311 Since we haven't received data from a device yet, the integration **Status** is shown as **Pending.**
312
313 [[image:Integrations-list.png]]
314
315
316 = Verifying the receipt of data from the device =
317
318 Connect **S31B-NB** to transfer information. If the integration was performed without errors, after the transmission of the first telemetry, a new device with the name “xxxxx” will appear in the Devices → All. Also, you can verify the input and output data, respectively, before and after conversion in Data converters → UDP Uplink Converter NB/CB → Events.
Copyright ©2010-2024 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0