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
85 [[image:https://wiki.dragino.com/images/thumb/e/e8/Beacon11.jpg/600px-Beacon11.jpg||alt="Beacon11.jpg" height="324" width="600"]]
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.
90 )))
Xiaoling 1.4 91 )))
Xiaoling 1.2 92
93 4. Upload Floor plan.
94
Xiaoling 1.8 95 [[image:https://wiki.dragino.com/images/thumb/d/d1/Beacon12.png/800px-Beacon12.png||alt="File:Beacon12.png" height="196" width="598"]]
Xiaoling 1.2 96
97 add images
98
99 5. Create Layer
100
101 [[image:https://wiki.dragino.com/images/thumb/0/0e/Beacon13.png/600px-Beacon13.png||height="208" width="600"]]
102
103 create layer
104
Xiaoling 1.4 105 (((
Xiaoling 1.2 106 6. Add iBeacon position info. Drag the iBeacon to match position and input the UUID, MAJOR and MINOR of this iBeacon.
Xiaoling 1.4 107 )))
Xiaoling 1.2 108
109 [[image:https://wiki.dragino.com/images/thumb/1/1d/Beacon14.png/600px-Beacon14.png||height="261" width="600"]]
110
111 create iBeacon
112
113 = 3. Configure TTN =
114
115 == 3.1 Configure LBT1 to Upload data to TTN ==
116
Xiaoling 2.4 117 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 118
119 == 3.2 Decoder in TTN ==
120
121 (% class="box" %)
122 (((
123 function Decoder(bytes, port) {
124 \\~/~/ Decode an uplink message from a buffer
125 \\~/~/ (array) of bytes to an object of fields.
126 \\value = bytes[0] << 8 | bytes[1];
127 \\var batV = value/1000;~/~/Battery,units:V
128 \\var mode = bytes[5];
129 \\~/~/var value=(bytes[3]-0x30)*1000 +(bytes[5]-0x30)*100 + (bytes[5]-0x30)*10 +(bytes[6]-0x30);
130 \\~/~/var value = bytes.slice(3);
131 \\var i;
132 \\var con;
133 \\var str = "";
134 \\var major = 1;
135 \\var minor = 1;
136 \\var rssi = 0;
137 \\var addr = "";
138 \\if(mode ==2 ) {
139 \\ for(i = 38 ; i<50 ; i++) {
140 \\ con = bytes[i].toString();
141 \\ str += String.fromCharCode(con);
142 \\ }
143 \\ addr = str;
144 \\ str = "";
145 \\ for(i = 6 ; i<38 ; i++) {
146 \\ con = bytes[i].toString();
147 \\ str += String.fromCharCode(con);
148 \\ }
149 \\ value = str;
150 \\}
151 \\if(mode == 3 ) {
152 \\ str = "";
153 \\ for(i = 18 ; i < 22 ; i++) {
154 \\ con = bytes[i].toString();
155 \\ str += String.fromCharCode(con);
156 \\ }
157 \\ major = parseInt(str, 16);
158 \\ str = "";
159 \\ for(i = 22 ; i < 26 ; i++) {
160 \\ con = bytes[i].toString();
161 \\ str += String.fromCharCode(con);
162 \\ }
163 \\ minor = parseInt(str, 16);
164 \\ str = "";
165 \\ for(i = 28 ; i < 32 ; i++) {
166 \\ con = bytes[i].toString();
167 \\ str += String.fromCharCode(con);
168 \\ }
169 \\ rssi = parseInt(str);
170 \\ str = "";
171 \\ for(i = 6 ; i < 18 ; i++) {
172 \\ con = bytes[i].toString();
173 \\ str += String.fromCharCode(con);
174 }
175 \\ value = str;
176 }
177 \\if(mode == 1) {
178 \\ for(i = 6 ; i<11 ; i++) {
179 \\ con = bytes[i].toString();
180 \\ str += String.fromCharCode(con);
181 \\ }
182 \\ value = str;
183 }
184 \\var uuid = value;
185 \\var alarm = bytes[2] >> 4 & 0x0F;
186 \\var step_count = (bytes[2] & 0x0F) << 16 | bytes[3] << 8 | bytes[4];
187 \\return {
188 UUID: uuid,
189 ADDR: addr,
190 MAJOR: major,
191 MINOR: minor,
192 RSSI:rssi,
193 STEP: step_count,
194 ALARM: alarm,
195 BatV:batV,
196 };
197 }
198
199 )))
200
201 = 4. Set Up Converter Server =
202
Xiaoling 1.4 203 * (((
204 How to install and run this service on Linux?
205 )))
Xiaoling 1.2 206
Xiaoling 1.4 207 (((
Xiaoling 1.2 208 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 209 )))
Xiaoling 1.2 210
Xiaoling 1.4 211 (((
Xiaoling 1.2 212 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 213 )))
Xiaoling 1.2 214
Xiaoling 1.4 215 (((
Xiaoling 1.2 216 System: Debian / Ubuntu
Xiaoling 1.4 217 )))
Xiaoling 1.2 218
Xiaoling 1.4 219 (% class="box" %)
220 (((
221 step:
Xiaoling 1.8 222 \\1. sudo apt install libcurl4-dev 
223 \\2. sudo apt install  gcc automake autoconf libtool make cmake
224 \\3. git clone -b master https:~/~/github.com/mikayong/location.git
225 \\4. cd location/libmqtt
226 \\5. mkdir build
227 \\6. cd build && cmake ../
228 \\7. make && sudo make install 
229 \\8. cd ../
230 \\9. make 
231 \\10. sudo cp location_conf.json  /etc/
232 \\11. Edit the configuration file, and run the location service in the background: ./location &
Xiaoling 1.4 233 )))
Xiaoling 1.2 234
Xiaoling 1.4 235 (((
Xiaoling 1.2 236 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 1.4 237 )))
Xiaoling 1.2 238
239 = 5. Configuration file: location_conf.json =
240
Xiaoling 1.9 241 * (((
242 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.
243 )))
Xiaoling 1.2 244
Xiaoling 1.9 245 (((
Xiaoling 1.2 246 { "location_conf": {
Xiaoling 1.9 247 )))
Xiaoling 1.2 248
Xiaoling 1.5 249 (% class="box" %)
250 (((
Xiaoling 1.9 251 (((
Xiaoling 1.5 252 "loctype": "indoor",       ~/~/ indoor/outdoor
253 "locmap": "mapwize"    ~/~/   Map interface: mapwize, traccar
254 )))
Xiaoling 1.9 255 )))
Xiaoling 1.2 256
Xiaoling 1.9 257 (((
Xiaoling 1.2 258 }, "mqtt_conf": {
Xiaoling 1.9 259 )))
Xiaoling 1.2 260
Xiaoling 1.5 261 (% class="box" %)
262 (((
Xiaoling 1.9 263 (((
Xiaoling 1.5 264 "servaddr": "[str]",    ~/~/     Lorawan server address: Refer to TTN app handler:eu.thethings.network
265 "servport": [int],       ~/~/   Lorawan server port: 1883
Xiaoling 1.9 266 "clientid": "[str]",       ~/~/   MQTT client identity: Custom
267 "qos":[int],                 ~/~/  (Optional) MQTT service quality: 0
268 "username":"[str]",     ~/~/   Agent name of mqtt: application ID of TTN
Xiaoling 1.5 269 "password":"[str]",      ~/~/  The proxy password of mqtt: application access key of TTN
Xiaoling 1.10 270 "topic":"[str]",              ~/~/ The topic of mqtt subscription: TTN is + / devices / + / up
Xiaoling 1.5 271 "connection":"[str]" },   ~/~/(Optional) mqtt is a string used for direct connection, composed of serveraddr and port
Xiaoling 1.9 272 "mapwize_conf":{          ~/~/Map settings
Xiaoling 1.5 273 "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
274 "venueid":"[str]",        ~/~/ (Optional)Indoor map area identification
275 "orgid":"[str]",           ~/~/  The identity of the user organizer
276 "universesid":"[str]",   ~/~/The range indicator of the indoor map, find it on the universes page
277 "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 278 },
279 "loracloud":{
Xiaoling 1.5 280 "token":  "[str]"          ~/~/The password string of loracloud location service, the outdoor map must fill in the account token of loracloud
281 )))
Xiaoling 1.9 282 )))
Xiaoling 1.2 283
Xiaoling 1.9 284 (((
Xiaoling 1.2 285 }
Xiaoling 1.9 286 )))
Xiaoling 1.2 287
Xiaoling 1.5 288 (% class="box" %)
289 (((
Xiaoling 1.9 290 (((
Xiaoling 1.5 291 "rssi_conf": {
292 "rssirate": [int],          ~/~/ (Optional) A basis for rssi calculation distance, the rssi value (absolute value) when the beacon is 1 meter apart 
293 "rssidiv": [float] }        ~/~/ (Optional) rssi measures an attenuation value of distance. As the distance to the beacon is farther, the value changes speed
294 )))
Xiaoling 1.9 295 )))
Xiaoling 1.2 296
Xiaoling 1.9 297 (((
Xiaoling 1.2 298 }
Xiaoling 1.9 299 )))
Xiaoling 1.2 300
301 * Parameter acquisition method of configuration file:
302
Xiaoling 1.6 303 (% class="box" %)
304 (((
305 "username":"[str]"
306 )))
Xiaoling 1.2 307
308 [[image:https://wiki.dragino.com/images/thumb/d/da/Beacon50.png/600px-Beacon50.png||height="185" width="600"]]
309
310 username
311
Xiaoling 1.6 312 (% class="box" %)
313 (((
Xiaoling 1.8 314 "password":"[str]"     
Xiaoling 1.6 315 )))
Xiaoling 1.2 316
Xiaoling 1.10 317 [[image:https://wiki.dragino.com/images/thumb/b/bd/Beacon51.png/800px-Beacon51.png||alt="File:Beacon51.png" height="259" width="598"]]
Xiaoling 1.2 318
319 password
320
Xiaoling 1.6 321 (% class="box" %)
322 (((
323 "apikey": "[str]"
324 )))
Xiaoling 1.2 325
Xiaoling 2.5 326 [[image:https://wiki.dragino.com/images/thumb/5/53/Qwe3.png/800px-Qwe3.png||alt="File:Qwe3.png" height="325" width="606"]]
Xiaoling 1.2 327
328 apikey
329
Xiaoling 1.6 330 (% class="box" %)
331 (((
332 "orgid":"[str]"
333 )))
Xiaoling 1.2 334
Xiaoling 1.10 335 [[image:https://wiki.dragino.com/images/thumb/f/f4/Qwe4.png/800px-Qwe4.png||alt="File:Qwe4.png" height="304" width="622"]]
Xiaoling 1.2 336
337 orgid
338
Xiaoling 1.6 339 (% class="box" %)
340 (((
341 "universesid":"[str]"
342 )))
Xiaoling 1.2 343
344 [[image:https://wiki.dragino.com/images/thumb/9/9a/Qwe5.jpg/600px-Qwe5.jpg||height="424" width="600"]]
345
346 universesid
347
Xiaoling 1.6 348 (% class="box" %)
349 (((
350 "placetype": "[str]"
351 )))
Xiaoling 1.2 352
353 [[image:https://wiki.dragino.com/images/thumb/9/93/Qwe6.png/600px-Qwe6.png||height="318" width="600"]]
354
355 placetype
356
357
Xiaoling 1.6 358 **Here are two ways to enter the server:**
Xiaoling 1.2 359
Xiaoling 1.6 360 **~1. WinSCP**
361
Xiaoling 1.2 362 [[image:https://wiki.dragino.com/images/thumb/6/6b/Ibeacon4.jpg/600px-Ibeacon4.jpg||height="385" width="600"]]
363
364 [[image:https://wiki.dragino.com/images/thumb/7/78/Ibeacon5.jpg/600px-Ibeacon5.jpg||height="385" width="600"]]
365
Xiaoling 1.10 366 [[image:https://wiki.dragino.com/images/thumb/c/cd/Ibeacon6.jpg/800px-Ibeacon6.jpg||alt="File:Ibeacon6.jpg" height="362" width="599"]]
Xiaoling 1.2 367
368 way1
369
Xiaoling 1.6 370 **2. secureCRT**
Xiaoling 1.2 371
372 [[image:https://wiki.dragino.com/images/thumb/7/7b/Ibeacon7.jpg/600px-Ibeacon7.jpg||height="326" width="600"]]
373
374 [[image:https://wiki.dragino.com/images/thumb/6/64/Ibeacon8.jpg/600px-Ibeacon8.jpg||height="326" width="600"]]
375
Xiaoling 1.10 376 [[image:https://wiki.dragino.com/images/thumb/d/de/Ibeacon9.jpg/800px-Ibeacon9.jpg||alt="File:Ibeacon9.jpg" height="327" width="602"]]
Xiaoling 1.2 377
378 way2
379
380 = 6. Test Result =
381
382 The real-time position on the map is obtained according to the moving change of LBT1.
383
384 [[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