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