-
Notifications
You must be signed in to change notification settings - Fork 8
duplex mode
Изначально интерфейс взаимодействия с терминалом создавался под работу с MajorDoMo, что сделало его странным и неудобным:
- От сервера терминал получает команды через сокет, причем сервер никак не проверят результат передачи а сразу его закрывает.
- От терминала сервер получает команды и информацию через http-запросы.
Для более удобной (чистой) интеграции терминала и был добавлен duplex mode.
В этом режиме используется Разделение строк через CRLF, а вся коммуникация идет через один сокет.
Особенности:
- Можно подписываться на уведомления, включая
log
иcmd
(то что передается на MJD как команда). - При исходящем подключении терминал выполнит команду
ping:<time>
(можно не отвечать). - Из duplex mode нельзя выйти не закрыв сокет. Но можно переключиться в режим мониторинга логов через
remote_log
. - Сокет не будет закрыт по тайм-ауту.
- Можно подключить терминал к терминалу. Но зачем?
Методы доступны только в JSON-RPC.
-
subscribe: Принимает список уведомлений на которые нужно подписаться, вернет
true
если хоть одна подписка была добавлена, доступны любые уведомления с каналаdefault
. Ко всем отправляемым уведомлениям будет добавляться префиксnotify.
, с параметрами всегда передается списокargs
и мапkwargs
(обычно присутствует только 1 значение вargs
). Примеры:- Подписка:
-> {"method":"subscribe","params":["backup","listener","volume","music_volume","music_status","talking","record","manual_backup","model_compile","sample_record","terminal_stop"],"id":"c02e693718ba1f98ee5498e751e7495d"} <- {"result": true, "id": "c02e693718ba1f98ee5498e751e7495d"}
- Уведомления:
<- {"method": "notify.listener", "params": {"args": [false], "kwargs": {}}} <- {"method": "notify.music_status", "params": {"args": ["play"], "kwargs": {}}} <- {"method": "notify.music_volume", "params": {"args": [56], "kwargs": {}}} <- {"method": "notify.backup", "params": {"args": ["ok"], "kwargs": {}}} <- {"method": "notify.cmd", "params": {"args": [], "kwargs": {"qry": "включи свет"}}} <- {"method": "notify.log", "params": {"args": [1584786230.796749, ["STT"], "Для распознавания используем google", 10], "kwargs": {}}}
- Подписка:
-
unsubscribe: Отписывается от уведомлений, аналогично subscribe. Обычно это не нужно, т.к. подписки обнулятся автоматически при закрытии соединения.
-
events_list: Возвращает список уведомлений которые в данный момент имеют подписчиков:
<- {"method": "events_list", "params": [], "id": "events_list"} -> {"result": ["speech_recognized_success", "stt_event", "cmd", "talking", "voice_activated", "music_status", "record", "log"], "id": "events_list"}
Требует авторизацию.
Для переключения нужно выполнить команду upgrade duplex
, в ответ должно прийти upgrade duplex ok
при успехе или ошибка в json.
[smarthome]
# Лучше забить любое значение, для совместимости.
ip = 127.0.0.1
# protocol:ip:port сервера, если хотите чтобы терминал сам к нему подключался.
# Иначе оставить пустым.
outgoing_socket = tcp:127.0.0.1:7575
# Используется для авторизации которая требуется для duplex mode.
token = my token
# Нам он больше не нужен
disable_http = on
# Можно отключить, если терминал сам устанавливает соединение.
disable_server = off
- Сервер принимающий подключение от терминала: Python, Go (устарели)
-
Простой клиент подключающийся к терминалу (команда
duplex
) - Клиент на
dart
(flutter) для android