Hide last authors
Xiaoling 28.2 1 **~ Table of Contents:**
Xiaoling 1.2 2
Xiaoling 1.1 3 {{toc/}}
4
5
6
Xiaoling 28.3 7
8 = 1.  Introduction =
9
10
Xiaoling 1.2 11 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.
Xiaoling 1.1 12
Xiaoling 28.3 13
Xiaoling 6.2 14 [[image:image-20220526150521-2.png]]
Xiaoling 1.1 15
Xiaoling 1.2 16 LBT1 Indoor Positioning Network Structure
Xiaoling 1.1 17
Xiaoling 6.2 18
Xiaoling 28.3 19 = 2.  Prepare Map =
Xiaoling 1.1 20
Xiaoling 28.3 21 == 2.1  Prepare iBeacons ==
22
23
Xiaoling 1.2 24 (((
Xiaoling 1.3 25 (((
Xiaoling 1.2 26 Any BLE iBeacons should work in this solution, each iBeacon stands for a fix position in the map. Here is an iBeacon for example.
27 )))
Xiaoling 1.3 28 )))
Xiaoling 1.1 29
Xiaoling 1.2 30 (((
Xiaoling 1.3 31 (((
Xiaoling 1.2 32 First of all, user needs to accurately place the beacon at each location, which is the reference for positioning.
33 )))
Xiaoling 1.3 34 )))
Xiaoling 1.1 35
Xiaoling 1.2 36 (((
Xiaoling 1.3 37 (((
Xiaoling 1.2 38 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]]
Xiaoling 28.3 39
40
Xiaoling 1.2 41 )))
Xiaoling 1.3 42 )))
Xiaoling 1.1 43
Xiaoling 6.2 44 [[image:image-20220526150651-4.png]]
Xiaoling 1.1 45
Xiaoling 1.2 46 BCN01 iBeacon
Xiaoling 1.1 47
Xiaoling 8.2 48
Xiaoling 28.3 49
Xiaoling 1.2 50 (((
Xiaoling 1.3 51 (((
Xiaoling 1.2 52 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".
53 )))
Xiaoling 1.3 54 )))
Xiaoling 1.1 55
Xiaoling 8.2 56 [[image:image-20220526150743-5.png]]
Xiaoling 1.1 57
Xiaoling 1.2 58 beacon software
59
60
Xiaoling 28.3 61
Xiaoling 8.2 62 [[image:image-20220526150824-6.png]]
Xiaoling 1.2 63
64 beacon software
65
Xiaoling 8.2 66
Xiaoling 28.3 67 == 2.2  Create Map ==
68
69
Xiaoling 1.2 70 (((
Xiaoling 1.3 71 (((
Xiaoling 1.2 72 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.
Xiaoling 28.3 73
74
Xiaoling 1.2 75 )))
Xiaoling 1.3 76 )))
Xiaoling 1.2 77
78 (((
Xiaoling 1.3 79 (((
Xiaoling 28.3 80 **~1. Register an account at [[https:~~/~~/studio.mapwize.io/>>url:https://studio.mapwize.io/]] to create an indoor map.**
Xiaoling 1.2 81 )))
Xiaoling 1.3 82 )))
Xiaoling 1.2 83
84 (((
Xiaoling 1.3 85 (((
Xiaoling 28.3 86 **2. Create Place Types.**
87
88
Xiaoling 1.2 89 )))
Xiaoling 1.3 90 )))
Xiaoling 1.2 91
Xiaoling 9.2 92 [[image:image-20220526150915-7.png]]
Xiaoling 1.2 93
94 Create place types
95
Xiaoling 9.2 96
Xiaoling 1.2 97
Xiaoling 28.3 98 **3. Search Venues. (Indoor map area identification)**
99
100
Xiaoling 11.2 101 [[image:image-20220526151046-8.png]]
Xiaoling 1.2 102
Xiaoling 28.3 103
Xiaoling 1.2 104 (((
Xiaoling 1.4 105 (((
Xiaoling 1.2 106 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.
Xiaoling 11.2 107
Xiaoling 28.3 108
Xiaoling 11.2 109
Xiaoling 1.2 110 )))
Xiaoling 1.4 111 )))
Xiaoling 1.2 112
Xiaoling 28.3 113 **4. Upload Floor plan.**
Xiaoling 1.2 114
Xiaoling 28.3 115
Xiaoling 11.2 116 [[image:image-20220526151223-9.png]]
Xiaoling 1.2 117
118 add images
119
Xiaoling 13.2 120
Xiaoling 1.2 121
Xiaoling 28.3 122 **5. Create Layer**
123
124
Xiaoling 13.2 125 [[image:image-20220526151305-10.png]]
Xiaoling 1.2 126
127 create layer
128
Xiaoling 13.2 129
Xiaoling 1.4 130 (((
Xiaoling 28.3 131 **6. Add iBeacon position info. Drag the iBeacon to match position and input the UUID, MAJOR and MINOR of this iBeacon.**
132
133
Xiaoling 1.4 134 )))
Xiaoling 1.2 135
Xiaoling 13.2 136 [[image:image-20220526151519-11.png]]
Xiaoling 1.2 137
138 create iBeacon
139
Xiaoling 15.2 140
Xiaoling 28.4 141 = 3.  Configure TTN =
Xiaoling 1.2 142
Xiaoling 28.4 143 == 3.1  Configure LBT1 to Upload data to TTN ==
144
145
Xiaoling 2.4 146 Please refer the instruction in the [[User Manual>>url:http://www.dragino.com/downloads/index.php?dir=accessories/Bluetooth/BCN01]]. Note the (% style="color:#4f81bd" %)**LBT1 need to set to MOD=3**(%%) here.
Xiaoling 1.2 147
Xiaoling 15.2 148
Xiaoling 28.4 149 == 3.2  Decoder in TTN ==
150
151
Xiaoling 1.2 152 (% class="box" %)
153 (((
154 function Decoder(bytes, port) {
155 \\~/~/ Decode an uplink message from a buffer
156 \\~/~/ (array) of bytes to an object of fields.
157 \\value = bytes[0] << 8 | bytes[1];
158 \\var batV = value/1000;~/~/Battery,units:V
159 \\var mode = bytes[5];
160 \\~/~/var value=(bytes[3]-0x30)*1000 +(bytes[5]-0x30)*100 + (bytes[5]-0x30)*10 +(bytes[6]-0x30);
161 \\~/~/var value = bytes.slice(3);
162 \\var i;
163 \\var con;
164 \\var str = "";
165 \\var major = 1;
166 \\var minor = 1;
167 \\var rssi = 0;
168 \\var addr = "";
169 \\if(mode ==2 ) {
170 \\ for(i = 38 ; i<50 ; i++) {
171 \\ con = bytes[i].toString();
172 \\ str += String.fromCharCode(con);
173 \\ }
174 \\ addr = str;
175 \\ str = "";
176 \\ for(i = 6 ; i<38 ; i++) {
177 \\ con = bytes[i].toString();
178 \\ str += String.fromCharCode(con);
179 \\ }
180 \\ value = str;
181 \\}
182 \\if(mode == 3 ) {
183 \\ str = "";
184 \\ for(i = 18 ; i < 22 ; i++) {
185 \\ con = bytes[i].toString();
186 \\ str += String.fromCharCode(con);
187 \\ }
188 \\ major = parseInt(str, 16);
189 \\ str = "";
190 \\ for(i = 22 ; i < 26 ; i++) {
191 \\ con = bytes[i].toString();
192 \\ str += String.fromCharCode(con);
193 \\ }
194 \\ minor = parseInt(str, 16);
195 \\ str = "";
196 \\ for(i = 28 ; i < 32 ; i++) {
197 \\ con = bytes[i].toString();
198 \\ str += String.fromCharCode(con);
199 \\ }
200 \\ rssi = parseInt(str);
201 \\ str = "";
202 \\ for(i = 6 ; i < 18 ; i++) {
203 \\ con = bytes[i].toString();
204 \\ str += String.fromCharCode(con);
205 }
206 \\ value = str;
207 }
208 \\if(mode == 1) {
209 \\ for(i = 6 ; i<11 ; i++) {
210 \\ con = bytes[i].toString();
211 \\ str += String.fromCharCode(con);
212 \\ }
213 \\ value = str;
214 }
215 \\var uuid = value;
216 \\var alarm = bytes[2] >> 4 & 0x0F;
217 \\var step_count = (bytes[2] & 0x0F) << 16 | bytes[3] << 8 | bytes[4];
218 \\return {
219 UUID: uuid,
220 ADDR: addr,
221 MAJOR: major,
222 MINOR: minor,
223 RSSI:rssi,
224 STEP: step_count,
225 ALARM: alarm,
226 BatV:batV,
227 };
228 }
229
230 )))
231
Xiaoling 15.2 232
Xiaoling 28.4 233 = 4.  Set Up Converter Server =
234
235
Xiaoling 1.4 236 * (((
Xiaoling 28.5 237 (% style="color:blue" %)**How to install and run this service on Linux?**
Xiaoling 1.4 238 )))
Xiaoling 1.2 239
Xiaoling 1.4 240 (((
Xiaoling 28.11 241 (% style="color:red" %)**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).
Xiaoling 1.4 242 )))
Xiaoling 1.2 243
Xiaoling 1.4 244 (((
Xiaoling 28.11 245 (% style="color:red" %)**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.
Xiaoling 28.5 246
247
Xiaoling 1.4 248 )))
Xiaoling 1.2 249
Xiaoling 1.4 250 (((
Xiaoling 28.5 251 **System:  Debian / Ubuntu**
Xiaoling 1.4 252 )))
Xiaoling 1.2 253
Xiaoling 1.4 254 (% class="box" %)
255 (((
Xiaoling 28.5 256 (% style="color:blue" %)**step:**(%%)
Xiaoling 28.7 257 \\1. **sudo** apt install libcurl4-dev 
258 \\2. **sudo** apt **install  gcc automake autoconf** libtool **make** cmake
Xiaoling 1.8 259 \\3. git clone -b master https:~/~/github.com/mikayong/location.git
260 \\4. cd location/libmqtt
261 \\5. mkdir build
262 \\6. cd build && cmake ../
263 \\7. make && sudo make install 
264 \\8. cd ../
265 \\9. make 
266 \\10. sudo cp location_conf.json  /etc/
267 \\11. Edit the configuration file, and run the location service in the background: ./location &
Xiaoling 1.4 268 )))
Xiaoling 1.2 269
Xiaoling 1.4 270 (((
Xiaoling 28.11 271 (% style="color:red" %)**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
Xiaoling 15.2 272
273
Xiaoling 1.4 274 )))
Xiaoling 1.2 275
Xiaoling 28.6 276 = 5.  Configuration file: location_conf.json =
Xiaoling 1.2 277
Xiaoling 28.6 278
Xiaoling 1.9 279 * (((
Xiaoling 28.8 280 (% style="color:blue" %)**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.**
Xiaoling 28.7 281
282
Xiaoling 1.9 283 )))
Xiaoling 1.2 284
Xiaoling 1.9 285 (((
Xiaoling 1.2 286 { "location_conf": {
Xiaoling 1.9 287 )))
Xiaoling 1.2 288
Xiaoling 1.5 289 (% class="box" %)
290 (((
Xiaoling 1.9 291 (((
Xiaoling 1.5 292 "loctype": "indoor",       ~/~/ indoor/outdoor
293 "locmap": "mapwize"    ~/~/   Map interface: mapwize, traccar
294 )))
Xiaoling 1.9 295 )))
Xiaoling 1.2 296
Xiaoling 1.9 297 (((
Xiaoling 1.2 298 }, "mqtt_conf": {
Xiaoling 1.9 299 )))
Xiaoling 1.2 300
Xiaoling 1.5 301 (% class="box" %)
302 (((
Xiaoling 1.9 303 (((
Xiaoling 1.5 304 "servaddr": "[str]",    ~/~/     Lorawan server address: Refer to TTN app handler:eu.thethings.network
305 "servport": [int],       ~/~/   Lorawan server port: 1883
Xiaoling 1.9 306 "clientid": "[str]",       ~/~/   MQTT client identity: Custom
307 "qos":[int],                 ~/~/  (Optional) MQTT service quality: 0
308 "username":"[str]",     ~/~/   Agent name of mqtt: application ID of TTN
Xiaoling 1.5 309 "password":"[str]",      ~/~/  The proxy password of mqtt: application access key of TTN
Xiaoling 1.10 310 "topic":"[str]",              ~/~/ The topic of mqtt subscription: TTN is + / devices / + / up
Xiaoling 1.5 311 "connection":"[str]" },   ~/~/(Optional) mqtt is a string used for direct connection, composed of serveraddr and port
Xiaoling 1.9 312 "mapwize_conf":{          ~/~/Map settings
Xiaoling 1.5 313 "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
314 "venueid":"[str]",        ~/~/ (Optional)Indoor map area identification
315 "orgid":"[str]",           ~/~/  The identity of the user organizer
316 "universesid":"[str]",   ~/~/The range indicator of the indoor map, find it on the universes page
317 "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
Xiaoling 1.2 318 },
319 "loracloud":{
Xiaoling 1.5 320 "token":  "[str]"          ~/~/The password string of loracloud location service, the outdoor map must fill in the account token of loracloud
321 )))
Xiaoling 1.9 322 )))
Xiaoling 1.2 323
Xiaoling 1.9 324 (((
Xiaoling 1.2 325 }
Xiaoling 1.9 326 )))
Xiaoling 1.2 327
Xiaoling 1.5 328 (% class="box" %)
329 (((
Xiaoling 1.9 330 (((
Xiaoling 1.5 331 "rssi_conf": {
332 "rssirate": [int],          ~/~/ (Optional) A basis for rssi calculation distance, the rssi value (absolute value) when the beacon is 1 meter apart 
333 "rssidiv": [float] }        ~/~/ (Optional) rssi measures an attenuation value of distance. As the distance to the beacon is farther, the value changes speed
334 )))
Xiaoling 1.9 335 )))
Xiaoling 1.2 336
Xiaoling 1.9 337 (((
Xiaoling 1.2 338 }
Xiaoling 28.8 339
340
341
Xiaoling 1.9 342 )))
Xiaoling 1.2 343
Xiaoling 28.8 344 * (% style="color:blue" %)**Parameter acquisition method of configuration file:**
Xiaoling 1.2 345
Xiaoling 28.8 346
Xiaoling 1.6 347 (% class="box" %)
348 (((
Xiaoling 28.9 349 **"username":"[str]" **
Xiaoling 1.6 350 )))
Xiaoling 1.2 351
Xiaoling 28.7 352
Xiaoling 15.2 353 [[image:image-20220526151707-12.png]]
Xiaoling 1.2 354
355 username
356
Xiaoling 15.2 357
Xiaoling 28.7 358
Xiaoling 1.6 359 (% class="box" %)
360 (((
Xiaoling 28.9 361 **"password":"[str]" **
Xiaoling 1.6 362 )))
Xiaoling 1.2 363
Xiaoling 15.2 364 [[image:image-20220526151736-13.png]]
Xiaoling 1.2 365
366 password
367
Xiaoling 15.2 368
Xiaoling 28.7 369
Xiaoling 1.6 370 (% class="box" %)
371 (((
Xiaoling 28.9 372 **"apikey": "[str]" **
Xiaoling 1.6 373 )))
Xiaoling 1.2 374
Xiaoling 19.2 375 [[image:image-20220526151819-14.png||height="588" width="1203"]]
Xiaoling 1.2 376
377 apikey
378
Xiaoling 28.7 379
380
Xiaoling 1.6 381 (% class="box" %)
382 (((
Xiaoling 28.9 383 **"orgid":"[str]"**
Xiaoling 1.6 384 )))
Xiaoling 1.2 385
Xiaoling 19.2 386 [[image:image-20220526152014-15.png]]
Xiaoling 1.2 387
388 orgid
389
Xiaoling 19.2 390
Xiaoling 28.7 391
Xiaoling 1.6 392 (% class="box" %)
393 (((
Xiaoling 28.9 394 **"universesid":"[str]"**
Xiaoling 1.6 395 )))
Xiaoling 1.2 396
Xiaoling 19.2 397 [[image:image-20220526152115-16.png]]
Xiaoling 1.2 398
399 universesid
400
Xiaoling 19.2 401
Xiaoling 28.7 402
Xiaoling 1.6 403 (% class="box" %)
404 (((
Xiaoling 28.9 405 **"placetype": "[str]"**
Xiaoling 1.6 406 )))
Xiaoling 1.2 407
Xiaoling 19.2 408 [[image:image-20220526152150-17.png]]
Xiaoling 1.2 409
410 placetype
411
412
413
Xiaoling 28.7 414 (% style="color:blue" %)**Here are two ways to enter the server:**
Xiaoling 1.6 415
Xiaoling 28.7 416 (% style="color:red" %)**1. WinSCP**
417
Xiaoling 20.2 418 [[image:image-20220526152303-18.png]]
Xiaoling 1.2 419
420
Xiaoling 24.2 421 [[image:image-20220526152355-19.png]]
Xiaoling 20.3 422
Xiaoling 1.2 423
Xiaoling 24.2 424 [[image:image-20220526152912-20.png]]
425
Xiaoling 1.2 426 way1
427
Xiaoling 24.2 428
Xiaoling 1.2 429
Xiaoling 28.7 430 (% style="color:red" %)**2. secureCRT**
431
Xiaoling 24.2 432 [[image:image-20220526153145-22.png]]
Xiaoling 1.2 433
Xiaoling 26.2 434 [[image:image-20220526153236-23.png]]
Xiaoling 1.2 435
Xiaoling 26.2 436 [[image:image-20220526153304-24.png]]
Xiaoling 1.2 437
438 way2
439
Xiaoling 27.2 440
Xiaoling 28.7 441 = 6.  Test Result =
442
443
Xiaoling 1.2 444 The real-time position on the map is obtained according to the moving change of LBT1.
445
Xiaoling 28.7 446
Xiaoling 27.2 447 [[image:image-20220526153424-25.png||height="693" width="1414"]]
Copyright ©2010-2022 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0