Skip to content

duplex mode

Aculeasis edited this page Apr 7, 2021 · 23 revisions

Изначально интерфейс взаимодействия с терминалом создавался под работу с MajorDoMo, что сделало его странным и неудобным:

  • От сервера терминал получает команды через сокет, причем сервер никак не проверят результат передачи а сразу его закрывает.
  • От терминала сервер получает команды и информацию через http-запросы.

Для более удобной (чистой) интеграции терминала и был добавлен duplex mode.

В этом режиме используется Разделение строк через CRLF, а вся коммуникация идет через один сокет.

Особенности:

  • Можно подписываться на уведомления, включая log и cmd (то что передается на MJD как команда).
  • При исходящем подключении терминал выполнит команду ping:<time> (можно не отвечать).
  • Из duplex mode нельзя выйти не закрыв сокет. Но можно переключиться в режим мониторинга логов через remote_log.
  • Сокет не будет закрыт по тайм-ауту.
  • Можно подключить терминал к терминалу. Но зачем?

API

Методы доступны только в 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"} 
    

Переключение в duplex mode

Требует авторизацию.

Для переключения нужно выполнить команду upgrade duplex, в ответ должно прийти upgrade duplex ok при успехе или ошибка в json.

Особенности настроек под duplex mode

[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

Примеры