GPS трекинг Android смартфона с помощью Traccar и Node Red

Возникла идея сделать автоматизацию неких действий по приходу домой или на работу. Рассмотрим работающий вариант решения этой задачи при помощи отслеживания положения моего смартфона.

  1. Установка приложения Traccar Client. Приложение доступно в Маркете.
  2. Настройка  приложения примитивна

Картинки по запросу Traccar Client

По умолчанию установлен адрес демо-сервера Traccar. Всего в системе 5 демо серверов. Я использовал http://demo5.traccar.org/

3. Запускаем сервис и идем на http://demo5.traccar.org/ , где регистрируемся

1

далее проходим в главное окно сервера. Слева вверху добавляем свой смартфон по идентификатору из программы клиента на смартфоне

2

4. Идем в Node-Red и вставляем код

[{"id":"c1f90c37.cb4f5","type":"ui_button","z":"11a9e76c.e4d6c9","name":"","group":"7baf26a1.ac95f8","order":0,"width":0,"height":0,"passthru":false,"label":"Найти","tooltip":"","color":"","bgcolor":"","icon":"fa-male","payload":"","payloadType":"str","topic":"","x":110,"y":140,"wires":[["2c2108e7.e959a8"]]},{"id":"2c2108e7.e959a8","type":"template","z":"11a9e76c.e4d6c9","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"","x":380,"y":140,"wires":[["393dcfa1.8e9c"]]},{"id":"393dcfa1.8e9c","type":"ui_template","z":"11a9e76c.e4d6c9","group":"7baf26a1.ac95f8","name":"","order":0,"width":"20","height":"12","format":" ","storeOutMessages":true,"fwdInMessages":true,"templateScope":"local","x":600,"y":140,"wires":[[]]},{"id":"165c2e2d.b2dcf2","type":"ui_button","z":"11a9e76c.e4d6c9","name":"","group":"7baf26a1.ac95f8","order":0,"width":0,"height":0,"passthru":false,"label":"Стереть трек","tooltip":"","color":"","bgcolor":"","icon":"fa-male","payload":"{\"name\":\"HOMTOM\",\"deleted\":true}","payloadType":"json","topic":"","x":420,"y":180,"wires":[["d08e3258.83aa3"]]},{"id":"86b2bf02.597cc","type":"http request","z":"11a9e76c.e4d6c9","name":"","method":"GET","ret":"obj","paytoqs":false,"url":"http://demo5.traccar.org/api/positions","tls":"","proxy":"","authType":"basic","x":370,"y":240,"wires":[["51900a14.1bc154"]]},{"id":"c411863c.76d408","type":"inject","z":"11a9e76c.e4d6c9","name":"","topic":"","payload":"","payloadType":"date","repeat":"15","crontab":"","once":false,"onceDelay":0.1,"x":130,"y":240,"wires":[["86b2bf02.597cc","2c2108e7.e959a8"]]},{"id":"51900a14.1bc154","type":"function","z":"11a9e76c.e4d6c9","name":"Adaptation","func":"var latitude = msg.payload[0].latitude;\nvar longitude = msg.payload[0].longitude;\nmsg.payload = {\"name\":\"HOMTOM\", \"lat\":latitude, \"lon\":longitude}; \nmsg.payload.layer = \"SensorData\";\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":240,"wires":[["d08e3258.83aa3","5cbe26e7.09fa98","c158bb0d.8bbc08","92f83141.27846","66767f0d.f19b6"]]},{"id":"d08e3258.83aa3","type":"worldmap-tracks","z":"11a9e76c.e4d6c9","name":"","depth":"250","layer":"combined","x":790,"y":200,"wires":[["3ad91905.0a9266","c158bb0d.8bbc08"]]},{"id":"c158bb0d.8bbc08","type":"worldmap","z":"11a9e76c.e4d6c9","name":"","lat":"","lon":"","zoom":"18","layer":"OSM grey","cluster":"","maxage":"12000","usermenu":"show","layers":"show","panit":"true","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"deg","path":"/worldmap","x":980,"y":240,"wires":[]},{"id":"7baf26a1.ac95f8","type":"ui_group","z":"","name":"GPS tracking","tab":"4745ebe5.566154","order":2,"disp":true,"width":"20","collapse":false},{"id":"4745ebe5.566154","type":"ui_tab","z":"","name":"Map","icon":"dashboard","order":7,"disabled":false,"hidden":false}]

Алгоритм несложный: каждые 15 сек отправляем GET на сервер Traccar, полученный json адаптируем под Worldmap нод. При отправке запроса необходимо указать логин и пароль. В dashboard на вкладке Map с маркером положения и треком.

 

8

9
10.png

Для корректного отображения в dashboard в коричневый template надо вставить код

https://pastebin.com/DUsn4JXW

и в бирюзовый template вставить код

https://pastebin.com/2BG2LBSk

URL запроса имеет простой вид

http://demo5.traccar.org/api/positions

Сервер дает в ответ json вида:
11

[{"id":459488518,"attributes":{"batteryLevel":4,"distance":27.8,"totalDistance":64667.05,"motion":false},"deviceId":15852,"type":null,"protocol":"osmand","serverTime":"2019-04-23T12:39:15.000+0000","deviceTime":"2019-04-23T12:39:11.000+0000","fixTime":"2019-04-23T12:39:11.000+0000","outdated":false,"valid":true,"latitude":55.7974995,"longitude":37.5793154,"altitude":186.5,"speed":0,"course":0,"address":null,"accuracy":64.0989990234375,"network":null}]

Нам нужны значения latitude и longitude, которые обрабатывают нодом Adaptation и адаптируются под формат Worldmap.

По адресу

http://Node_RED_IP/worldmap имеем картинку

7

UPD По умолчанию при использовании своего сервера сильно грузится система ненужными java процессами, слушающими множество портов. Это все потому, что сервер поддерживает десятки устройств и для каждого типа у него свой процесс. ненужные порты,процессы, девайсы легко отключаются закомменчиванием ненужных типов в конфиге traccar по адресу /opt/traccar/conf/default.xml
12.png
в случае с клиентом на android оставить надо только порт 5055

UPDATE!
Придумал простой способ приема местоположения от Android клиента без использования локального или demo сервера при помощи Node Red. Достаточно просто слушать POST запросы на локальном http и забрать из полученного json нужные данные

13

[{"id":"ecfb5d77.af908","type":"http in","z":"11a9e76c.e4d6c9","name":"","url":"/my","method":"post","upload":false,"swaggerDoc":"","x":220,"y":1180,"wires":[["9074b787.96c388"]]},{"id":"9074b787.96c388","type":"function","z":"11a9e76c.e4d6c9","name":"Adaptation_node","func":"//function getTimeFromTimestamp(timestamp) {\n//    var today = new Date(timestamp);\n//    return today.toISOString().substring(12, 19);\n//}\n   // \"time\":getTimeFromTimestamp(msg.req.query.timestamp),\nmsg.payload = {\"name\":\"HOMTOM\",\"lat\":Number(msg.req.query.lat),\"lon\":Number(msg.req.query.lon)}; \nmsg.payload.layer = \"SensorData\";\nreturn msg;","outputs":1,"noerr":0,"x":610,"y":1180,"wires":[["cd1abf63.5dbd2","78619e4a.a70eb"]]},{"id":"cd1abf63.5dbd2","type":"worldmap-tracks","z":"11a9e76c.e4d6c9","name":"Track","depth":"30","layer":"combined","x":830,"y":1120,"wires":[["78619e4a.a70eb"]]},{"id":"78619e4a.a70eb","type":"worldmap","z":"11a9e76c.e4d6c9","name":"My map","lat":"55.7521","lon":"37.6173","zoom":"15","layer":"OSM","cluster":"15","maxage":"3000","usermenu":"show","layers":"show","panit":"true","panlock":"false","zoomlock":"false","hiderightclick":"false","coords":"deg","path":"/worldmap","x":1060,"y":1180,"wires":[]}]

Думаю, остальная настройка — уже дело техники. Всем спасибо за внимание!

Отдельное спасибо сообществу https://t.me/node_red   и пользователю @cronyx  за идеи и форуму https://discourse.nodered.org/ за помощь.