1

Вопрос по Remote API SDK

(edited by Andriy 25/03/2013 14:09:28)

Topic: Вопрос по Remote API SDK

Здравствуйте. Для реализации наметилось следущее ТЗ.
Нужно сделать скрипт который раз в несклько секунд будет записывать все координаты всех обьектов в системе Wialon в стороннюю БД. Реализация на php и MS Sql.

Прошу проследить ход моих соображений и поправить или дать совет где чтото сделать не так.
1) Авторизируемся с помощью команды core/login;
2) Нужно получить собственно список обьектов и их координаты/время
   Тут можно использовать или команду core/update_data_flags или core/search_item. Хотя в данном случае думаю что core/update_data_flags будет предпочтительней с той стороны, что потом в этой же сессии можно использовать команду avl_evts и в результате будут приходить все координаты, которые еще не приходили ранее. Тогда, когда core/search_item будет присылать только последние координаты.

Но существует одно НО. Если использовать одно постоянное подключение (1 сессию), то как можно узнать о создании нового обьекта в системе?
В случае удаления приходит сообтветствующее событие, а вот в случае добавления обьекта такого события не замаетил. Или это событие регистрируется если добавить в сессию пользователя (с помощью той же команды core/update_data_flags)?

3)Отдельный вопрос - за что отвечает флаг 0x00000020 - сообщения у обьектов? В его описании сказано :"Установка данного флага позволяет принимать сообщения от объекта." Мне это не совсем понятно.

Прошу строго не судить, т.к. в самом Wialon разбираюсь мало. Прошу Высказать свои предположения по этому поводу или свою реализацию если кто-то с таким сталкивался.
________________________________________________________________

Вот, собственно, сделал что-то рабочее:
- скрипт использует php cli и mysql
- скрипт подключается к Виалон SDK через php_curl и к своей БД
- При первом запуске заносит в сессию и в БД все объекты и загружает сообщения от этих объектов за некий период (по умолчанию неделя). При последующих запусках скрипт загружает сообщения с того времени, когда была последняя запись в БД для этого объекта.
- После того как были занесены все старые сообщения (это может быть длительно), скрипт ищет (и добавляет) объекты что появились за это время.
- Дальше получает события от объектов и заносит их в БД.
- Ждет несколько секунд, потом опять ищет новые объекты, потом опять запрашивает события, опять ждет и т.д.

БД содержит 3 таблицы
  1) поля id и number (имя объекта )
  2) id, object_id, latitude, logitude, time (в формате datetime)  - таблица с последними координатами объекта
  3) id, object_id, latitude, logitude, time, speed - таблица треков объектов

Дополнительно:
     -  В случае если лег mysql - скрипт держит соединение с SDK (пока это возможно) и пытается переподключится. - протестировано;
     - Если обрывается связь с СДК - скрипт тоже должен пытаться переподключится... (не тестировано)
     - Скрипт работает бесконечным циклом;
     - Все ошибки выводятся в консоль (логов пока нету);
     - нету транзакций при записи данных в БД. Не смотрел надо ли их вообще делать т.к. все данные отправляются 1 запросом. Запись 1 запросом - это тонкое место в скрипте т.к. при загрузке старых сообщений при 1-м запуске, скажем за 1 месяц, у mysql может не хватить памяти... При тестировании во время загрузки сообщений за 2 месяца - приходило  до 600 000 сообщений от объекта...
    - Скрипт не очень комментирован, но это немного компенсируется текстом в echo и чтением доков к СДК smile
    - Скрипт тестировался на протяжении пока только на протяжении 12 часов...
_____________________________________________________________
Немного исправил ошибки когда скрипт не понимал что разорвано соединение с Виалон. Добавил ведения лога ошибок.

Ну вот как то так...
Если кому нужно - то вот рабочий пример.
Все замечания и предложения приветствуются.

2

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Andriy wrote:

Хотя в данном случае думаю что core/update_data_flags будет предпочтительней

именно так

Andriy wrote:

Но существует одно НО. Если использовать одно постоянное подключение (1 сессию), то как можно узнать о создании нового обьекта в системе?

Раз в N минут делать search_items и исследовать результат на предмет новых ID.

Andriy wrote:

Отдельный вопрос - за что отвечает флаг 0x00000020 - сообщения у обьектов? В его описании сказано :"Установка данного флага позволяет принимать сообщения от объекта." Мне это не совсем понятно.

