Last modified by Hera Guo on 2025/02/18 09:29

From version 10.1
edited by Chxy
on 2024/10/11 09:41
Change comment: There is no comment for this version
To version 16.1
edited by Hera Guo
on 2024/11/27 09:09
Change comment: There is no comment for this version

Summary

Details

Page properties
Author
... ... @@ -1,1 +1,1 @@
1 -XWiki.EdwinChen
1 +XWiki.hera
Content
... ... @@ -44,7 +44,7 @@
44 44  
45 45  Device here is **[[S31-NB>>https://www.dragino.com/products/temperature-humidity-sensor/item/288-s31-nb-s31b-nb.html]]** : and have been configure below
46 46  
47 -* Set to use ThingsEye UDP server: **AT+SERVADDR=server1.thingseye.io,11560**
47 +* Set to use ThingsEye UDP server: **AT+SERVADDR=server1.thingseye.io,11562**
48 48  * Use UDP Uplink & Json protocol:** AT+PRO=2,5**
49 49  * Equip with a NB-IoT SIM Card to access to NB-IoT Network.
50 50  
... ... @@ -69,8 +69,6 @@
69 69  
70 70  **So we have this device in the Tenant Device List. The next step will be how to use these value to make a nice dashboard for user's application.**
71 71  
72 -
73 -
74 74  = 3.  Connect to The Things Stack =
75 75  
76 76  == 3.1 Network Structure ==
... ... @@ -95,107 +95,17 @@
95 95  
96 96  [[image:1728535941851-388.png||height="466" width="398"]]
97 97  
98 -Demo Code as below:
96 +Demo JavaScript Code: [[https:~~/~~/raw.githubusercontent.com/ThingsEye-io/te-platform/refs/heads/main/Data%20Converters/The_Things_Network_MQTT_Uplink_Converter.js >>https://raw.githubusercontent.com/ThingsEye-io/te-platform/refs/heads/main/Data%20Converters/The_Things_Network_MQTT_Uplink_Converter.js]]
99 99  
100 ->var data = decodeToJson(payload);
101 ->var deviceName = data.end_device_ids.device_id;
102 ->var deviceType = data.end_device_ids.application_ids.application_id;
103 ->var model = {};
104 ->var data2 = data.uplink_message.decoded_payload;
105 ->var flg = data.uplink_message.f_port
106 ->for (var key in data2) {
107 -> model[key] = data2[key];
108 ->}
109 ->var obj =  {"devid":deviceName}
110 ->var result = {
111 -> deviceName: deviceName,
112 -> deviceType: deviceType,
113 -> telemetry: model,
114 -> groupName: "Case Study",
115 -> attributes:{"devid":deviceName,
116 -> "timevalue":"test",
117 -> "inactivityTimeout":1260000
118 -> }
119 ->};
120 ->function decodeToString(payload) {
121 -> return String.fromCharCode.apply(String, payload);
122 ->}function decodeToJson(payload) {
123 -> var str = decodeToString(payload);
124 -> var data = JSON.parse(str);
125 -> return data;
126 ->}
127 ->if (flg===2){
128 ->return result;
129 ->}
130 130  
131 -
132 132  (% class="lead" %)
133 133  Input Downlink Converter
134 134  
135 135  [[image:1728536142721-488.png||height="470" width="407"]]
136 136  
137 -Example Code as below:
104 +Example Javascript Code as below: [[https:~~/~~/raw.githubusercontent.com/ThingsEye-io/te-platform/refs/heads/main/Data%20Converters/The_Things_Network_MQTT_Downlink_Converter.js>>https://raw.githubusercontent.com/ThingsEye-io/te-platform/refs/heads/main/Data%20Converters/The_Things_Network_MQTT_Downlink_Converter.js]]
138 138  
139 ->function hexToBase64(hexString) {
140 -> var bytes = hexString.match(/.{2}/g);
141 -> var binaryString = bytes.map(function(byte) {
142 -> return String.fromCharCode(parseInt(byte, 16));
143 -> }).join('');
144 ->
145 -> return btoa(binaryString);
146 ->}
147 ->var flg = "shared_value" in metadata
148 ->var value2 = parseInt(metadata.ss_timevalue).toString(16)if (value2.length==1){
149 -> value2 = "00000"+parseInt(metadata.ss_timevalue).toString(16)
150 ->}
151 ->else if (value2.length==2){
152 -> value2 = "0000"+parseInt(metadata.ss_timevalue).toString(16)
153 ->}
154 ->else if (value2.length==3){
155 -> value2 = "000"+parseInt(metadata.ss_timevalue).toString(16)
156 ->}
157 ->else if (value2.length==4){
158 -> value2 = "00"+parseInt(metadata.ss_timevalue).toString(16)
159 ->}
160 ->else if (value2.length==5){
161 -> value2 = "0"+parseInt(metadata.ss_timevalue).toString(16)
162 ->}
163 ->else {
164 -> value2 = value2
165 ->}
166 ->var data = "01"+value2
167 ->if (flg === true){
168 ->data = {
169 -> downlinks: [{
170 -> f_port: 1,
171 -> confirmed: false,
172 -> frm_payload: hexToBase64(metadata.shared_value),
173 -> priority: "NORMAL"
174 -> }]
175 -> };
176 ->}
177 ->else{
178 -> data = {
179 -> downlinks: [{
180 -> f_port: 1,
181 -> confirmed: false,
182 -> frm_payload: hexToBase64(data),
183 -> priority: "NORMAL"
184 -> }]
185 -> };
186 ->}
187 ->var result = {
188 -> contentType: "JSON",
189 -> data: JSON.stringify(data),
190 -> metadata: {
191 -> devId: metadata.ss_devid
192 -> }
193 ->};
194 ->if (metadata.shared_timevalue!=="test" || metadata.ss_timevalue!=="test"){
195 ->return result;
196 ->}
197 197  
198 -
199 199  (% class="lead" %)
200 200  Set up Connection to The Things Network application
201 201  
... ... @@ -221,3 +221,201 @@
221 221  
222 222  
223 223  [[image:1728536541040-814.png]]
132 +
133 += 4.Connect chirpstack to Thingseye by way of MQTT =
134 +
135 +* **How to connect chirpstack to Thingseye by way of MQTT? The following tutorial will show you**
136 +
137 +== 4.1 Thingseye adds MQTT integration ==
138 +
139 +Go to the Integrations page in the Integrations center section. Click the plus button to start adding a new integration. Select the type "MQTT" integration and click "Next";
140 +
141 +[[image:图片1.png]]
142 +
143 +== 4.2 Add an uplink and downlink data converter ==
144 +
145 +In the function decoder field, specify the script to parse and transform the data.
146 +
147 +[[image:图片2.png]]
148 +
149 +* **Uplink——JavaScript:**
150 +
151 +var data = decodeToJson(payload);
152 +
153 +var deviceName = data.deviceInfo.deviceName;
154 +
155 +var deviceType = data.applicationName;
156 +
157 +var devEui = data.deviceInfo.devEui
158 +
159 +var label = data.deviceInfo.devEui
160 +
161 +var model = {};
162 +
163 +var data2 = data.object;
164 +
165 +var flg = data.fPort
166 +
167 +for (var key in data2) {
168 +
169 + ~/~/ 将属性名存入新对象中
170 +
171 + model[key] = data2[key];
172 +
173 +}
174 +
175 +~/~/var obj = {"devid":deviceName}
176 +
177 +var result = {
178 +
179 + deviceName: deviceName,
180 +
181 + deviceType: deviceType,
182 +
183 + telemetry: model,
184 +
185 + groupName: "Case Study",
186 +
187 + ~/~/label:label,
188 +
189 + attributes:{"devEui":devEui,
190 +
191 + ~/~/"timevalue":"test",
192 +
193 + "inactivityTimeout":1260000
194 +
195 + ~/~/ "High_humidity_alarm":"not set",
196 +
197 + ~/~/ "High_temperature_alarm":"not set",
198 +
199 + ~/~/ "Low_humidity_alarm":"not set",
200 +
201 + ~/~/ "Low_temperature_alarm":"not set",
202 +
203 + ~/~/ "Low_voltage_alarm":"not set"
204 +
205 + ~/~/"customerName": "Civionic Engineering & Consulting (2014) Inc."
206 +
207 + }
208 +
209 +};
210 +
211 +function decodeToString(payload) {
212 +
213 + return String.fromCharCode.apply(String, payload);
214 +
215 +}
216 +
217 +function decodeToJson(payload) {
218 +
219 + var str = decodeToString(payload);
220 +
221 + var data = JSON.parse(str);
222 +
223 + return data;
224 +
225 +}
226 +
227 +return result;
228 +
229 +[[image:图片3.png]]
230 +
231 +* **Dowblink——JavaScript:**
232 +
233 +~/~/ Encode downlink data from incoming Rule Engine message
234 +
235 +~/~/ msg - JSON message payload downlink message json
236 +
237 +~/~/ msgType - type of message, for ex. 'ATTRIBUTES_UPDATED', 'POST_TELEMETRY_REQUEST', etc.
238 +
239 +~/~/ metadata - list of key-value pairs with additional data about the message
240 +
241 +~/~/ integrationMetadata - list of key-value pairs with additional data defined in Integration executing this converter
242 +
243 +~/~/ /~*~* Encoder ~*~*/
244 +
245 +~/~/var data = {"value":99};
246 +
247 +~/~/ ~/~/ Process data from incoming message and metadata
248 +
249 +~/~/ data.tempFreq = msg.temperatureUploadFrequency;
250 +
251 +~/~/ data.humFreq = msg.humidityUploadFrequency;
252 +
253 +~/~/ data.devSerialNumber = metadata['ss_serialNumber'];
254 +
255 +~/~/ ~/~/ Result object with encoded downlink payload
256 +
257 +var result = {
258 +
259 + ~/~/ downlink data content type: JSON, TEXT or BINARY (base64 format)
260 +
261 + contentType: "TEXT",
262 +
263 + ~/~/ downlink data
264 +
265 + data: msg.shared_value ,~/~/JSON.stringify(data),
266 +
267 + ~/~/ Optional metadata object presented in key/value format
268 +
269 + metadata: {
270 +
271 + topic: '/test/down/'+metadata.deviceName
272 +
273 + }
274 +
275 +};
276 +
277 +return result;
278 +
279 +== 4.3 Configure the connection ==
280 +
281 +Generate MQTT certificate integrated on chirpstack
282 +
283 +Chirpstack generates CA certificate, TLS certificate, and TLS key respectively
284 +
285 +They correspond to the CA certificate file, Certificate file, and Private key file on thingseye
286 +
287 +[[image:图片4.png]]
288 +
289 +[[image:图片5.png||height="630" width="1269"]]
290 +
291 +* Copy the contents of the certificates and paste them into the linked file below, a total of three certificates are required
292 +
293 +**Integrated Certificate File demo Download Address:**
294 +
295 +[[https:~~/~~/github.com/ThingsEye-io/te-platform/tree/main/chirpstack>>https://github.com/ThingsEye-io/te-platform/tree/main/chirpstack]]
296 +
297 +Enter the server address Host: lns1.thingseye.io on the Connection configuration
298 +
299 +Port: 8883
300 +
301 +Credentials type: PEM
302 +
303 +Upload the certificate and key file
304 +
305 +[[image:图片6.png]]
306 +
307 +[[image:图片7.png]]
308 +
309 +The default for Topic is:
310 +
311 +application/**chirpstack application id**/device/+/event/up
312 +
313 +[[image:图片8.png]]
314 +
315 +
316 +(% class="wikigeneratedid" %)
317 +[[image:屏幕截图 2024-11-25 095805.png||height="374" width="1272"]]
318 +
319 +== 4.4 Check the connection ==
320 +
321 +[[image:图片9.png]]
322 +
323 +[[image:图片10.png]]
324 +
325 += 5. Check Data Uplink Log =
326 +
327 +User can check the devices log in Intergration.
328 +
329 +[[image:1729562069134-315.png||height="587" width="723"]]
1729562069134-315.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.EdwinChen
Size
... ... @@ -1,0 +1,1 @@
1 +67.5 KB
Content
图片1.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +123.1 KB
Content
图片10.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +173.4 KB
Content
图片2.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +163.3 KB
Content
图片3.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +124.8 KB
Content
图片4.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +68.8 KB
Content
图片5.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +98.5 KB
Content
图片6.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +136.5 KB
Content
图片7.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +143.5 KB
Content
图片8.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +151.0 KB
Content
图片9.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +134.6 KB
Content
屏幕截图 2024-11-25 095805.png
Author
... ... @@ -1,0 +1,1 @@
1 +XWiki.hera
Size
... ... @@ -1,0 +1,1 @@
1 +45.7 KB
Content