Передача данных из сервиса gps-trace.ru в модуль GPS-tracker.
Несколько раз честно пытался создать модуль, но на то, чтобы разобраться с созданием модуля, необходимо очень много времени, а его, как всегда не хватает... Поэтому решил написать просто цикл, котрый будет выполнять все те же функции. Итак, представляю вам цикл, который через заданный промежуток времени обращается через API к сайту gps-trace.ru и передает полученные данные (координаты, скорость движения, имя трекера) в модуль GPS-трекер.
<?php
chdir(dirname(__FILE__) . '/../');
include_once("./config.php");
include_once("./lib/loader.php");
include_once("./lib/threads.php");
set_time_limit(0);
date_default_timezone_set('Asia/Irkutsk'); //РЕДАКТИРУЕМ ПОД СВОЮ ВРЕМЕННУЮ ЗОНУ
$checked_time = 0;
$ltc = 1;
if (!getObject('account')){ //если отсутствует объект "account"
addClass('gpstrace'); //создаем класс "gpstrace"
addClassObject('gpstrace', 'account'); //создаем объект "account"
addClassProperty('gpstrace', 'ID'); //создаем свойства класса
addClassProperty('gpstrace', 'lastTimeUpdate'); //создаем свойства класса
addClassProperty('gpstrace', 'Name'); //создаем свойства класса
$data = SQLSelectOne("SELECT * FROM objects WHERE TITLE='account'");//получаем ID объекта "account"
$Record = Array();
$Record['OBJECT_ID'] = $data['ID'];
$Name = Array('token', 'lastTimeCycle', 'sid', 'lot', 'cycleRepeat'); //создаем свойста объекта "account"
for($i=0; $i<5; $i++){
$Record['TITLE'] = $Name[$i];
SQLInsert('properties', $Record);
}
if (!getObject('Tracker1')) sg('account.cycleRepeat', 60); //время повторения цикла устанавливается, если не существует подтянутых трекеров с сайта
}
while (1){
if (time() - $checked_time > 10){
$checked_time = time();
setGlobal((str_replace('.php', '', basename(__FILE__))) . 'Run', time(), 1);
}
if ((time() - gg('account.lastTimeCycle')) > 295){ // авторизация сбрасывается за 5 мин бездействия. Если прошло более 5 минут - авторизуемся заново
$accinfo = json_decode(file_get_contents('https://trc-api.wialon.com/wialon/ajax.html?svc=token/login¶ms={"token":"'.gg('account.token').'"}'), true); //авторизуемся и сохраняем id сессии
sg('account.sid', $accinfo['eid']); // id сессии
sg('account.lot', $datadev['totalItemsCount']); //количество подключенных к аккаунту устройств
if(isset($accinfo['error'])){ //если получаем ошибку
sg('account.Name', $accinfo['reason']); //пишем в свойство "Name" причину ошибки
$ltc = 0; // авторизация не прошла - время не обновляем
}
else{ //если ошибки нет
sg("account.Name",$accinfo['user']['nm']); //имя аккаунта
sg("account.lastTimeUpdate", date("H:i")); //время логина
$datadev = json_decode(file_get_contents('https://trc-api.wialon.com/wialon/ajax.html?svc=core/search_items¶ms={"spec":{"itemsType":"avl_unit","propName":"sys_name","propValueMask":"*","sortType":"sys_name"},"force":1,"flags":1,"from":0,"to":0%20}&sid='.gg('account.sid')), true);
for($i=1; $i<=$datadev['totalItemsCount']; $i++){
if(!getObject("Tracker$i")) addClassObject('gpstrace', "Tracker$i"); //если объект не существует, создаем объект
sg("Tracker$i.ID",$datadev['items'][$i-1]['id']); //заполняем ID
sg("Tracker$i.Name",$datadev['items'][$i-1]['nm']); //имя трекера
}
}
}
for($i=1; $i<=gg('account.lot'); $i++){
$url = 'https://trc-api.wialon.com/wialon/ajax.html?svc=messages/load_interval¶ms={"itemId":'.
gg("Tracker$i.ID").',"timeFrom":'.(time()-60).',"timeTo":'.(time()).
',"flags":1,"flagsMask":65281,"loadCount":1}&sid='.gg('account.sid'); //адрес получения сообщений (timeFrom - время начала, timeTo - время конца, loadCount - количество сообщений)
$data = json_decode(file_get_contents($url), true);
if(isset($data['messages'][0]['pos']['y'])){ //если есть данные - передаем их модулю GPS-tracks
$urlgps = BASE_URL . '/gps.php?latitude=' . $data['messages'][0]['pos']['y']
. '&longitude='. $data['messages'][0]['pos']['x']
. '&altitude=' . $data['messages'][0]['pos']['z']
. '&accuracy=' . 0
. '&provider=' . ''
. '&speed=' . $data['messages'][0]['pos']['s']
. '&battlevel='. 0
. '&charging=' . 0
. '&deviceid=' . gg("Tracker$i.Name") ;
getURL($urlgps, 0);
sg("Tracker$i.lastTimeUpdate", date("H:i"));
}
else if(isset($data['error'])){ //если ошибка
sg('account.lastTimeCycle', time() - 300); //сбрасываем время
$ltc = 0;
}
}
if(gg('account.token') == ''){
sg('account.lastTimeCycle', time() - 300);
$ltc = 0;
}
if($ltc) sg('account.lastTimeCycle', time());
$ltc = 1;
sleep(gg('account.cycleRepeat'));
}
DebMes("Unexpected close of cycle: " . basename(__FILE__));
Для того, чтобы цикл заработал, создаете в MajorDoMo в папке scripts, файл , начинающийся с cycle...php, например, cycle_gpstrace.php и копируете в него весь код, представленный выше, редактируя только свою временную зону. MajorDoMo должна сама запустить цикл, наблюдать за этим и управлять вручную можно через X-Ray во вкладке Services.
Итак, что же делает данный код? При первом запуске создает класс gpstrace, объект класса account и все необходимые свойства класса и объекта.
Далее, вам необходимо перейти по следующей ссылке: http://orange.gps-trace.com/login.html?client_id=M... и авторизоваться на gps-trace.ru, после чего скопировать из адресной строки токен access_token=cc07756443088ee907aff1bcefb7947663C13E4034B44ED799B0A6BBC6C0C45091E7DE1A& и поместить его в свойство вновь созданного объекта account. Если все сделано правильно, то в объекте account заполнятся все свойства и подтянутся все ваши устройства и для каждого из них создастся новый объект Tracker1, Tracker2...TrackerX c заполненными именем и ID. Если с токеном что-то не так, то в свойстве account.Name выведется описание ошибки.
Далее выставляете интервал обращения к сайту в свойстве account.cycleRepeat и ждете появления данных в модуле GPS-трекер.
Иркутск, Россия
На форуме: V.A.S.t