Wiki source code of Mapwize

Version 28.6 by Xiaoling on 2022/07/25 11:39

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