Change comment:
There is no comment for this version
Summary
-
Page properties (1 modified, 0 added, 0 removed)
Details
- Page properties
-
- Content
-
... ... @@ -1,32 +1,357 @@ 1 -{{box cssClass="floatinginfobox" title="**Contents**"}} 1 +**Contents:** 2 + 2 2 {{toc/}} 3 -{{/box}} 4 4 5 -= Paragraph 1 = 6 6 7 - Loremipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit essecillum dolore eu fugiatnulla pariatur. Excepteur sintoccaecat cupidatatnonproident, sunt in culpa qui officia deserunt mollit anim id est laborum.6 += 1. Introduction = 8 8 9 - ==Sub-paragraph==8 +This article shows how to use [[LBT1>>url:http://www.dragino.com/products/lora-lorawan-end-node/item/165-lbt1.html]] to build an Indoor Positioning Solution. 10 10 11 - Loremipsumdolor sitamet, consectetur adipiscing elit, seddo eiusmod temporincididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi utaliquipex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillumdolore eu fugiat nullaariatur. Excepteur sint occaecat cupidatat nonproident, sunt in culpa qui officia deserunt mollitanim idestlaborum.10 +[[image:https://wiki.dragino.com/images/thumb/1/1a/LBT1_Mapwize_1.png/600px-LBT1_Mapwize_1.png||height="511" width="600"]] 12 12 13 - ==Sub-paragraph==12 +LBT1 Indoor Positioning Network Structure 14 14 15 - Loremipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.Ut enim ad minim veniam, quis nostrudexercitation ullamco laboris nisi ut aliquipex eacommodo consequat. Duis aute iruredolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur.Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.14 += 2. Prepare Map = 16 16 17 -== =Sub-subparagraph===16 +== 2.1 Prepare iBeacons == 18 18 19 -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 18 +((( 19 +((( 20 +Any BLE iBeacons should work in this solution, each iBeacon stands for a fix position in the map. Here is an iBeacon for example. 21 +))) 22 +))) 20 20 24 +((( 25 +((( 26 +First of all, user needs to accurately place the beacon at each location, which is the reference for positioning. 27 +))) 28 +))) 21 21 22 -= Paragraph 2 = 30 +((( 31 +((( 32 +BCN01 iBeacon from Dragino: [[http:~~/~~/www.dragino.com/products/accessories/item/166-bcn01.html>>url:http://www.dragino.com/products/accessories/item/166-bcn01.html]] 33 +))) 34 +))) 23 23 24 - Loremipsumdolor sitamet, consectetur adipiscing elit, seddo eiusmod temporididunt ut labore et doloremagna aliqua. Ut enimd minim veniam, quisnostrud exercitation ullamco laboris nisi ut aliquipex eammodo consequat.Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nullapariatur. Excepteur sint occaecat cupidatat nonroident, sunt in culpa qui officia deserunt mollitanim idestlaborum.36 +[[image:https://wiki.dragino.com/images/thumb/8/88/Ibeacon1.png/300px-Ibeacon1.png||height="169" width="300"]] 25 25 26 - ==Sub-paragraph ==38 +BCN01 iBeacon 27 27 28 -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 40 +((( 41 +((( 42 +We need to get the UUID, MAJOR, MINOR, TXPOWER where each iBeacon is placed. We can get it with the iBeacon software, such as "EW-beacon". 43 +))) 44 +))) 29 29 30 - == Sub-paragraph ==46 +[[image:https://wiki.dragino.com/images/thumb/f/fa/Ibeacon2.jpg/400px-Ibeacon2.jpg||height="867" width="400"]] 31 31 32 -Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. 48 +beacon software 49 + 50 + 51 +[[image:https://wiki.dragino.com/images/thumb/f/f2/Ibeacon3.jpg/400px-Ibeacon3.jpg||height="867" width="400"]] 52 + 53 +beacon software 54 + 55 +== 2.2 Create Map == 56 + 57 +((( 58 +((( 59 +Here we use the indoor map at [[https:~~/~~/studio.mapwize.io/>>url:https://studio.mapwize.io/]]. Below shows the steps for create a map and put the iBeacon on a fix position. 60 +))) 61 +))) 62 + 63 +((( 64 +((( 65 +~1. Register an account at [[https:~~/~~/studio.mapwize.io/>>url:https://studio.mapwize.io/]] to create an indoor map. 66 +))) 67 +))) 68 + 69 +((( 70 +((( 71 +2. Create Place Types. 72 +))) 73 +))) 74 + 75 +[[image:https://wiki.dragino.com/images/thumb/4/4d/Beacon10.png/600px-Beacon10.png||height="274" width="600"]] 76 + 77 +Create place types 78 + 79 +3. Search Venues. (Indoor map area identification) 80 + 81 +[[image:https://wiki.dragino.com/images/thumb/e/e8/Beacon11.jpg/600px-Beacon11.jpg||alt="Beacon11.jpg" height="324" width="600"]] 82 + 83 +((( 84 +((( 85 +The map accurately places the beacon of ibeacon, which is the reference for positioning. At this time, UUID, MAJOR and MINOR must be filled in correctly. 86 +))) 87 +))) 88 + 89 +4. Upload Floor plan. 90 + 91 +[[image:https://wiki.dragino.com/images/thumb/d/d1/Beacon12.png/600px-Beacon12.png||height="197" width="600"]] 92 + 93 +add images 94 + 95 +5. Create Layer 96 + 97 +[[image:https://wiki.dragino.com/images/thumb/0/0e/Beacon13.png/600px-Beacon13.png||height="208" width="600"]] 98 + 99 +create layer 100 + 101 +((( 102 +6. Add iBeacon position info. Drag the iBeacon to match position and input the UUID, MAJOR and MINOR of this iBeacon. 103 +))) 104 + 105 +[[image:https://wiki.dragino.com/images/thumb/1/1d/Beacon14.png/600px-Beacon14.png||height="261" width="600"]] 106 + 107 +create iBeacon 108 + 109 += 3. Configure TTN = 110 + 111 +== 3.1 Configure LBT1 to Upload data to TTN == 112 + 113 +Please refer the instruction in the [[User Manual>>url:http://www.dragino.com/downloads/index.php?dir=accessories/Bluetooth/BCN01]]. Note the LBT1 need to set to MOD=3 here. 114 + 115 +== 3.2 Decoder in TTN == 116 + 117 +(% class="box" %) 118 +((( 119 +function Decoder(bytes, port) { 120 +\\~/~/ Decode an uplink message from a buffer 121 +\\~/~/ (array) of bytes to an object of fields. 122 +\\value = bytes[0] << 8 | bytes[1]; 123 +\\var batV = value/1000;~/~/Battery,units:V 124 +\\var mode = bytes[5]; 125 +\\~/~/var value=(bytes[3]-0x30)*1000 +(bytes[5]-0x30)*100 + (bytes[5]-0x30)*10 +(bytes[6]-0x30); 126 +\\~/~/var value = bytes.slice(3); 127 +\\var i; 128 +\\var con; 129 +\\var str = ""; 130 +\\var major = 1; 131 +\\var minor = 1; 132 +\\var rssi = 0; 133 +\\var addr = ""; 134 +\\if(mode ==2 ) { 135 +\\ for(i = 38 ; i<50 ; i++) { 136 +\\ con = bytes[i].toString(); 137 +\\ str += String.fromCharCode(con); 138 +\\ } 139 +\\ addr = str; 140 +\\ str = ""; 141 +\\ for(i = 6 ; i<38 ; i++) { 142 +\\ con = bytes[i].toString(); 143 +\\ str += String.fromCharCode(con); 144 +\\ } 145 +\\ value = str; 146 +\\} 147 +\\if(mode == 3 ) { 148 +\\ str = ""; 149 +\\ for(i = 18 ; i < 22 ; i++) { 150 +\\ con = bytes[i].toString(); 151 +\\ str += String.fromCharCode(con); 152 +\\ } 153 +\\ major = parseInt(str, 16); 154 +\\ str = ""; 155 +\\ for(i = 22 ; i < 26 ; i++) { 156 +\\ con = bytes[i].toString(); 157 +\\ str += String.fromCharCode(con); 158 +\\ } 159 +\\ minor = parseInt(str, 16); 160 +\\ str = ""; 161 +\\ for(i = 28 ; i < 32 ; i++) { 162 +\\ con = bytes[i].toString(); 163 +\\ str += String.fromCharCode(con); 164 +\\ } 165 +\\ rssi = parseInt(str); 166 +\\ str = ""; 167 +\\ for(i = 6 ; i < 18 ; i++) { 168 +\\ con = bytes[i].toString(); 169 +\\ str += String.fromCharCode(con); 170 + } 171 +\\ value = str; 172 +} 173 +\\if(mode == 1) { 174 +\\ for(i = 6 ; i<11 ; i++) { 175 +\\ con = bytes[i].toString(); 176 +\\ str += String.fromCharCode(con); 177 +\\ } 178 +\\ value = str; 179 +} 180 +\\var uuid = value; 181 +\\var alarm = bytes[2] >> 4 & 0x0F; 182 +\\var step_count = (bytes[2] & 0x0F) << 16 | bytes[3] << 8 | bytes[4]; 183 +\\return { 184 + UUID: uuid, 185 + ADDR: addr, 186 + MAJOR: major, 187 + MINOR: minor, 188 + RSSI:rssi, 189 + STEP: step_count, 190 + ALARM: alarm, 191 + BatV:batV, 192 +}; 193 +} 194 + 195 +))) 196 + 197 += 4. Set Up Converter Server = 198 + 199 +* ((( 200 +How to install and run this service on Linux? 201 +))) 202 + 203 +((( 204 +Step1.Rent a Linux on Amazon cloud or alicloud to the host, and pre install the Linux system (Debian, Ubuntu, CentOS are available for distribution). 205 +))) 206 + 207 +((( 208 +Step2.Run the code on the server after compiling. Compilation requires the support of libcurl. First, compile libmqtt in the code, and then compile location. 209 +))) 210 + 211 +((( 212 + 213 +System: Debian / Ubuntu 214 +))) 215 + 216 +(% class="box" %) 217 +((( 218 +step: 219 + 220 +~1. sudo apt install libcurl4-dev 221 + 222 +2. sudo apt install gcc automake autoconf libtool make cmake 223 + 224 +3. git clone -b master https:~/~/github.com/mikayong/location.git 225 + 226 +4. cd location/libmqtt 227 + 228 +5. mkdir build 229 + 230 +6. cd build && cmake ../ 231 + 232 +7. make && sudo make install 233 + 234 +8. cd ../ 235 + 236 +9. make 237 + 238 +10. sudo cp location_conf.json /etc/ 239 + 240 +~11. Edit the configuration file, and run the location service in the background: ./location & 241 +))) 242 + 243 +((( 244 +Step3.The location service subscribes to the lora information stream on TTN through the mqtt protocol, parses the information to generate a geographic location, and finally creates a geographic location on the mapwize map. The following is the configuration of the location service, the configuration file is in json format, the file is /etc/location_conf.json 245 +))) 246 + 247 += 5. Configuration file: location_conf.json = 248 + 249 +* We use the 120.78.138.177 server as an example. The location service is currently installed on the 120.78.138.177 server, the code is in /root/location, and the configuration file for running location pre-read directly is /etc/location_conf.json. 250 + 251 +{ "location_conf": { 252 + 253 +{{{ "loctype": "indoor", // indoor/outdoor 254 + "locmap": "mapwize" // Map interface: mapwize, traccar 255 +}}} 256 + 257 +}, "mqtt_conf": { 258 + 259 +{{{ "servaddr": "[str]", // Lorawan server address: Refer to TTN app handler:eu.thethings.network 260 + "servport": [int], // Lorawan server port: 1883 261 + "clientid": "[str]", // MQTT client identity: Custom 262 + "qos":[int], // (Optional) MQTT service quality: 0 263 + "username":"[str]", // Agent name of mqtt: application ID of TTN 264 + "password":"[str]", // The proxy password of mqtt: application access key of TTN 265 + "topic":"[str]", // The topic of mqtt subscription: TTN is + / devices / + / up 266 + "connection":"[str]" }, //(Optional) mqtt is a string used for direct connection, composed of serveraddr and port 267 +"mapwize_conf":{ //Map settings 268 + "apikey": "[str]", // The apikey of the map user can be found on the Api keys page of wapwize, and read and write permissions need to be set 269 + "venueid":"[str]", // (Optional)Indoor map area identification 270 + "orgid":"[str]", // The identity of the user organizer 271 + "universesid":"[str]", //The range indicator of the indoor map, find it on the universes page 272 + "placetype": "[str]" //The type of place used to identify the creation must be created on the placetypes page in the map, where the placetype name is filled in 273 + }, 274 +"loracloud":{ 275 + "token": "[str]" //The password string of loracloud location service, the outdoor map must fill in the account token of loracloud 276 +}}} 277 + 278 +} 279 + 280 +{{{"rssi_conf": { 281 + "rssirate": [int], // (Optional) A basis for rssi calculation distance, the rssi value (absolute value) when the beacon is 1 meter apart 282 + "rssidiv": [float] } // (Optional) rssi measures an attenuation value of distance. As the distance to the beacon is farther, the value changes speed 283 +}}} 284 + 285 +} 286 + 287 +* Parameter acquisition method of configuration file: 288 + 289 +{{{"username":"[str]" 290 +}}} 291 + 292 +[[image:https://wiki.dragino.com/images/thumb/d/da/Beacon50.png/600px-Beacon50.png||height="185" width="600"]] 293 + 294 +username 295 + 296 +{{{"password":"[str]" 297 +}}} 298 + 299 +[[image:https://wiki.dragino.com/images/thumb/b/bd/Beacon51.png/600px-Beacon51.png||height="260" width="600"]] 300 + 301 +password 302 + 303 +{{{"apikey": "[str]" 304 +}}} 305 + 306 +[[image:https://wiki.dragino.com/images/thumb/5/53/Qwe3.png/600px-Qwe3.png||height="321" width="600"]] 307 + 308 +apikey 309 + 310 +{{{"orgid":"[str]" 311 +}}} 312 + 313 +[[image:https://wiki.dragino.com/images/thumb/f/f4/Qwe4.png/600px-Qwe4.png||height="293" width="600"]] 314 + 315 +orgid 316 + 317 +{{{"universesid":"[str]" 318 +}}} 319 + 320 +[[image:https://wiki.dragino.com/images/thumb/9/9a/Qwe5.jpg/600px-Qwe5.jpg||height="424" width="600"]] 321 + 322 +universesid 323 + 324 +{{{"placetype": "[str]" 325 +}}} 326 + 327 +[[image:https://wiki.dragino.com/images/thumb/9/93/Qwe6.png/600px-Qwe6.png||height="318" width="600"]] 328 + 329 +placetype 330 + 331 + 332 +* Here are two ways to enter the server 333 +* WinSCP 334 + 335 +[[image:https://wiki.dragino.com/images/thumb/6/6b/Ibeacon4.jpg/600px-Ibeacon4.jpg||height="385" width="600"]] 336 + 337 +[[image:https://wiki.dragino.com/images/thumb/7/78/Ibeacon5.jpg/600px-Ibeacon5.jpg||height="385" width="600"]] 338 + 339 +[[image:https://wiki.dragino.com/images/thumb/c/cd/Ibeacon6.jpg/600px-Ibeacon6.jpg||height="363" width="600"]] 340 + 341 +way1 342 + 343 +* secureCRT 344 + 345 +[[image:https://wiki.dragino.com/images/thumb/7/7b/Ibeacon7.jpg/600px-Ibeacon7.jpg||height="326" width="600"]] 346 + 347 +[[image:https://wiki.dragino.com/images/thumb/6/64/Ibeacon8.jpg/600px-Ibeacon8.jpg||height="326" width="600"]] 348 + 349 +[[image:https://wiki.dragino.com/images/thumb/d/de/Ibeacon9.jpg/600px-Ibeacon9.jpg||height="326" width="600"]] 350 + 351 +way2 352 + 353 += 6. Test Result = 354 + 355 +The real-time position on the map is obtained according to the moving change of LBT1. 356 + 357 +[[image:https://wiki.dragino.com/images/thumb/7/70/Beacon15.png/600px-Beacon15.png||alt="Beacon15.png" height="294" width="600"]]