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