Wiki source code of ThingsBoard

Version 18.1 by Dilisi S on 2025/03/04 04:01

Hide last authors
Dilisi S 1.1 1 **Table of Contents:**
2
3 {{toc/}}
4
Dilisi S 16.1 5 {{warning}}
6 Draft Document
7 {{/warning}}
Dilisi S 1.1 8
9 = Introduction =
10
Dilisi S 18.1 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.
Dilisi S 2.1 12
Dilisi S 18.1 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.
Dilisi S 11.1 14
Dilisi S 17.1 15
Dilisi S 11.1 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
34 == Uplink ==
35
36 In the left navigation, click ‘Integrations center’, and then click ‘Data converters’.
37
38
39 [[image:ThingsBoard-Data-Converters.png]]
40
41
42 On the ‘Data converters’ page, click on the ‘+’ button, and then click on the ‘Create new converter’ from the dropdown menu.
43
44
45 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
46
47
48 The ‘Add data converter’ window will appear. Name it ‘**UDP Uplink Converter NB/CB**’ and select the Type as ‘Uplink’.
49
50 Click on the ‘JavaScript’ button. Now copy and paste the following script to the ‘Decoder function’ section:
51
52 {{code language="JavaScript"}}
53 //Version: 0.1
54 // decode payload to string
55 var payloadStr = decodeToString(payload);
56
57 // decode payload to JSON
58 var objdata = {};
59 var obj1 = {};
60 var data = decodeToJson(payload);
61 var deviceName = data.IMEI;
62 delete data.IMEI;
63 var modelname = "Dragino " + data.Model;
64 //var mod = data.mod
65 delete data.Model;
66 //delete data.mod
67 var timestamp = new Date().getTime();
68
69 for (var key in data) {
70
71 if (Number(key)) {
72 obj1[key] = data[key];
73 obj1[key][obj1[key].length - 1] = Number(new Date(
74 obj1[key][obj1[key].length - 1]));
75
76 }
77 //Alec submitted25/02/25
78 //turn old key into new
79 else if (key === "Reading") {
80 objdata["reading"] = data[key];
81 } else if (key === "work mode") {
82 objdata["work_mode"] = data[key];
83 } else if (key === "hum") {
84 objdata["humidity"] = data[key];
85 }else if (key === "hum2") {
86 objdata["humidity2"] = data[key];
87 } else if (key === "hum3") {
88 objdata["humidity3"] = data[key];
89 } else if (key === "tem") {
90 objdata["temperature"] = data[key];
91 } else if (key === "tem2") {
92 objdata["temperature2"] = data[key];
93 } else if (key === "tem3") {
94 objdata["temperature3"] = data[key];
95 } else if (key === "DS18B20_Temp") {
96 objdata["temperature_pro"] = data[key];
97 } else if (key === "ds18b20_temperature") {
98 objdata["temperature_pro"] = data[key];
99 } else if (key === "DS18B20_temperature_pro") {
100 objdata["temperature_pro"] = data[key];
101 } else if (key === "tdc send flag") {
102 objdata["tdc_send_flag"] = data[key];
103 } else if (key === "trigger mode") {
104 objdata["trigger_mode"] = data[key];
105 } else if (key === "soil dielectric constant") {
106 objdata["soil_dielectric_constant"] = data[key];
107 } else if (key === "door open num") {
108 objdata["door_open_num"] = data[key];
109 } else if (key === "door duration") {
110 objdata["door_duration"] = data[key];
111 } else if (key === "count time") {
112 objdata["count_time"] = data[key];
113 } else if (key === "last open time2") {
114 objdata["last_open_time2"] = data[key];
115 } else if (key === "last open time3") {
116 objdata["last_open_time3"] = data[key];
117 }
118 //Alec submitted25/02/25
119 else {
120 objdata[key] = data[key]
121 }
122 }
123 var listdata = [{
124 "ts": timestamp,
125 "values": objdata
126 }]
127 for (var key1 in obj1) {
128 if (modelname == "Dragino RS485-NB") {
129 listdata.push({
130 "ts": obj1[key1][obj1[key1].length - 1],
131 "values": {
132 "Payload": obj1[key1][0],
133 }
134 })
135 } else {
136 listdata.push({
137 "ts": obj1[key1][obj1[key1].length - 1],
138 "values": {
139 "values": obj1[key1]
140 },
141 })
142 }
143 }
144 var result = {
145
146 deviceName: deviceName,
147 deviceType: modelname,
148 attributes: {
149 model: modelname,
150 //customerName: "NB-CB",
151 //groupName: "NB-CB",
152 //integrationName: metadata['integrationName']
153
154 },
155 telemetry: listdata
156 }
157
158 function decodeToString(payload) {
159 return String.fromCharCode.apply(String, payload);
160 }
161
162 function decodeToJson(payload) {
163 // covert payload to string.
164 var str = decodeToString(payload);
165
166 // parse string to JSON
167 var data = JSON.parse(str);
168 return data;
169 }
170
171 return result;
172
173 {{/code}}
174
175 Click on the ‘Add’ button.
176
177
178 [[image:ThingsBoard-add-data-converter-uplink.png||width="500"]]
179
180
181 The uplink data converter is added to ThingsBoard and appears on the ‘Data Converters’ page
182
183
184 == Downlink ==
185
186 On the ‘Data converters’ page, click on the ‘+’ button, and then click on the ‘Create new converter’ from the dropdown menu.
187
188
189 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
190
191
192 The ‘**Add data converter**’ window will appear. Name it ‘**UDP Downlink Converter NB/CB**’ and select the Type as ‘**Downlink**’.
193
194 Click on the ‘**JavaScript**’ button. Now copy and paste the following script to the ‘**Encoder function**’ section:
195
196
197 {{code language="JavaScript"}}
198 function hexToBase64(hexString) {
199 // 将16进制字符串两个字符转换为一个字节
200 var bytes = hexString.match(/.{2}/g);
201 // 对每个字节进行解析,并转换为对应的字符
202 var binaryString = bytes.map(function(byte) {
203 return String.fromCharCode(parseInt(byte, 16));
204 }).join('');
Dilisi S 1.1 205
Dilisi S 11.1 206 // 使用btoa进行base64编码
207 return btoa(binaryString);
208 }
209
210 // Result object with encoded downlink payload
211 var result = {
212 // downlink data content type: JSON, TEXT or BINARY (base64 format)
213 contentType: "BINARY",
214
215 // downlink data
216 data:hexToBase64(metadata.shared_value)
217
218 // Optional metadata object presented in key/value format
219 //metadata: {}
220
221 };
222
223 return result;
224 {{/code}}
225
226
227 Click on the **Add** button.
228
229
230 [[image:ThingsBoard-add-data-converter-downlink.png||height="532" width="500"]]
231
232
233 = Add Integration =
234
235 In the left navigation, click ‘Integrations center’, and then click ‘Integrations’.
236
237 On the ‘Integrations’ page, click on the “+” button.
238
239
240 [[image:ThingsBoard-add-integration.png]]
241
242
243 The ‘Add integration’ window appears.
244
245 In the Add Integration window, configure the following settings:
246
247 **Basic settings:**
248
249 * **Integration type**: UDP
250 * **Name**: UDP Integration NB/CB
251
252 Click **Next** button.
253
254
Dilisi S 16.1 255 [[image:add-integration-basic-settings.png||height="511" width="500"]]
Dilisi S 11.1 256
257
Dilisi S 16.1 258 **Uplink data converter:**
Dilisi S 11.1 259
Dilisi S 16.1 260 * Click on the ‘**Select existing**’ button.
261 * Uplink data converter: Select ‘**UDP Uplink Converter NB/CB**’ from the dropdown list.
262
263 Click **Next** button.
264
265
266 [[image:add-integration-uplink-data-converter.png||height="511" width="500"]]
267
268
269 **Downlink data converter:**
270
271 * Click on the ‘**Select existing**’ button.
272 * Downlink data converter: Select ‘**UDP Downlink Converter NB/CB**’ from the dropdown list.
273
274 Click **Next** button.
275
276
277 [[image:add-integration-downlink-data-converter.png||height="512" width="500"]]
278
279
280 **Connection:**
281
282 **Port**: 11582
283
284 **Size of the buffer for inbound socket (in KB)**: 64
285
286 **Cache Size**: 10000000
287
288 **Cache time to live in minutes**: 1440
289
290
291 Copy the two keys, **Integration key** and **Integration secret** into a text editor, as you will need them in the section ‘xxxxx’.
292
293 Click on the **Add** button.
294
295
296 [[image:add-integration-connection.png||height="511" width="500"]]
297
298
299
300 = Verifying the receipt of data from the device =
301
302 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.
303
304
Dilisi S 11.1 305