1

Помощь в настройке табло ITLINE для Nimbus

(edited by a.avakimyan 21/08/2019 09:39:15)

Topic: Помощь в настройке табло ITLINE для Nimbus

Нашёл Ваш скрипт. Помогите решить несколько вопросов пожалуйста :
 
Где указывается остановка к которой привязано табло???
 

<?
header('Access-Control-Allow-Origin: *');

$URL = 'https://nimbus.wialon.com';
// ID табло
$STOP_ID = $_GET['id']; - ID табло сами придумываем и просто указываем его
при обращении от табло?

// NimBus API Token
$TOKEN = 'NimBus API Token'; - Какой именно Токен имеется вииду? Ключ API ?
// NimBus Depot Id
$DEPOT_ID = 'DEPOT_ID'; - ID Чего это и где взять?

Далее я так понимаю текст без изменений?

// Запрос к NimBus API
//
https://sdk.wialon.com/products/nimbus/ … get_depot…
op__stop_id__panel $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,
"$URL/api/depot/$DEPOT_ID/stop/$STOP_ID/panel"); curl_setopt($ch,
CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: $TOKEN"
));
$out = curl_exec($ch);
curl_close($ch);

// Текущее время для отображения на табло
$html = 't="'.getTime().'"'.PHP_EOL;

$out = json_decode($out, true);
if (isset($out['error']) || !isset($out['r'])) {
    // В случае ошибки или некорректных данных - выводим сообщение бегущей
строкой    $html .=
    's=3,"Ошибка получения данных. Информация на табло
неактуальна!"'.PHP_EOL; } else {
    // Цикл по маршрутам, проходящим через остановку
    foreach ($out['r'] as $index => $route) {
        // все рейсы машрута
        $timetables = $route['tt'];

        // Ищем ближайший рейс
        $nearRide = False;
        foreach ($timetables as $ind => $ride) {
            // пропускаем невалидные рейсы
            if (
                is_null($ride['uid']) &&        // объект не назначен и
                $ride['ot'] < 0                 // рейс по расписанию уже
начался            ) {
                continue;
            }

            // дополнительная проверка на валидность
            if (
                is_null($ride['tin']) ||        // объект не вошёл в
геозону или                $out['tm'] - $ride['tin'] < 60  // объект вошёл
в геозону меньше 60 сек назад            ) {
                // ближайший валидный рейс маршрута найден
                $nearRide = $ride;
                break;
            }
        }

        // Если нет подходящих рейсов - пропускаем маршрут и переходим к
следующему        if ($nearRide === False) {
            continue;
        }

        // номер маршрута
        $number = $route['n'];
        // конечная остановка
        $to = $route['ls'];
        // расчётное время прибытия по расписанию
        $eta = $ride['eta']['tt'];

        if ($eta < 0) {
            $eta = 0;
        }

        // Перевод секунд в минуты
        $eta = ceil($eta / 60);

        // Если расчётное время прибытия автобуса = 0, выводим '<1'
        if ($eta == 0) {
            $eta = '<1';
        }
       
        // Формируем строку в соответсвии с протоколом табло
        $html .= 'n="'.$number.';'.$to.';'.$eta.'"'.PHP_EOL;
    }

    // бегущая строка: имя/описание остановки
    $html .= 's=4,"ОСТАНОВКА: '.$out['n'].($out['d'] ? ' ('.$out['d'].')' :
'').'"'.PHP_EOL; }

// Конвертируем возвращаемый рещультат в кодировку "windows-1251"
mb_internal_encoding('Windows-1251');
header('Content-Type: text/html; charset=windows-1251');

echo mb_convert_encoding($html, 'Windows-1251', 'UTF-8');
?>

2

Помощь в настройке табло ITLINE для Nimbus

Re: Помощь в настройке табло ITLINE для Nimbus

a.avakimyan wrote:

Где указывается остановка к которой привязано табло???

В конфигурации самого табло.

a.avakimyan wrote:

$STOP_ID = $_GET['id']; - ID табло сами придумываем и просто указываем его
при обращении от табло?

a.avakimyan wrote:

$DEPOT_ID = 'DEPOT_ID'; - ID Чего это и где взять?

Это ID конкретной остановки в Nimbus. Узнать его можно найдя необходимую остановку в ответе на запрос https://sdk.wialon.com/products/nimbus/ … _id__stops

a.avakimyan wrote:

$TOKEN = 'NimBus API Token'; - Какой именно Токен имеется вииду? Ключ API ?

