Назначение
VISCA — это профессиональный протокол управления PTZ-видеокамерами. Он был разработан Sony для использования в камерах видеонаблюдения.
Аппаратный интерфейс: RS-232. Управление через RS-232 — наследие аналогового прошлого, когда камеры управлялись отдельно от видеосигнала, который передавался по коаксиальному кабелю.
VISCA структура сообщения
Базовая единица связи VISCA называется пакетом.
Первый байт пакета называется заголовком и содержит адреса отправителя и получателя.
Например, заголовок пакета, отправленного на устройство (с адресом 1) от контроллера (адрес 0) представляет собой:
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
|---|
где 1000.00012 в двоичной — это 8116 в шестнадцатеричной СС. Пакет, отправленный на устройство (адрес 2) — 1000.00102 = 8216.

Заголовок ответного пакета от устройства, которому присвоен адрес 1, равен 1001.00002 = 9016.
Пакет от устройства, которому присвоен адрес 2, равен A016.
Некоторые командные настройки могут быть отправлены на все устройства одновременно (широковещательная передача).
Функция широковещательной передачи недоступна для передачи VISCA по IP. В случае широковещательной передачи заголовок должен быть 88 в шестнадцатеричном формате. Когда терминатор равен FF16, это означает конец пакета.
Временная диаграмма
Поскольку обработка команды VISCA может выполняться максимум один раз в вертикальном (V) цикле, для возврата подтверждения/завершения запроса требуется максимум 4V-цикла. Вертикальный цикл подразумевает один полукадр. Если необходимо отправить несколько команд последовательно, нужно сначала дождаться подтверждения или сообщения об ошибке от предыдущей команды, прежде чем отправлять следующую.
RxD (Receive Data — приём данных)
TxD (Transmit Data — передача данных)

Команды и запрос
Команда — отправляет команды на устройство
Запрос — используется для запроса о текущем состоянии устройства
8X QQ RR … FF # Структура пакета
X — адрес устройства (X = 1 для VISCA по IP)
QQ — 01 (Команда), 09 (Запрос)
RR — код категории
Виды сообщений
ACK сообщение
-
возвращается устройством, когда оно получает команду
-
в случае запроса не возвращается

Сообщение о завершении
- возвращается устройством по завершении выполнения команд или запросов
- данные ответа на запрос содержатся после 3-го байта пакета
- если ACK сообщение отсутствует, номер сокета будет содержать 0
Сообщение об ошибке
- когда команда или запрос не могут быть выполнены или завершены с ошибкой, то
вместо сообщения о завершении возвращается сообщение об ошибке:

ACK/Completion Messages
| Команды | Код команды | Комментарии |
|---|---|---|
| ACK | z0 4y FF (y: Socket No.) | Возвращается, когда команда принята. |
| Завершение | z0 5y FF (y: Socket No.) | Возвращается, когда команда была выполнена. |
Error Messages
| Команды | Код команды | Комментарии |
|---|---|---|
| Синтаксическая ошибка | z0 60 02 FF | Возвращается, когда формат команды отличается или когда команда содержит недопустимые параметры |
| Командный буфер заполнен | z0 60 03 FF | Не удалось принять команду, которая получена во время выполнения двух командв данный момент. |
| Команда отменена | z0 6y 04 FF (y: Socket No.) | Возвращается, когда команда отменяется. |
| Нет сокета | z0 6y 05 FF (y: Socket No.) | Возвращается, когда ни одна команда не выполняется в сокете или когда указан недопустимый номер сокета. |
| Команда не выполняется | z0 6y 41 FF (y: Socket No.) | Возвращается, когда команда не может быть выполнена из-за текущих условий. Например, когдав режиме автоматической фокусировки принимается команда для управления ручной фокусировкой. |
Номер сокета
Когда команды отправляются на устройство, обратно отправляется сообщение о завершении или сообщения об ошибке, далее можно слать следующую команду. Устройство имеет два набора буферов для команд, так что может быть получено до двух команд. Когда устройство получает команды, оно уведомляет, какой буфер был использован, используя номер сокета в ACK-сообщении. Таким образом, ACK-сообщение и сообщение об ошибке указывают, какая команда завершилась. Даже когда используются два буфера, команда управления устройством и некоторые запросы могут быть выполнены. В таком случае сообщение ACK отсутствует и возвращается только сообщение о завершении сокета с номером 0. Таким образом, номер сокета — это просто номер команды.
VISCA over IP
С функцией VISCA over IP можно управлять камерой с помощью VISCA на контроллере, оснащенном возможностями IP-связи по локальной сети. Вы можете одновременно подключать к сети до 5 контроллеров.
Характеристики VISCA по IP:
• Интерфейс: RJ-45 10Base-T/100Base-TX
• Интернет-протокол: IPv4
• Транспортный протокол: UDP
• IP-адрес: Устанавливается командой настройки IP-карты
• Адрес порта: 52381


Контроллеры и периферийные устройства подключены к однонаправленному кольцу. При IP-соединении контроллеры и периферийные устройства подключаются по шине через локальную сеть.
Заголовок сообщения (8 байт) и полезной нагрузки (от 1 до 16 байт):

Payload type:
Содержится в первых двух байтах сообщения (байт 0 и байт 1). Полезная нагрузка содержит различную информацию о командах и запросах.
Команды VISCA
Команды протокола VISCA используются для управления камерой, получения информации о её настройках и получения информации о статусе отправки команды.
Команды VISCA разделены на:
- Команды возврата
- Команды управления
- Команды запроса
- Значения поворота/наклона камеры, масштабирования и экспозиции
С подробным списком команд можно ознакомиться по данной ссылке:
Пример реализации
С помощью данной библиотеки, реализующей функционал протокола VISCA over IP, можно задать камере поворачиваться влево и вправо, как если бы она качала головой:
import time
from visca_over_ip import Camera
cam = Camera('192.168.0.123') # IP-адрес камеры
while True:
cam.pantilt(pan_speed=-12, tilt_speed=0)
time.sleep(1) # wait one second
cam.pantilt(pan_speed=12, tilt_speed=0)