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 1.2 10 [[image:https://wiki.dragino.com/images/thumb/1/1a/LBT1_Mapwize_1.png/600px-LBT1_Mapwize_1.png||height="511" width="600"]]
Xiaoling 1.1 11
Xiaoling 1.2 12 LBT1 Indoor Positioning Network Structure
Xiaoling 1.1 13
Xiaoling 1.2 14 = 2. Prepare Map =
Xiaoling 1.1 15
Xiaoling 1.2 16 == 2.1 Prepare iBeacons ==
Xiaoling 1.1 17
Xiaoling 1.2 18 (((
Xiaoling 1.3 19 (((
Xiaoling 1.2 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 )))
Xiaoling 1.3 22 )))
Xiaoling 1.1 23
Xiaoling 1.2 24 (((
Xiaoling 1.3 25 (((
Xiaoling 1.2 26 First of all, user needs to accurately place the beacon at each location, which is the reference for positioning.
27 )))
Xiaoling 1.3 28 )))
Xiaoling 1.1 29
Xiaoling 1.2 30 (((
Xiaoling 1.3 31 (((
Xiaoling 1.2 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 )))
Xiaoling 1.3 34 )))
Xiaoling 1.1 35
Xiaoling 1.2 36 [[image:https://wiki.dragino.com/images/thumb/8/88/Ibeacon1.png/300px-Ibeacon1.png||height="169" width="300"]]
Xiaoling 1.1 37
Xiaoling 1.2 38 BCN01 iBeacon
Xiaoling 1.1 39
Xiaoling 1.2 40 (((
Xiaoling 1.3 41 (((
Xiaoling 1.2 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 )))
Xiaoling 1.3 44 )))
Xiaoling 1.1 45
Xiaoling 1.2 46 [[image:https://wiki.dragino.com/images/thumb/f/fa/Ibeacon2.jpg/400px-Ibeacon2.jpg||height="867" width="400"]]
Xiaoling 1.1 47
Xiaoling 1.2 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 (((
Xiaoling 1.3 58 (((
Xiaoling 1.2 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 )))
Xiaoling 1.3 61 )))
Xiaoling 1.2 62
63 (((
Xiaoling 1.3 64 (((
Xiaoling 1.2 65 ~1. Register an account at [[https:~~/~~/studio.mapwize.io/>>url:https://studio.mapwize.io/]] to create an indoor map.
66 )))
Xiaoling 1.3 67 )))
Xiaoling 1.2 68
69 (((
Xiaoling 1.3 70 (((
Xiaoling 1.2 71 2. Create Place Types.
72 )))
Xiaoling 1.3 73 )))
Xiaoling 1.2 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 (((
Xiaoling 1.4 84 (((
Xiaoling 1.2 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 )))
Xiaoling 1.4 87 )))
Xiaoling 1.2 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
Xiaoling 1.4 101 (((
Xiaoling 1.2 102 6. Add iBeacon position info. Drag the iBeacon to match position and input the UUID, MAJOR and MINOR of this iBeacon.
Xiaoling 1.4 103 )))
Xiaoling 1.2 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
Xiaoling 1.4 199 * (((
200 How to install and run this service on Linux?
201 )))
Xiaoling 1.2 202
Xiaoling 1.4 203 (((
Xiaoling 1.2 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).
Xiaoling 1.4 205 )))
Xiaoling 1.2 206
Xiaoling 1.4 207 (((
Xiaoling 1.2 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.
Xiaoling 1.4 209 )))
Xiaoling 1.2 210
Xiaoling 1.4 211 (((
Xiaoling 1.2 212
213 System: Debian / Ubuntu
Xiaoling 1.4 214 )))
Xiaoling 1.2 215
Xiaoling 1.4 216 (% class="box" %)
217 (((
218 step:
219
220 ~1. sudo apt install libcurl4-dev 
221
Xiaoling 1.2 222 2. sudo apt install  gcc automake autoconf libtool make cmake
Xiaoling 1.4 223
224 3. git clone -b master https:~/~/github.com/mikayong/location.git
225
Xiaoling 1.2 226 4. cd location/libmqtt
Xiaoling 1.4 227
Xiaoling 1.2 228 5. mkdir build
Xiaoling 1.4 229
Xiaoling 1.2 230 6. cd build && cmake ../
Xiaoling 1.4 231
Xiaoling 1.2 232 7. make && sudo make install 
Xiaoling 1.4 233
Xiaoling 1.2 234 8. cd ../
Xiaoling 1.4 235
Xiaoling 1.2 236 9. make 
Xiaoling 1.4 237
Xiaoling 1.2 238 10. sudo cp location_conf.json  /etc/
Xiaoling 1.4 239
240 ~11. Edit the configuration file, and run the location service in the background: ./location &
241 )))
Xiaoling 1.2 242
Xiaoling 1.4 243 (((
Xiaoling 1.2 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
Xiaoling 1.4 245 )))
Xiaoling 1.2 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
Xiaoling 1.5 253 (% class="box" %)
254 (((
255 "loctype": "indoor",       ~/~/ indoor/outdoor
256 "locmap": "mapwize"    ~/~/   Map interface: mapwize, traccar
257 )))
Xiaoling 1.2 258
259 }, "mqtt_conf": {
260
Xiaoling 1.5 261 (% class="box" %)
262 (((
263 "servaddr": "[str]",    ~/~/     Lorawan server address: Refer to TTN app handler:eu.thethings.network
264 "servport": [int],       ~/~/   Lorawan server port: 1883
265 "clientid": "[str]",       ~/~/   MQTT client identity: Custom
266 "qos":[int],                 ~/~/  (Optional) MQTT service quality: 0
267 "username":"[str]",     ~/~/   Agent name of mqtt: application ID of TTN
268 "password":"[str]",      ~/~/  The proxy password of mqtt: application access key of TTN
269 "topic":"[str]",              ~/~/ The topic of mqtt subscription: TTN is + / devices / + / up
270 "connection":"[str]" },   ~/~/(Optional) mqtt is a string used for direct connection, composed of serveraddr and port
271 "mapwize_conf":{          ~/~/Map settings
272 "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
273 "venueid":"[str]",        ~/~/ (Optional)Indoor map area identification
274 "orgid":"[str]",           ~/~/  The identity of the user organizer
275 "universesid":"[str]",   ~/~/The range indicator of the indoor map, find it on the universes page
276 "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 277 },
278 "loracloud":{
Xiaoling 1.5 279 "token":  "[str]"          ~/~/The password string of loracloud location service, the outdoor map must fill in the account token of loracloud
280 )))
Xiaoling 1.2 281
282 }
283
Xiaoling 1.5 284 (% class="box" %)
285 (((
286 "rssi_conf": {
287 "rssirate": [int],          ~/~/ (Optional) A basis for rssi calculation distance, the rssi value (absolute value) when the beacon is 1 meter apart 
288 "rssidiv": [float] }        ~/~/ (Optional) rssi measures an attenuation value of distance. As the distance to the beacon is farther, the value changes speed
289 )))
Xiaoling 1.2 290
291 }
292
293 * Parameter acquisition method of configuration file:
294
Xiaoling 1.6 295 (% class="box" %)
296 (((
297 "username":"[str]"
298 )))
Xiaoling 1.2 299
300 [[image:https://wiki.dragino.com/images/thumb/d/da/Beacon50.png/600px-Beacon50.png||height="185" width="600"]]
301
302 username
303
Xiaoling 1.6 304 (% class="box" %)
305 (((
306 "password":"[str]"  
307 )))
Xiaoling 1.2 308
309 [[image:https://wiki.dragino.com/images/thumb/b/bd/Beacon51.png/600px-Beacon51.png||height="260" width="600"]]
310
311 password
312
Xiaoling 1.6 313 (% class="box" %)
314 (((
315 "apikey": "[str]"
316 )))
Xiaoling 1.2 317
318 [[image:https://wiki.dragino.com/images/thumb/5/53/Qwe3.png/600px-Qwe3.png||height="321" width="600"]]
319
320 apikey
321
Xiaoling 1.6 322 (% class="box" %)
323 (((
324 "orgid":"[str]"
325 )))
Xiaoling 1.2 326
327 [[image:https://wiki.dragino.com/images/thumb/f/f4/Qwe4.png/600px-Qwe4.png||height="293" width="600"]]
328
329 orgid
330
Xiaoling 1.6 331 (% class="box" %)
332 (((
333 "universesid":"[str]"
334 )))
Xiaoling 1.2 335
336 [[image:https://wiki.dragino.com/images/thumb/9/9a/Qwe5.jpg/600px-Qwe5.jpg||height="424" width="600"]]
337
338 universesid
339
Xiaoling 1.6 340 (% class="box" %)
341 (((
342 "placetype": "[str]"
343 )))
Xiaoling 1.2 344
345 [[image:https://wiki.dragino.com/images/thumb/9/93/Qwe6.png/600px-Qwe6.png||height="318" width="600"]]
346
347 placetype
348
349
Xiaoling 1.6 350 **Here are two ways to enter the server:**
Xiaoling 1.2 351
Xiaoling 1.6 352 **~1. WinSCP**
353
Xiaoling 1.2 354 [[image:https://wiki.dragino.com/images/thumb/6/6b/Ibeacon4.jpg/600px-Ibeacon4.jpg||height="385" width="600"]]
355
356 [[image:https://wiki.dragino.com/images/thumb/7/78/Ibeacon5.jpg/600px-Ibeacon5.jpg||height="385" width="600"]]
357
358 [[image:https://wiki.dragino.com/images/thumb/c/cd/Ibeacon6.jpg/600px-Ibeacon6.jpg||height="363" width="600"]]
359
360 way1
361
Xiaoling 1.6 362 **2. secureCRT**
Xiaoling 1.2 363
364 [[image:https://wiki.dragino.com/images/thumb/7/7b/Ibeacon7.jpg/600px-Ibeacon7.jpg||height="326" width="600"]]
365
366 [[image:https://wiki.dragino.com/images/thumb/6/64/Ibeacon8.jpg/600px-Ibeacon8.jpg||height="326" width="600"]]
367
368 [[image:https://wiki.dragino.com/images/thumb/d/de/Ibeacon9.jpg/600px-Ibeacon9.jpg||height="326" width="600"]]
369
370 way2
371
372 = 6. Test Result =
373
374 The real-time position on the map is obtained according to the moving change of LBT1.
375
376 [[image:https://wiki.dragino.com/images/thumb/7/70/Beacon15.png/600px-Beacon15.png||alt="Beacon15.png" height="294" width="600"]]
Copyright ©2010-2024 Dragino Technology Co., LTD. All rights reserved
Dragino Wiki v2.0