Полезное:


Главная / How-To / SysAdmin / Прием данных с GPS трекера GlobalSat TR-151
Прием данных с GPS трекера GlobalSat TR-151

Трекер Globalsat TR-151 Здесь описан один проверенный мной способ передачи данных с трекера на вебсервер.

Как известно этот девайс умеет передавать координаты не только по SMS, но и через GPRS. Трекер подключается к серверу по TCP протоколу на IP адрес и порт, указанный в его настройках. При успешном соединении координаты передаются потоком в виде отдельных записей с координатами точек:
$356245134206721,10,3,180209,011908,E13154.4445,N4307.6488,28.5,0.35,273.05,5,4.15!
$356245134206721,10,3,180209,012003,E13154.4447,N4307.6491,28.5,0.35,273.02,5,4.15!
$356245134206721,10,3,180209,012124,E13154.4439,N4307.6483,28.5,0.35,273.13,5,4.15!
Каждая запись содержит данные о IMEI трекера, текущем режиме работы, количестве видимых спутников, дату, время получения координаты, высоту над уровнем моря. Подробнее можно узнать в инструкции к трекеру.

Так как вебсервер принимает данные только по протоколу HTTP, то передавать данные от трекера напрямую php-скрипту нашего сайта не получится. Один из способов решения этой проблемы состоит в том, что можно воспользоваться сервисом xinetd. Этот сервис прослушивает определенные порты нв сервере и как только к ним происходит подключение - запускает соответствующее приложение. Если этим приложением будет наш php-скрипт выполняющийся в интерпретаторе PHP из командной строки, то он просто прочитает данные со стандартного потока и обработает так как нам нужно.

Для настройки xinetd заходим в каталог /etc/xinetd.d и создаем там файл с именем gprs-gps
service gprs-gps
{
        flags           = REUSE
        socket_type     = stream        
        wait            = no
        user            = user
        server          = /usr/bin/php 
        server_args     = /home/user/get_gps_point.php
        log_on_failure  += USERID
        disable         = no
}
где:
/usr/bin/php - путь к php-интерпретатору
/home/user/get_gps_point.php - путь php-скрипта

Далее нам нужно добавить название сервиса и номер порта в файл /etc/service
Добавляем в конец файла строку:
gprs-gps   20100/tcp  # GPS data over GPRS
Номер порта 20100 можно поменять на любой другой свободный.

Теперь перезапускаем сервис xinetd:
# service xinetd restart
В php-скрипте данные принимаем такой конструкцией:
$data = file_get_contents('php://stdin');
В $data при этом попадают одна или несколько координат переданных в текущем сеансе связи треккера.

Как настроить трекер на GPRS передачу и обновить прошивку можно почитать на сайте gpshome.ru.

UPD: При полевых испытаниях оказалось, что трекер не рвет TCP соединение после окончания сеанса связи, в итоге PHP скрипт уходит в бесконечный системный вызов и процесс повисает в памяти. Решить проблему либо убиванием процессов по cron'у через каждые N минут, либо добавить в скрипт такую консрукцию

function signal_handler($signal) 
    {
    die "Caught SIGALRM\n";
    } 

pcntl_signal(SIGALRM, "signal_handler", false);
pcntl_alarm(100);
Теперь, при работе скрипта, на 100 секунде произойдет системный вызов SIGALRM, который запустит функцию signal_handler и эта функция завершит процесс.

Добавлено: 2009/03/06
Обновлено: 2009/10/22

Навигация
Обо мне | Портфолио | How-To | Мои ссылки | Фотоальбом | Смешно! | Контакты Адрес: Россия, Владивосток
Тел.: +7 (4232) 51-84-81