[Сценарий] Геолокация по данным со смартфона

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
S_Nick
Сообщения: 61
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 51 раз
Контактная информация:

[Сценарий] Геолокация по данным со смартфона

Сообщение S_Nick » Пт окт 25, 2019 11:37 pm

Мой "велосипед", уверен что вы сами уже писали что-то подобное, но может что-то возьмете для себя полезное из моего кода.

Умный дом сообщает геолокацию домочадцев по данным со смартфонов.

Если есть мысли как оптимизировать улучшить код, пишите в теме.

Работает в связке с дополнением GPS-трекер.

На смартфонах пользователей каждые 5 минут данные отправляет на сервер Majordomo приложение Tasker .

backup.xml:

Код: Выделить всё

<TaskerData sr="" dvi="1" tv="5.5.bf2">
	<Profile sr="prof5" ve="2">
		<cdate>1558354268194</cdate>
		<edate>1558354582100</edate>
		<id>5</id>
		<mid0>3</mid0>
		<nme>Sync5min</nme>
		<Time sr="con0">
			<fh>-1</fh>
			<fm>-1</fm>
			<rep>2</rep>
			<repval>5</repval>
			<th>-1</th>
			<tm>-1</tm>
		</Time>
	</Profile>
	<Project sr="proj0" ve="2">
		<cdate>1559129981374</cdate>
		<mdate>1559130966340</mdate>
		<name>Base</name>
		<pids>5,4</pids>
		<tids>3,2</tids>
		<Img sr="icon" ve="2">
			<nme>mw_action_home</nme>
		</Img>
	</Project>
	<Task sr="task3">
		<cdate>1558353566729</cdate>
		<edate>1559131146614</edate>
		<id>3</id>
		<nme>GPS</nme>
		<pri>6</pri>
		<Action sr="act0" ve="7">
			<code>902</code>
			<Int sr="arg0" val="2"/>
			<Int sr="arg1" val="100"/>
			<Int sr="arg2" val="0"/>
			<Int sr="arg3" val="0"/>
		</Action>
		<Action sr="act1" ve="7">
			<code>590</code>
			<Str sr="arg0" ve="3">%LOC</Str>
			<Str sr="arg1" ve="3">,</Str>
			<Int sr="arg2" val="0"/>
		</Action>
		<Action sr="act2" ve="7">
			<code>118</code>
			<Str sr="arg0" ve="3">%MajorServer</Str>
			<Str sr="arg1" ve="3">gps.php</Str>
			<Str sr="arg2" ve="3">latitude=%LOC1
longitude=%LOC2
altitude=%LOCALT
provider=%TNET
speed=%LOCSPD
battlevel=%BATT
deviceid=%IDTEL
accuracy=%LOCACC</Str>
			<Str sr="arg3" ve="3"/>
			<Str sr="arg4" ve="3"/>
			<Int sr="arg5" val="10"/>
			<Str sr="arg6" ve="3"/>
			<Str sr="arg7" ve="3"/>
			<Int sr="arg8" val="0"/>
		</Action>
	</Task>
</TaskerData>
Глобальные функции добавленные в lib/my_lib.php

Код: Выделить всё

//склонение слов
function morpher_inflect($name, $padej = 0) {
 	//[0]Им. п, [1]Род. п, [2]Дат. п, [3]Вин. п, [4]Тв. п, [5]Пред. п
	//$url = "http://morphos.io/api/inflect-geographical-name?name=" . urlencode($name) . "&_format=xml";
	$url = "http://morphos.io/api/inflect-name?name=" . urlencode($name) . "&_format=xml";
	$data_file = file_get_contents($url);
  	$xml = simplexml_load_string($data_file);
	$res = $xml->{'cases'}->{'item'}[$padej];
 	return $res;
}

//геокодер получает адрес по координатам
function Getgeocode($lon, $lat)  {
	$api_key = "***********************************"; //yandex API KEY
	$data_file="http://geocode-maps.yandex.ru/1.x/?apikey=" . $api_key . "&geocode=E" . $lon . ",N" . $lat;
	$xml = simplexml_load_file($data_file);
	$res = $xml->{'GeoObjectCollection'}->{'featureMember'}[0]->{'GeoObject'}->{'metaDataProperty'}->{'GeocoderMetaData'}->{'AddressDetails'}->{'Country'}->{'AddressLine'};
	if (!$res) $res = "Не определено";
	return $res;
}
Код сценария whereUsers:

Код: Выделить всё

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];

