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