Функционал доступен при наличии лицензии SMG-API. |
Функционал доступен только для SMG-3016 и SMG-2016. |
WebSocket API шлюза SMG предоставляет доступ к событиям системы и вызовов в режиме реального времени. Клиенты могут подписываться на события и получать уведомления через постоянное WebSocket-соединение.
Перед началом работы необходимо выполнить следующие шаги.
1. Настроить API сервер шлюза
API → Сервер

При включении интерфейса событий вызовов автоматически открывается дополнительный фиксированный порт 3999, который используется для WebSocket-подключений.
Порт 3999 используется для WebSocket и не может быть изменён. |
2. Получение токена авторизации
API → Ключи
Аккаунт должен иметь:
API → Аккаунты
Авторизация происходит по имени пользователя и паролю
curl -X POST http://<IP>:<port>/api/v1/login \
-H "Content-Type: application/json" \
-d '{"login":"<login>","password":"<password>"}'
|
Ответ:
{"status":"ok","version":"v1","payload":{"token":"Y3CupaVwSpDcmK83kxzSlymZhEIeib"}}
|
SIP абонент
Абонент должен иметь:
Абоненты → SIP абоненты
Авторизация происходит по номеру абонента и паролю
curl -X POST http://<IP>:<port>/api/v1/login \
-H "Content-Type: application/json" \
-d '{"login":"<number>","password":"<password>"}'
|
Ответ:
{"status":"ok","version":"v1","payload":{"token":"UjovsML3mIAzIs66zevqnQGElCjwrU"}} |
| Тип | Где используется |
|---|---|
| Токен API Ключа | События вызова |
| Токен абонента | События вызова |
| Токен API аккаунта | События вызова и системы (при включенном доступе) |
Токены API аккаунта и SIP-абонента истекают через 20 минут неактивности. API ключ не имеет ограничения по времени действия. |
Для открытия WebSocket-соединения нужен токен полученный одним из способов, после этого посредством инструментов взаимодействия с WebSocket-серверами (например, wscat) нужно подключиться к серверу
События вызова (фиксированный порт 3999):
wscat -c "ws://<ip>:3999/websocket" -H "Authorization: Bearer <token>" |
События системы:
wscat -c "ws://<ip>:<system_port>/websocket" -H "Authorization: Bearer <token>" |
После успешного подключения сервер отправляет сообщение:
Connected |
Порт на котором открывается WebSocket-соединение для событий вызова имеет значение по умолчанию 3999 и он не изменяется, для событий системы порт настраивается в WEB-интерфейсе. |
{
"action": "subscribe | unsubscribe | list",
"type": 0 | 1,
"subtype": 1,
"data": "string"
}
|
Подписки существуют только в рамках WebSocket-соединения. После разрыва соединения подписки очищаются. |
| Поле | Тип | Описание |
|---|---|---|
| action | string | Действие |
| type | int | Тип события |
| subtype | int | Подтип события |
| data | string | Номер абонента (для событий вызова) |
| subtype | Описание |
| 0 | Запуск ПО |
| 1 | Авария |
| 2 | Все |
| subtype | Описание |
| 0 | Входящий вызов |
| 1 | Исходящий вызов |
| 2 | Ответ |
| 3 | Завершение вызова |
| 4 | Ошибка вызова |
| 5 | DTMF |
| 6 | Все |
{
"action":"subscribe",
"type":1,
"subtype":1,
"data":"3005"
}
|
{
"version": "v1",
"status": "ok",
"payload": {
"subID": 1
}
}
|
{
"action":"unsubscribe",
"type":1,
"subtype":1,
"data":"3005"
}
|
{
"version": "v1",
"status": "ok",
"payload": {
"subID": 0
}
}
|
Запрос:
{
"action": "list"
}
|
Ответ:
{
"version": "v1",
"status": "ok",
"payload": {
"subscriptions": [
{
"subID": 2,
"type": 1,
"subtype": 1,
"subscriber": "admin",
"data": "3005"
},
{
"subID": 1,
"type": 1,
"subtype": 1,
"subscriber": "admin",
"data": "3000"
}
]
}
}
|
{
"version": "v1",
"action": "event",
"payload": {}
}
|
{
"version": "v1",
"action": "event",
"payload": {
"type": 0,
"subtype": 1,
"description": "13/04/26 15:30:31. state CRITICAL ALERT. E1 stream #01 signal loss"
}
}
|
{
"version": "v1",
"action": "event",
"payload": {
"type": 1,
"subtype": 1,
"digit": 64,
"cld": "3000",
"clg": "3005"
}
}
|
{
"version": "v1",
"status": "error",
"payload": {
"code": 401,
"message": "Unauthorized"
}
}
|
Ошибки API:
| 204 | No Content |
| 215 | Invalid input |
| 217 | Not found |
| 219 | Failed to parse json object |
| 220 | Subscription/unsubscription process error |
| 223 | Invalid format data |
| 225 | Invalid data only digit |
Ошибки протокола:
| Код | Описание |
| 401 | Unauthorized |
| 404 | Not Found |
| 405 | Method Not Allowed |