$objects = getObjectsByClass("Users");
foreach($objects as $obj) {
	callMethod($obj['TITLE'] . ".SetLocation");
	$fio = gg($obj['TITLE'] . ".fullName");
    $name_arr = explode(" ", $fio);
    $name = $name_arr[0]; //получаем имя
 	$seen = gg($obj['TITLE'] . ".seenAt"); //замечен в...
 	
	if ($seen) {
        $msg = "Местонахождение ";
        if ($i) $msg = "— "; //сокращение
      	$old_seen_arr = getHistory($obj['TITLE'] . ".seenAt", strtotime("-60 minute")); //получаем массив истории
     	echo "<p>";
     	print_r($old_seen_arr);
        echo "</p>";
 		$old_seen = $old_seen_arr[0]['VALUE']; //получаем из итории
 		if ($old_seen == $seen) {
     		$still = "по-прежнему ";
    	} else {
         	$still = "";
        }
    	$ret = $msg . morpher_inflect($name, 1) . ": " . $still . $seen;
    } else {
     	$msg = "Приблизительное местонахождение ";
     	$location = gg($obj['TITLE'] . ".Location");
     	if ($i) $msg = "— "; //сокращение
		$ret = $msg . morpher_inflect($name, 1) . ": " . $location;
    }
  	$ismoving = gg($obj['TITLE'] . ".isMoving"); //в движении...
 	$speed = gg($obj['TITLE'] . ".SpeedKmH"); //скорость передвижения
 	if (intval($ismoving) && $speed >= 5) {
    	$ret .= ". Скорость передвижения: " . round($speed) . " Км/ч";
    }
 	if ($still == "") {
    	$distance = gg($obj['TITLE'] . ".HomeDistanceKm");
 		if ($distance >= 1) {
     		$ret .= ". Удаленность от Квартиры: " . round($distance) . " Км";
  	 	}
	}
	$new_ts = date_timestamp_get(date_create()); //текущий таймштамп
 	$get_ts = gg($obj['TITLE'] . ".CoordinatesUpdatedTimestamp"); //таймштамп полученных данных с GPS
 	$dif_ts = $new_ts - $get_ts;
 	if (round($dif_ts / 60) >= 15 && round($dif_ts / 60) < 60) { //если смартфон не передает данные в диапазоне от 15 до 60 минут
 		$ret .= ". Данные GPS получены " . round($dif_ts / 60) . " мин. назад";
    }
 	if (round($dif_ts / 60) >= 60) { //если смартфон не передает данные более 60 минут
     	$ret .= ". Данные GPS получены более " . date("H:i", mktime(0, 0, $dif_ts)) . " назад";
    }
 	say($ret, $level);
	echo "<br>" . $ret;	
    $i++;
}
Пример выполнения:
Приблизительное местонахождение Николая: Беларусь, Минск, Октябрьский район, микрорайон Чкаловский. Удаленность от Квартиры: 5 Км
— Натальи: по-прежнему Квартира в Минске
— Галины: по-прежнему Дом в Шарковщине
— Даниила: Квартира в Минске. Данные GPS получены более 01:53 назад
— Авт+о-Тойота-Приуса: Беларусь, Минск, улица Казинца. Скорость передвижения: 56 Км/ч
— Авт+о-Бмв-Е36: Квартира в Минске. Данные GPS получены более 03:43 назад
(У меня в авто лежат старые сматрфоны в качестве gps-трекеров)

P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
За это сообщение автора S_Nick поблагодарил:
AndreyAA (Вс окт 25, 2020 9:27 am)
Рейтинг: 1.18%
yoshok
Сообщения: 34
Зарегистрирован: Вс авг 21, 2016 12:50 pm
Благодарил (а): 0
Поблагодарили: 0

Re: [Сценарий] Геолокация по данным со смартфона

Сообщение yoshok » Вс май 23, 2021 7:24 pm

не совсем понятно backup.xml куда вписать нужно?
Аватара пользователя
xor
Сообщения: 1764
Зарегистрирован: Сб ноя 22, 2014 8:45 pm
Благодарил (а): 217 раз
Поблагодарили: 529 раз

Re: [Сценарий] Геолокация по данным со смартфона

Сообщение xor » Пн май 24, 2021 12:49 am

S_Nick писал(а):
Пт окт 25, 2019 11:37 pm
...
модуль google locations не смотрели? похожий функционал, но без таскеров. по ощущениям - меньше сажает батарею
Ответить