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:ThingsBoard-Data-Converters.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 ‘**UDP 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:ThingsBoard-add-data-converter-uplink.png||width="500"]]
181
182
183 You should see that the newly added **uplink data converter** is listed on the **Data Converters** page.
184
185
186 [[image:Data-converter-list-uplink-only.png]]
187
188
189 == Downlink ==
190
191 On the **Data converters** page, click on the ‘**+**’ button, and then click on the **Create new converter** from the dropdown menu.
192
193
194 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
195
196
197 The **Add data converter** window will appear. Name it ‘**UDP Downlink Converter NB/CB**’ and select the Type as **Downlink**.
198
199 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.
200
201
202 {{code language="JavaScript"}}
203 function hexToBase64(hexString) {
204 // 将16进制字符串两个字符转换为一个字节
205 var bytes = hexString.match(/.{2}/g);
206 // 对每个字节进行解析,并转换为对应的字符
207 var binaryString = bytes.map(function(byte) {
208 return String.fromCharCode(parseInt(byte, 16));
209 }).join('');
210
211 // 使用btoa进行base64编码
212 return btoa(binaryString);
213 }
214
215 // Result object with encoded downlink payload
216 var result = {
217 // downlink data content type: JSON, TEXT or BINARY (base64 format)
218 contentType: "BINARY",
219
220 // downlink data
221 data:hexToBase64(metadata.shared_value)
222
223 // Optional metadata object presented in key/value format
224 //metadata: {}
225
226 };
227
228 return result;
229 {{/code}}
230
231
232 Click on the **Add** button.
233
234
235 [[image:ThingsBoard-add-data-converter-downlink.png||height="532" width="500"]]
236
237
238 You should see that the newly added **downlink data converter** is listed on the **Data Converters** page.
239
240
241 [[image:Data-converter-list.png]]
242
243
244 = Add Integration =
245
246 In the left navigation, click **Integrations center**, and then click **Integrations**.
247
248 On the **Integrations** page, click on the '**+**' button.
249
250
251 [[image:ThingsBoard-add-integration.png]]
252
253
254 The **Add integration** window appears.
255
256 In the **Add integration** window, configure the following settings:
257
258
259 **Basic settings:**
260
261 * **Integration type**: UDP
262 * **Name**: UDP Integration NB/CB
263
264 Click **Next** button.
265
266
267 [[image:add-integration-basic-settings.png||height="511" width="500"]]
268
269
270 **Uplink data converter:**
271
272 * Click on the **Select existing** button.
273 * **Uplink data converter**: Select **UDP Uplink Converter NB/CB **from the dropdown list.
274
275 Click **Next** button.
276
277
278 [[image:add-integration-uplink-data-converter.png||height="511" width="500"]]
279
280
281 **Downlink data converter:**
282
283 * Click on the **Select existing** button.
284 * **Downlink data converter**: Select **UDP Downlink Converter NB/CB **from the dropdown list.
285
286 Click **Next** button.
287
288
289 [[image:add-integration-downlink-data-converter.png||height="512" width="500"]]
290
291
292 **Connection:**
293
294 * **Port**: 11582
295 * **Size of the buffer for inbound socket (in KB)**: 64
296 * **Cache Size**: 10000000
297 * **Cache time to live in minutes**: 1440
298
299 Copy the two keys, **Integration key** and **Integration secret** into a text editor, as you will need them in the section ‘xxxxx’.
300
301 Click on the **Add** button.
302
303
304 [[image:add-integration-connection.png||height="511" width="500"]]
305
306
307 You should see that the newly added integration is listed on the **Integrations** page.
308
309 Since we haven't received data from a device yet, the integration **Status** is shown as **Pending.**
310
311 [[image:Integrations-list.png]]
312
313
314 = Verifying the receipt of data from the device =
315
316 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.
317
318
319
Copyright ©2010-2024 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0