Да, имеется ввиду ключ API https://nimbus.wialon.com/docs/ru/#APITokens.htm

a.avakimyan wrote:

$DEPOT_ID = 'DEPOT_ID'; - ID Чего это и где взять?

Что такое депо можно почитать здесь. Взять его можно из запроса https://sdk.wialon.com/products/nimbus/ … et_depots. Либо из адресной строки на вкладке администрирование:

Development Department
Gurtam
3

Помощь в настройке табло ITLINE для Nimbus

(edited by a.avakimyan 21/08/2019 14:44:04)

Re: Помощь в настройке табло ITLINE для Nimbus

zuve Получается что привязка к остановке данных происходит в самом скрипте? Как же быть тогда если у меня 10 табло? Создавать 10 скриптов?

Или ID остановки в скрипт вписывать не надо и это просто переменная с запросом от табло?

4

Помощь в настройке табло ITLINE для Nimbus

Re: Помощь в настройке табло ITLINE для Nimbus

Id  остановки вписывается в табло, и табло же его посылает как параметр при обращении к серверу. В скрипте считывается этот параметр и уже пересылает запрос на нимбус.

Development Department
Gurtam
5

Помощь в настройке табло ITLINE для Nimbus

(edited by a.avakimyan 23/08/2019 15:28:18)

Re: Помощь в настройке табло ITLINE для Nimbus

Надеюсь, информация будет кому-то полезной.
Сходу не получилось запустить табло остановочное.
Разобрался и настроил табло ITLINE.
И так схема взаимодействия выглядит следующим образом.
Чтобы табло работало, ему нужно передать информацию в строчку о текущем времени, номере маршрута, наименовании конечной этого маршрута, времени прибытия. Далее идёт спецсимвол S - указывающий скорость бегущей строки на табло и далее текст самой бегущей строки.
Пример :
t="23/08/2019 14:13:31" n="8;Северная;<1" n="2;Ж/Д Вокзал конечная;<1" s=4,"Табло работает в тестовом режиме"
Данную строку Nimbus – не умеет передавать самостоятельно. Почему это не предусмотрено разработчиками – не совсем понятно, у большинства других систем диспетчеризации этот функционал встроен в ПО.
В итоге нам нужно чтобы, что-то спрашивало у NIMBUS эти данные и передавала на табло. В предложенном GURTAM варианте – это скрипт PHP. Но он у меня не завёлся сходу – пришлось переделывать.
Первоначально для работы скрипта нам нужны внести значение нескольких констант.
Для их получения можно пользоваться запросами API, но можно пойти путём проще.
Заходим в Nimbus в раздел АДМИНИСТРИРОВАНИЕ и нажимаем на ЭКСПОРТ В GTFS. Сформированный файл можно открыть архиватором (к пример WINRAR) и увидеть там файлы, которые открываются стандартным блокнотом.
ID остановки – файл stops – первые цифры до запятой (найти остановку на которой установлено будет табло)
ID депо – файл agency – цифры перед запятой до названия Вашего депо.
Token вашего NIMBUS – Зайти в NIMBUS – в раздел ключи API. Создать ключ API с полными правами. Сохранить и нажать на кнопку КОПИРОВАТЬ В БУФЕР ОБМЕНА рядом со значком удалить. Пример ключа: Token b1ddfd54f6644a9c93ae2b9a5cafc1.
Ключом является вся строчка вместе со словом TOKEN (это очень странно, в начале по логике убирал слово и пробел, но заработало только в полном написании)
Ссылка на Ваш Nimbus в случае использования Локала или стандартная ссылка на NIMBUS в случае использования хостинга (https://nimbus.wialon.com).
Создайте txt файл и вставляете туда текст скрипта. Затем меняете расширение с txt на php (к примеру tablo.php).
Текст скрипта.

<?
header('Access-Control-Allow-Origin: *');
ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
//в строчку ниже вставляете ссылку на Ваш NIMBUS
$URL = 'http://nimbus.rogaikopita.ru';
// ID табло не трогаете, оставляете так как есть, это переменная которую запрашивает само табло
$STOP_ID = $_GET['id'];
// NimBus Tokenвставляете сюда
$TOKEN = ' Token b1ddfd54f6644a9c93ae2b9a5cafc1;
// NimBus ID депо вставляете сюда
$DEPOT_ID = '254';
// Запрос к NimBus API
// https://sdk.wialon.com/products/nimbus/ … _id__panel
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "$URL/api/depot/$DEPOT_ID/stop/$STOP_ID/panel");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    "Authorization: $TOKEN"
));
$out = curl_exec($ch);
curl_close($ch);
// Текущее время для отображения на табло
// $html = 't="'.getTime().'"'.PHP_EOL;
$date = new DateTime();
$html = 't="'.date('d/m/Y H:i:s').'"'.PHP_EOL;
$out = json_decode($out, true);
if (isset($out['error']) || !isset($out['r'])) {
    // В случае ошибки или некорректных данных - выводим сообщение бегущей строкой
    $html .=
    's=3,"Ошибка получения данных. Информация на табло неактуальна!"'.PHP_EOL;
} else {
    // Цикл по маршрутам, проходящим через остановку
    foreach ($out['r'] as $index => $route) {
        // все рейсы машрута
        $timetables = $route['tt'];
        // Ищем ближайший рейс
        $nearRide = False;
        foreach ($timetables as $ind => $ride) {
            // пропускаем невалидные рейсы
            if (
                is_null($ride['uid']) &&        // объект не назначен и
                $ride['ot'] < 0                 // рейс по расписанию уже начался
            ) {
                continue;
            }
            // дополнительная проверка на валидность
            if (
                is_null($ride['tin']) ||        // объект не вошёл в геозону или
                $out['tm'] - $ride['tin'] < 60  // объект вошёл в геозону меньше 60 сек назад
            ) {
                // ближайший валидный рейс маршрута найден
                $nearRide = $ride;
                break;
            }
        }
        // Если нет подходящих рейсов - пропускаем маршрут и переходим к следующему
        if ($nearRide === False) {
            continue;
        }
        // номер маршрута
        $number = $route['n'];
        // конечная остановка
        $to = $route['ls'];
        // расчётное время прибытия по расписанию
        $eta = $ride['eta']['tt'];
        if ($eta < 0) {
            $eta = 0;
        }
        // Перевод секунд в минуты
        $eta = ceil($eta / 60);
        // Если расчётное время прибытия автобуса = 0, выводим '<1'
        if ($eta == 0) {
            $eta = '<1';
        }
  // бегущая строка текст
    $html .= 's=4,"Табло работает в тестовом режиме. "';
                    }
echo ($html);
?>


Если не разбираетесь в PHP, то изменять в скрипте стоит только там, где комментарии жирным выделены..

Далее размещаем этот файл на Ваш хостинг в корень (для примера).

Допустим если Ваш сайт rogaikopita.ru то ссылка к Вашему скрипту будет, rogaikopita.ru/tablo.php
Чтобы проверить правильно ли вы всё сделали, пишем в адресной строке браузера:
http://rogaikopita.ru/tablo.php?id=26824
Последние 5 цифр это ID Вашей остановки. А сайт конечно Ваш а не рога и копыта ))) В ответ должны получить результат, как в начале этого поста или описание ошибки.

