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 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 For example, the following devices fall into the -NB and -CB series:
14
15 (% style="width:556px" %)
16 |(% style="width:261px" %)**NB Series**|(% style="width:293px" %)**CB Series**
17 |(% style="width:261px" %)S31B-NB|(% style="width:293px" %)S31-CB
18 |(% style="width:261px" %) |(% style="width:293px" %)
19
20
21
22 = Add New Device =
23
24 In the left navigation, click **Entities** and then click **Devices**.
25
26
27 [[image:ThingsBoard-Device.png]]
28
29
30 On the ‘**Devices**’ page, click on the ‘**+**’ button, and then click on the ‘**Add new device**’ from the dropdown menu.
31
32
33 [[image:ThingsBoard-add-new-device.png||height="279" width="500"]]
34
35
36
37 = Data Converters =
38
39
40 == Uplink ==
41
42 In the left navigation, click ‘Integrations center’, and then click ‘Data converters’.
43
44
45 [[image:ThingsBoard-Data-Converters.png]]
46
47
48 On the ‘Data converters’ page, click on the ‘+’ button, and then click on the ‘Create new converter’ from the dropdown menu.
49
50
51 [[image:ThingsBoard-new-data-converter.png||height="282" width="500"]]
52
53
54 The ‘Add data converter’ window will appear. Name it ‘**UDP Uplink Converter NB/CB**’ and select the Type as ‘Uplink’.
55
56 Click on the ‘JavaScript’ button. Now copy and paste the following script to the ‘Decoder function’ section:
57
58 {{code language="JavaScript"}}
59 //Version: 0.1
60 // decode payload to string
61 var payloadStr = decodeToString(payload);
62
63 // decode payload to JSON
64 var objdata = {};
65 var obj1 = {};
66 var data = decodeToJson(payload);
67 var deviceName = data.IMEI;
68 delete data.IMEI;
69 var modelname = "Dragino " + data.Model;
70 //var mod = data.mod
71 delete data.Model;
72 //delete data.mod
73 var timestamp = new Date().getTime();
74
75 for (var key in data) {
76
77 if (Number(key)) {
78 obj1[key] = data[key];
79 obj1[key][obj1[key].length - 1] = Number(new Date(
80 obj1[key][obj1[key].length - 1]));
81
82 }
83 //Alec submitted25/02/25
84 //turn old key into new
85 else if (key === "Reading") {
86 objdata["reading"] = data[key];
87 } else if (key === "work mode") {
88 objdata["work_mode"] = data[key];
89 } else if (key === "hum") {
90 objdata["humidity"] = data[key];
91 }else if (key === "hum2") {
92 objdata["humidity2"] = data[key];
93 } else if (key === "hum3") {
94 objdata["humidity3"] = data[key];
95 } else if (key === "tem") {
96 objdata["temperature"] = data[key];
97 } else if (key === "tem2") {
98 objdata["temperature2"] = data[key];
99 } else if (key === "tem3") {
100 objdata["temperature3"] = data[key];
101 } else if (key === "DS18B20_Temp") {
102 objdata["temperature_pro"] = data[key];
103 } else if (key === "ds18b20_temperature") {
104 objdata["temperature_pro"] = data[key];
105 } else if (key === "DS18B20_temperature_pro") {
106 objdata["temperature_pro"] = data[key];
107 } else if (key === "tdc send flag") {
108 objdata["tdc_send_flag"] = data[key];
109 } else if (key === "trigger mode") {
110 objdata["trigger_mode"] = data[key];
111 } else if (key === "soil dielectric constant") {
112 objdata["soil_dielectric_constant"] = data[key];
113 } else if (key === "door open num") {
114 objdata["door_open_num"] = data[key];
115 } else if (key === "door duration") {
116 objdata["door_duration"] = data[key];
117 } else if (key === "count time") {
118 objdata["count_time"] = data[key];
119 } else if (key === "last open time2") {
120 objdata["last_open_time2"] = data[key];
121 } else if (key === "last open time3") {
122 objdata["last_open_time3"] = data[key];
123 }
124 //Alec submitted25/02/25
125 else {
126 objdata[key] = data[key]
127 }
128 }
129 var listdata = [{
130 "ts": timestamp,
131 "values": objdata
132 }]
133 for (var key1 in obj1) {
134 if (modelname == "Dragino RS485-NB") {
135 listdata.push({
136 "ts": obj1[key1][obj1[key1].length - 1],
137 "values": {
138 "Payload": obj1[key1][0],
139 }
140 })
141 } else {
142 listdata.push({
143 "ts": obj1[key1][obj1[key1].length - 1],
144 "values": {
145 "values": obj1[key1]
146 },
147 })
148 }
149 }
150 var result = {
151
152 deviceName: deviceName,
153 deviceType: modelname,
154 attributes: {
155 model: modelname,
156 //customerName: "NB-CB",
157 //groupName: "NB-CB",
158 //integrationName: metadata['integrationName']
159
160 },
161 telemetry: listdata
162 }
163
164 function decodeToString(payload) {
165 return String.fromCharCode.apply(String, payload);
166 }
167
168 function decodeToJson(payload) {
169 // covert payload to string.
170 var str = decodeToString(payload);
171
172 // parse string to JSON
173 var data = JSON.parse(str);
174 return data;
175 }
176
177 return result;
178
179 {{/code}}
180
181 Click on the ‘Add’ button.
182
183
184 [[image:ThingsBoard-add-data-converter-uplink.png||width="500"]]
185
186
187 The uplink data converter is added to ThingsBoard and appears on the ‘Data Converters’ page
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 ‘**UDP Downlink Converter NB/CB**’ and select the Type as ‘**Downlink**’.
199
200 Click on the ‘**JavaScript**’ button. Now copy and paste the following script to the ‘**Encoder function**’ section:
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:ThingsBoard-add-data-converter-downlink.png||height="532" width="500"]]
237
238
239 = Add Integration =
240
241 In the left navigation, click ‘Integrations center’, and then click ‘Integrations’.
242
243 On the ‘Integrations’ page, click on the “+” button.
244
245
246 [[image:ThingsBoard-add-integration.png]]
247
248
249 The ‘Add integration’ window appears.
250
251 In the Add Integration window, configure the following settings:
252
253 **Basic settings:**
254
255 * **Integration type**: UDP
256 * **Name**: UDP Integration NB/CB
257
258 Click **Next** button.
259
260
261 [[image:add-integration-basic-settings.png||height="511" width="500"]]
262
263
264 **Uplink data converter:**
265
266 * Click on the ‘**Select existing**’ button.
267 * Uplink data converter: Select ‘**UDP Uplink Converter NB/CB**’ from the dropdown list.
268
269 Click **Next** button.
270
271
272 [[image:add-integration-uplink-data-converter.png||height="511" width="500"]]
273
274
275 **Downlink data converter:**
276
277 * Click on the ‘**Select existing**’ button.
278 * Downlink data converter: Select ‘**UDP Downlink Converter NB/CB**’ from the dropdown list.
279
280 Click **Next** button.
281
282
283 [[image:add-integration-downlink-data-converter.png||height="512" width="500"]]
284
285
286 **Connection:**
287
288 **Port**: 11582
289
290 **Size of the buffer for inbound socket (in KB)**: 64
291
292 **Cache Size**: 10000000
293
294 **Cache time to live in minutes**: 1440
295
296
297 Copy the two keys, **Integration key** and **Integration secret** into a text editor, as you will need them in the section ‘xxxxx’.
298
299 Click on the **Add** button.
300
301
302 [[image:add-integration-connection.png||height="511" width="500"]]
303
304
305
306 = Verifying the receipt of data from the device =
307
308 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.
309
310
311
Copyright ©2010-2024 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0