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, 0 added, 1 removed)
Details
- Page properties
-
- Author
-
... ... @@ -1,1 +1,1 @@ 1 -XWiki.he ra1 +XWiki.EdwinChen - 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 2**47 +* Set to use ThingsEye UDP server: **AT+SERVADDR=server1.thingseye.io,11560** 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 ... ... @@ -95,17 +95,107 @@ 95 95 96 96 [[image:1728535941851-388.png||height="466" width="398"]] 97 97 98 -Demo JavaScriptCode:[[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]]98 +Demo Code as below: 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 +>} 100 100 131 + 101 101 (% class="lead" %) 102 102 Input Downlink Converter 103 103 104 104 [[image:1728536142721-488.png||height="470" width="407"]] 105 105 106 -Example JavascriptCode 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]]137 +Example Code as below: 107 107 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 +>} 108 108 198 + 109 109 (% class="lead" %) 110 110 Set up Connection to The Things Network application 111 111 ... ... @@ -131,200 +131,3 @@ 131 131 132 132 133 133 [[image:1728536541040-814.png]] 134 - 135 -= 4.Connect chirpstack to Thingseye by way of MQTT = 136 - 137 -* **How to connect chirpstack to Thingseye by way of MQTT? The following tutorial will show you** 138 - 139 -== 4.1 Thingseye adds MQTT integration == 140 - 141 -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"; 142 - 143 -[[image:图片1.png||height="655" width="1320"]] 144 - 145 -== 4.2 Add an uplink and downlink data converter == 146 - 147 -In the function decoder field, specify the script to parse and transform the data. 148 - 149 -[[image:图片2.png||height="653" width="1315"]] 150 - 151 -* **Uplink——JavaScript:** 152 - 153 -var data = decodeToJson(payload); 154 - 155 -var deviceName = data.deviceInfo.deviceName; 156 - 157 -var deviceType = data.applicationName; 158 - 159 -var devEui = data.deviceInfo.devEui 160 - 161 -var label = data.deviceInfo.devEui 162 - 163 -var model = {}; 164 - 165 -var data2 = data.object; 166 - 167 -var flg = data.fPort 168 - 169 -for (var key in data2) { 170 - 171 - ~/~/ 将属性名存入新对象中 172 - 173 - model[key] = data2[key]; 174 - 175 -} 176 - 177 -~/~/var obj = {"devid":deviceName} 178 - 179 -var result = { 180 - 181 - deviceName: deviceName, 182 - 183 - deviceType: deviceType, 184 - 185 - telemetry: model, 186 - 187 - groupName: "Case Study", 188 - 189 - ~/~/label:label, 190 - 191 - attributes:{"devEui":devEui, 192 - 193 - ~/~/"timevalue":"test", 194 - 195 - "inactivityTimeout":1260000 196 - 197 - ~/~/ "High_humidity_alarm":"not set", 198 - 199 - ~/~/ "High_temperature_alarm":"not set", 200 - 201 - ~/~/ "Low_humidity_alarm":"not set", 202 - 203 - ~/~/ "Low_temperature_alarm":"not set", 204 - 205 - ~/~/ "Low_voltage_alarm":"not set" 206 - 207 - ~/~/"customerName": "Civionic Engineering & Consulting (2014) Inc." 208 - 209 - } 210 - 211 -}; 212 - 213 -function decodeToString(payload) { 214 - 215 - return String.fromCharCode.apply(String, payload); 216 - 217 -} 218 - 219 -function decodeToJson(payload) { 220 - 221 - var str = decodeToString(payload); 222 - 223 - var data = JSON.parse(str); 224 - 225 - return data; 226 - 227 -} 228 - 229 -return result; 230 - 231 -[[image:图片3.png||height="657" width="1324"]] 232 - 233 -* **Dowblink——JavaScript:** 234 - 235 -~/~/ Encode downlink data from incoming Rule Engine message 236 - 237 -~/~/ msg - JSON message payload downlink message json 238 - 239 -~/~/ msgType - type of message, for ex. 'ATTRIBUTES_UPDATED', 'POST_TELEMETRY_REQUEST', etc. 240 - 241 -~/~/ metadata - list of key-value pairs with additional data about the message 242 - 243 -~/~/ integrationMetadata - list of key-value pairs with additional data defined in Integration executing this converter 244 - 245 -~/~/ /~*~* Encoder ~*~*/ 246 - 247 -~/~/var data = {"value":99}; 248 - 249 -~/~/ ~/~/ Process data from incoming message and metadata 250 - 251 -~/~/ data.tempFreq = msg.temperatureUploadFrequency; 252 - 253 -~/~/ data.humFreq = msg.humidityUploadFrequency; 254 - 255 -~/~/ data.devSerialNumber = metadata['ss_serialNumber']; 256 - 257 -~/~/ ~/~/ Result object with encoded downlink payload 258 - 259 -var result = { 260 - 261 - ~/~/ downlink data content type: JSON, TEXT or BINARY (base64 format) 262 - 263 - contentType: "TEXT", 264 - 265 - ~/~/ downlink data 266 - 267 - data: msg.shared_value ,~/~/JSON.stringify(data), 268 - 269 - ~/~/ Optional metadata object presented in key/value format 270 - 271 - metadata: { 272 - 273 - topic: '/test/down/'+metadata.deviceName 274 - 275 - } 276 - 277 -}; 278 - 279 -return result; 280 - 281 -== 4.3 Configure the connection == 282 - 283 -Generate MQTT certificate integrated on chirpstack 284 - 285 -Chirpstack generates CA certificate, TLS certificate, and TLS key respectively 286 - 287 -They correspond to the CA certificate file, Certificate file, and Private key file on thingseye 288 - 289 -[[image:图片4.png||height="669" width="1348"]] 290 - 291 -[[image:图片5.png||height="669" width="1348"]] 292 - 293 -* Copy the contents of the certificates and paste them into the linked file below, a total of three certificates are required 294 - 295 -**Integrated Certificate File demo Download Address:** 296 - 297 -[[https:~~/~~/github.com/ThingsEye-io/te-platform/tree/main/chirpstack>>https://github.com/ThingsEye-io/te-platform/tree/main/chirpstack]] 298 - 299 -Enter the server address Host: lns1.thingseye.io on the Connection configuration 300 - 301 -Port: 8883 302 - 303 -Credentials type: PEM 304 - 305 -Upload the certificate and key file 306 - 307 -[[image:图片6.png||height="672" width="1353"]] 308 - 309 -[[image:图片7.png||height="671" width="1352"]] 310 - 311 -The default for Topic is: 312 - 313 -application/**chirpstack application id**/device/+/event/up 314 - 315 -[[image:图片8.png||height="673" width="1356"]] 316 - 317 -[[image:1732500689044-955.png]] 318 - 319 -== 4.4 Check the connection == 320 - 321 -[[image:图片9.png||height="718" width="1446"]] 322 - 323 -[[image:图片10.png||height="711" width="1432"]] 324 - 325 - 326 -= 5. Check Data Uplink Log = 327 - 328 -User can check the devices log in Intergration. 329 - 330 -[[image:1729562069134-315.png||height="587" width="723"]]
- 1729562069134-315.png
-
- Author
-
... ... @@ -1,1 +1,0 @@ 1 -XWiki.EdwinChen - Size
-
... ... @@ -1,1 +1,0 @@ 1 -67.5 KB - Content