vashal

<<< Назад

gps-trace.ru

Передача данных из сервиса 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&params={"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&params={"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&params={"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-трекер.

Обсуждение (4) (1)

Иркутск, Россия

На форуме: V.A.S.t