Skip to content

Веб-сервис для передачи команд клиентскому устройству посредством long polling запросов

Notifications You must be signed in to change notification settings

Ingrem/Asynchttp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Веб-сервис для передачи команд клиентскому устройству

Описание:
Реализовать веб-сервис для передачи команд клиентскому устройству посредством long polling запросов.

Есть некоторые устройства которые умеют по http/https протоколам запрашивать команды с сервера. Каждая команда состоит из имени и списка параметров команды. Список параметров - простой key/value список. Команды поступают на сервер со стороны пользователя в виде http requests. При поступлении команды она помещается в очередь команд для конкретного устройства. Для устройств есть строго ограниченный набор команд. При воступлении новой команды от пользователя необходимо валидировать команду и ее параметры. У каждой команды есть "время жизни", т.е. timeout через который команда должна быть помечена как "просроченная" и быть удалена из очереди. Пользователю должен быть доступен список с историей команд по каждому устройству.

Общий принцип работы приложения:

  1. Клиентское устройство посылает GET-запрос по url следующего вида: Method GET
http://<service>/commands/{deviceId}/{timeout}
// deviceId (string) - идентификатор устройства
// timeout -  timeout для long polling.
  1. Сервис проверяет наличие команд в очереди. В случае наличия - клиент сразу получает response с json следующего вида:
GetCommandResponseDto 
{
  "commandId": "{commandId}", // commandId (int) - номер команды, от 1 до 255,
   присваивается сервисом для каждого устройства отдельно (при достижении номера 255 следующий номер будет 1)
  "command": {command details} // command json содержащий детали команды.
}

В случае отсутствия команд для устройства сервис стартует long polling с timeout {timeout} секунд.

  1. Команды поступают в виде POST-запросов с json следующего вида в теле запроса:
SendCommandDto {
  "deviceId": "{deviceId}", // deviceId (string) - идентификатор устройства
  "command": "{command details}" // command json содержащий детали команды.
}

При получении команды сервис должен отправить ее в очередь. Затем в контроллер, отвечающий за long polling, должно быть отправлено уведомление о поступлении новой команды. При поступлении такого уведомления контроллер long polling должен закончить long polling имеющихся запросов по соответствующему устройству и вернуть команду устройству.

Приложение должно содержать UnitTests для основных кейсов. Реализация очередей команд на основе RabbitMQ. В качестве БД использовать MongoDB.

Список команд которые должно поддерживать тестовое приложение:

{
  "commandName": "delete"
  "parameters":[]
},
{
  "commandName": "getInfo"
  "parameters":[]
},
{
  "commandName": "upgrade"
  "parameters":[
      {
        "name":"url",
        "value":"..."// string value.
      }
    ]
},
{
  "commandName": "setOnOff"
  "parameters":[
      {
        "name":"switchOn",
        "value":"..."// boolean value.
      }
    ]
}

About

Веб-сервис для передачи команд клиентскому устройству посредством long polling запросов

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published