Реализация java agent

Чтобы реализовать свой собственный Agent, следует добавить следующий код в Ваше java-приложение:

  • Cоздайте экземпляр RemoteLinkServer и задайте адрес/порт SberMobile Server, а также имя учетной записи пользователя, используемую для регистрации и пароль Агента.
  • В SberMobile Server API, поле пароля объекта RemoteLinkServer используется как пароль для пользовательского аккаунта.

    Однако, класс Agent использует поле пароля как пароль для учетной записи устройства на сервере. Он не должен соответствовать паролю пользовательской учетной записи владельца Агента.

    Если учетная запись Агента с именем, заданным в конструкторе класса Agent, уже существует, и пароли аккаунта Агента и приложения Агента не совпадают, Агент не сможет "войти" на сервер.

  • Cоздайте экземпляр Agent и задайте имя учетной записи устройства Агента в конструкторе.
  • Получите экземпляр Context, используя Agent.getContext() и добавьте определения/реализации переменных, функций и событий, используя метод addVariableDefinition(), addFunctionDefinition() и addEventDefinition().
  • Вызовите Agent.connect(), чтобы заставить Ваш Агент подключиться к SberMobile Server и авторизоваться/аутентифицироваться. Этот вызов может завершиться неуспешно по ряду причин, включая недоступность сервера, неправильно указанный адрес/порт сервера, отсутствующие или отключенные драйверы Агента сервера, несовместимость с версиями Java-библиотек, отсутствие пользовательского аккаунта и неправильно указанный пароль аккаунта устройства Агента.  
  • Вызывайте периодически метод Agent.run(). Он шлёт единственную команду на сервер и завершается, поэтому его следует вызывать в-основном из отдельного потока. На этом этапе будут вызываться Ваши собственные VariableGetter, VariableSetter и FunctionImplementation. Если метод run() генерирует DisconnectionException, значит связь с сервером прервана из-за ряда причин, и соединение следует восстановить.
  • Когда метод Agent.getContext().isSynchronized() вернет значение true, Ваше приложение может начать генерировать события Агента, используя метод Agent.getContext().fireEvent().
  • Чтобы отсоединиться от сервера и остановить Агент, следует вызвать Agent.disconnect().
  • Если некоторые события генерируются, когда Агент не подключен к серверу или еще не синхронизирован, эти события должны сохраняться локально (в памяти или области долгосрочного хранения) и отправляться в SberMobile Server при первой возможности.

    Предоставление исторических значений

    Многие Agents имеют периодическое или нестабильное соединение с SberMobile Server. Так как Agents продолжают получать и/или производить данные, когда соединение с сервером отсутствует, им необходимо отправлять на сервер журнал исторических событий после восстановления соединения.

    Если Agent поддерживает отчеты об исторических событиях, он должен определить getHistory() function. Эта функция будет вызываться сервером вскоре после установления соединения. Функция должны возвращать список исторических значений с их временными метками.

    Agent не должен асинхронно сообщать о каких-либо изменениях значений (см. раздел Информирование сервера об обновлении переменных ниже), пока не убедится, что функция getHistory() была вызвана, и сам Agent отвечает пустой таблицей (т.е. "данных больше нет"). Если этого не сделать, возникнет ошибка в каналах статистики SberMobile Server.

    Информирование сервера об обновлении переменных

    Агент может уведомить сервер, что значение определенной переменной изменилось. Такое уведомление вызовет внеплановое обновление кэша сервера, которое происходит между периодами синхронизации.

    Для отправки уведомления об обновлении переменной используйте событие обновленное (пример для Агента на базе Java):

    DataTable newTemperatureValue = new SimpleDataTable(agent.getContext().getVariableDefinition("temperature").getFormat(), 123.45); // Creating value table

     

    agent.getContext().fireEvent(AbstractContext.E_UPDATED, "temperature", newTemperatureValue);

    Обновленное событие автоматически генерируется, если вызвать agent.getContext().setVariable("temperature", newTemperatureValue);

    Разъединение с сервером

    В определенных случаях (например, если были изменены настройки учетной записи устройства агента сервера) сервер может принудительно закрыть соединение TCP с Agent. Последний должен суметь обнаружить подобную ситуацию снова восстановить связь с сервером.

    Подтверждение события

    Класс AgentContext определяет событие eventConfirmed, которое генерируется каждый раз, когда SberMobile Server подтвердил успешную доставку события, сгенерированного Agent, и обработку путем вызова функции Agent confirmEvent(). Возможно добавить слушателя для события eventConfirmed и отреагировать на подтверждения доставки события, например, путем удаления доставленных событий Agent из внутренней базы данных Agent.