Так как и описано, без него новые сообщения в avl_evts приходить не будут.

Andriy wrote:

И еще маленький вопрос - нет ли какого то тестового аакунта на wialon для тестирования самой системы. Не только SDK, но чтобы можно было зайти обычным способом через браузер и, например, создать какой то обьект который будет периодически слать сообщения. Это было бы полезно при той же регистрации события создания обьекта через СДК

Попробуйте https://kit.wialon.com/ (kitdemo/kitdemo)
URL для SDK: https://kit-api.wialon.com
Также очень полезный ресурс для разработчиков - http://sdk.wialon.com

At the dark side of telematics...
3

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Огромное спасибо за ответ. Особенно За разъяснение флага. Воспользовался тестовым аккаунтом b3test_en на Виалон хостинг. Сейчас во время создания обьекта приходит событие, тип которого - изменение, а в самом событии передается массив с новым (увеличеным) массивом Id обьектов.

shal wrote:

Раз в N минут делать search_items и исследовать результат на предмет новых ID.

Это конечно можно, но если обьектов около 1000, то это займет время... Хотелось бы возможность получать событие похожее на удаление обьекта: тип - d, и id обьекта, который удалили, только для создания:)
Но если токового нет, то прийдется сверять id обьектов

4

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Еще интересует более подробный формат событий, которые приходят от пользователей или объектов. Как пример, когда пользователь создает в системе объект - приходит событие типа "u" с массивом [monu]=>"id объектов" и это когда пользователь НЕ добавлен в сессию с помощью core/update_data_flags. Если же он внесен в сессию, то аналогичное создание объекта присылает событие типа "u" с массивами [monu]=>"id объектов" и [monuv]=>"id объектов"
Подробное описание данных и ключей массивов не нашел в СДК(( Прошу ткнуть пальцем где это посмотреть

5

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

У пользователя различные св-ва используются сайтом Wialon Hosting. В частности monu и monuv насколько я помню определяют объекты в панели мониторинга и какие из них помечены птичкой.
Точно так-же Ваше приложение может использовать эти или другие св-ва, они нигде конкретно не зафиксированы и могут меняться.

At the dark side of telematics...
6

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Спасибо за Ваш ответ. Думаю, что остановлюсь на занесении пользователя в сессию для дальнейшей регистрации события user_create_unit.

Есть одно замечание. Это событие возвращает имя объекта, но не возвращает его id в системе. Придется искать его id c помощью core/search_item или же перезаносить в сессию заново все объекты . По сути это было бы лишнее действие если бы событие user_create_unit возвращало id созданного объекта или core/update_data_flags работал с именами объектов.  Тогда в сессию нужно было бы добавить только 1 обьект. Это удобно со стороны разработки. (Можно считать это маленьким предложением к улучшению СДК)

7

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Andriy, отличное решение wink

Увы user_create_unit является тэгом события и параметры там уже предопределены. Поиск по имени в принципе работает быстро.

At the dark side of telematics...
8

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Вобщем сегодня поразмыслив над всей этой штукой уже наметил план действий для задачи. Если успешно дороблю - выложу здесь то, что вышло, если это можно. Думаю что кому то пригодится как пример.

З.Ы. Что выбрать: поиск и добавление одного объекта в сессию или просто переопределение флагов для всех объектов - еще не определился. Думаю сделать тест и с тем и с тем. Что будет работать быстрее - то и выберу)

9

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Появился вопрос. При загрузке сообщений за некоторый период в параметрах нужно указывать количество сообщений, которые будут загружены в первую очередь в параметре "loadCount". Остальные же сообщения можно подгрузить с помощью команды messages/get_messages. Но нельзя ли в параметре "loadCount" указать "*" например или что-то в этом роде, чтобы загружались сразу все сообщения?

Я понимаю, что в некоторых случаях вывести н-ное количество сообщений сначала - это может быть удобно, но чтобы вывести сразу все - нужно исполнять 2 команды - messages/load_interval и messages/get_messages

10

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Чтобы  команда messages/load_interval возвращала сразу все сообщения укажите в loadCount 0xffffffff.

Development Department
Gurtam
11

Вопрос по Remote API SDK

Re: Вопрос по Remote API SDK

Спасибо. Раньше так и делал, но потом с била с толку маленькая ошибка) Сейчас все перепроверил. Действительно то, что нужно.