> For the complete documentation index, see [llms.txt](https://voltbro.gitbook.io/arduino-ros/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://voltbro.gitbook.io/arduino-ros/4_ros-base/service.md).

# Service

Модель коммуникации в режиме Сервис представляет собой двунаправленную синхронную связь между клиентом (Service Client), создающим запрос, и сервером (Service Server), отвечающим на запрос. Синхронность в данном случае означает, что если наша программа отправит запрос, то до получения ответа от сервера программа находится в этой точке и ожидает результат.

![](/files/-MdbHAnV-2nTFlCqwc_a)

Данный способ удобно использовать для периодической передачи данных или когда существует потребность в синхронной связи (режим запрос-ответ).

Сервер отвечает только тогда, когда есть запрос (Service Request) и клиент, который может получить ответ (Service Response). В отличие от модели работы с топиками, модель сервис работает с "одноразовыми" соединениями. Поэтому, когда цикл запрос и ответ завершен, соединение между двумя нодами будет прервано.

## Описание формата сервиса <a href="#opisanie-formata-servisa" id="opisanie-formata-servisa"></a>

Формат запроса и ответа задается специальным парным Сообщением (Message), в котором есть два сообщения: первое для запроса (Service Request), второе для ответа (Service Response). Файлы с описанием сервисов хранятся в директории `srv` и имеют расширение `.srv` Подробное описание файла доступно на странице wiki <http://wiki.ros.org/rosbuild/srv>

В файле описания сервиса первая часть (до разделителя ---) - это описание сообщения запроса, далее описание сообщения ответа.

Например `srv/AddToInts.srv`

```
uint32 x

uint32 y

---

uint32 sum
```

При этом, имя файла `AddToInts.srv` соответствует имени Сервиса AddToInts.

## Консольная утилита rosservice <a href="#konsolnaya-utilita-rosservice" id="konsolnaya-utilita-rosservice"></a>

Для отладки и тестирования сервисов ROS существует специальная консольная утилита `rosservice`:

```
rosservice call Выполнение запроса к серверу
rosservice find Поиск сервиса по типу
rosservice info Выводит информацию о сервисе
rosservice list Выводит список запущенных сервисов
rosservice type Выводит тип сообщений используемый сервисом
rosservice uri  Выводит RPC URL сервиса
```

Примеры использования `rosservice`:

### rosservice call <a href="#rosservice-call" id="rosservice-call"></a>

Вызов сервиса `service_name` c аргументами `service-args`:

```
rosservice call /service_name service-args
```

Вызов сервиса `my_service` с аргументами 1 и 2:

```
rosservice call /my_service 1 2
```

Для сложных сообщений аргументы с параметрами возможно писать в YAML синтаксисе, например:

```
rosservice call /my_service "{x: 1, y: 2}"
```

Подробно об использовании YAML <http://wiki.ros.org/ROS/YAMLCommandLine>.

### rosservice list <a href="#rosservice-list" id="rosservice-list"></a>

```
rosservice list
```

Выводит список активных сервисов.

### rosservice type <a href="#rosservice-type" id="rosservice-type"></a>

```
rosservice type /service_name
```

Выводит тип обрабатываемого сообщения.

```
$ rosservice type my_service | rossrv show

result:
int64 x
int64 y
---
int64 sum
```

Пример выводит описание типа сообщения для сервиса.
