Changes for page Connect Devices to ThingsEye
Last modified by Hera Guo on 2025/02/18 09:29
Summary
-
Page properties (2 modified, 0 added, 0 removed)
-
Attachments (0 modified, 12 added, 0 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki. EdwinChen1 +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,1156 0**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