Если строчка получена, верно, то можно настраивать табло.

В настройках табло указываете настройки Вашей сим карты и:
Сервер/порт: rogaikopita.ru (ваш сайт) порт 80
Страница на сервере:tablo.php
Хост (опционально): rogaikopita.ru (ваш сайт)
Идентификатор: 26824 (ID вашей остановки)
Период опроса, с: 30 (1 раз в 30 секунд обновлять данные на табло в среднем 100-150 Мб в месяц)
Сторожевой таймер, с: 600 (ВАЖНЫЙ параметр, активируется при установленном значении от 600 сек., это на случай если табло теряет связь с сервером по разным причинам (например баланс sim-карты забыли пополнить или сервер отключился) и автоматически табло полностью будет перезагружаться в т.ч. и модем. и снова пытаться связаться с сервером (а не просто зависнет). При этом основное поле табло гаснет - уходит в спящий режим и не дезинформирует граждан о времени прибытия транспорта).

Инструкция написана для тех, кто ничего не понимает в PHP, но нужно запустить
https://forum.gurtam.com/misc.php?action=pun_attachment&amp;item=10034&amp;download=0

В итоге выявлена следующая проблема, у нас у перевозчика нет расписания промежуточных остановок. Есть только время выезда и приезда на конечную. Возможно в дальнейшем это ситуация конечно измениться но пока так.  И табло не видя информации о опережении или отставании от предыдущих остановок - не указывает реальное время прибытия, а показывает <1. Тоже самое наблюдается и в Nimbus Локаторе. Хотелось бы иметь конечно в системе, некую логику расчёта приезда без промежуточных точек, к примеру на основании данных из истории данного маршрута за последний день, неделю, месяц.