Summary
The Binary MoIP Controller is an HDMI-over-IP matrix switcher made by SnapAV Binary. It manages Transmitters (TX) and Receivers (RX) for HDMI routing, with support for OSD overlay, CEC control, IR pass-through, serial pass-through, and audio volume/mute on audio-only receivers. This spec covers the TCP-based ASCII control protocol (Integration Protocol v1.9, firmware 3.0.4.8). Up to 10 simultaneous TCP connections are supported.
Transport
protocols:
- tcp
addressing:
port: 23
auth:
type: credential
description: >-
Login required. After connecting on port 23, the controller prompts
"Please Login to Continue" then requests Username and Password.
Default credentials shown in source: binary/binary.
framing:
description: >-
ASCII text messages terminated by newline (0x0A). Message prefix indicates
type: ? = request, ! = control, # = error, ~ = unsolicited.
Traits
traits:
- routable # TX→RX switching via !Switch
- queryable # ?Firmware, ?Devices, ?Receivers, ?Name, ?Scenes, ?AudioVolumeLevel, ?HDMIAudioMute
- levelable # volume control via !SetAudioVolumelevel (0-100)
- powerable # reboot via !Reboot
Actions
actions:
- id: switch
label: Switch TX to RX
kind: action
command: "!Switch={tx},{rx}"
params:
- name: tx
type: integer
description: Transmitter index (0 to disconnect source)
- name: rx
type: integer
description: Receiver index
response_ok: "OK"
response_error: "#Error"
- id: set_resolution
label: Set Receiver Resolution
kind: action
command: "!Resolution={rx},{mode}"
params:
- name: rx
type: integer
description: Receiver index
- name: mode
type: integer
description: "0=Pass-through, 1=1080p60, 2=1080p50, 3=2160p30, 4=2160p25"
response_ok: "OK"
response_error: "#Error"
- id: osd_text
label: Display OSD Text
kind: action
command: "!OSD={rx},{msg}"
params:
- name: rx
type: integer
description: Receiver index
- name: msg
type: string
description: Plain ASCII text to display; send "CLEAR" to remove
response_ok: "OK"
response_error: "#Error"
- id: set_osd_image
label: Set OSD Image from URL
kind: action
command: "!SetOSDImage={url},{refresh_rate},[{rx_list}],{position}"
params:
- name: url
type: string
description: Image source URL
- name: refresh_rate
type: integer
description: Refresh interval in seconds
- name: rx_list
type: string
description: Comma-delimited receiver indices wrapped in brackets e.g. [1,2,3]
- name: position
type: integer
description: "3=top-right, 7=bottom-left, 9=bottom-right"
response_ok: "OK"
response_error: "#Error"
- id: set_osd_source
label: Set OSD Source Image
kind: action
command: "!SetOSDSource={tx},[{rx_list}],{position}"
params:
- name: tx
type: integer
description: Transmitter index
- name: rx_list
type: string
description: Comma-delimited receiver indices wrapped in brackets e.g. [1,2,3]
- name: position
type: integer
description: "3=top-right, 7=bottom-left, 9=bottom-right"
response_ok: "OK"
response_error: "#Error"
- id: stop_osd
label: Stop OSD
kind: action
command: "!StopOSD=[{rx_list}]"
params:
- name: rx_list
type: string
description: Comma-delimited receiver indices wrapped in brackets e.g. [1,2,3]
response_ok: "OK"
response_error: "#Error"
- id: reboot
label: Reboot Controller
kind: action
command: "!Reboot"
params: []
response_ok: "OK"
response_error: "#Error"
- id: exit
label: Exit Session
kind: action
command: "!Exit"
params: []
response_ok: "Bye"
response_error: "#Error"
- id: set_cec
label: Set CEC Mode
kind: action
command: "!CEC={rx},{mode}"
params:
- name: rx
type: integer
description: Receiver index
- name: mode
type: integer
description: "0=CEC off, 1=CEC on"
response_ok: "OK"
response_error: "#Error"
- id: send_serial
label: Send Serial Data
kind: action
command: "!Serial={type},{index},{baud}-{databits}{parity}{stopbits},{data}"
params:
- name: type
type: integer
description: "0=output (RX), 1=input (TX)"
- name: index
type: integer
description: Device index
- name: baud
type: integer
description: Baud rate
- name: databits
type: integer
description: "5, 6, 7, or 8"
- name: parity
type: string
description: "'n'=none, 'e'=even, 'o'=odd"
- name: stopbits
type: integer
description: "1 or 2"
- name: data
type: string
description: Hex data to send
response_ok: "OK"
response_error: "#Error"
- id: send_ir
label: Send IR Command
kind: action
command: "!IR={type},{index},{prontocode}"
params:
- name: type
type: integer
description: "0=output (RX), 1=input (TX)"
- name: index
type: integer
description: Device index
- name: prontocode
type: string
description: Pronto Hex format IR code
response_ok: "OK"
response_error: "#Error"
- id: set_audio_volume
label: Set Audio Volume Level
kind: action
command: "!SetAudioVolumelevel={rx},{level}"
params:
- name: rx
type: integer
description: Audio-only Receiver index
- name: level
type: integer
description: Volume level 0-100
response_ok: "OK"
response_error: "#Error"
- id: set_hdmi_audio_mute
label: Set HDMI Audio Mute
kind: action
command: "!HDMIAudioMute={rx},{mute}"
params:
- name: rx
type: integer
description: Receiver index
- name: mute
type: integer
description: "0=unmute, 1=mute"
response_ok: "OK"
response_error: "#Error"
- id: activate_scene
label: Activate Scene
kind: action
command: "!ActivateScene={name}"
params:
- name: name
type: string
description: Scene name as configured in MoIP Controller app
response_ok: "OK"
Feedbacks
feedbacks:
- id: firmware_version
label: Firmware Version
type: string
query: "?Firmware"
response_format: "?Firmware={version}"
- id: receiver_routing
label: Receiver Routing Map
type: string
query: "?Receivers"
response_format: "?Receivers={tx}:{rx}[,{tx}:{rx}...]"
description: Returns all receiver-to-transmitter mappings, comma-delimited (TX:RX pairs)
- id: device_count
label: TX and RX Count
type: string
query: "?Devices"
response_format: "?Devices={tx_count},{rx_count}"
- id: device_names
label: Device Names
type: string
query: "?Name={mode}"
params:
- name: mode
type: integer
description: "1=TX names, 0=RX names"
response_format: "?Name={mode},{index},{name}"
description: Newline-delimited for multiple devices
- id: scene_names
label: Scene Names
type: string
query: "?Scenes"
response_format: "?Scenes={name1},{name2}..."
description: Returns scene names wrapped in brackets, comma-delimited. App must be enabled.
- id: audio_volume_level
label: Audio Volume Level
type: integer
query: "?AudioVolumeLevel={rx}"
params:
- name: rx
type: integer
description: Audio-only Receiver index
response_format: "?AudioVolumeLevel={rx},{level}"
- id: hdmi_audio_mute_state
label: HDMI Audio Mute State
type: integer
query: "?HDMIAudioMute={rx}"
params:
- name: rx
type: integer
description: Receiver index
response_format: "?HDMIAudioMute={rx},{mute}"
description: "mute: 0=unmuted, 1=muted"
Variables
# No continuous settable variables beyond discrete actions above.
Events
events:
- id: unsolicited_serial
label: Unsolicited Serial Data
pattern: "~Serial={type},{index},{data}"
description: Serial data received from a TX or RX serial port, sent without request.
params:
- name: type
description: "0=RX (output), 1=TX (input)"
- name: index
description: Device index
- name: data
description: Hex data received
- id: receiver_change
label: Receiver Routing Change
pattern: "~Receivers={tx}:{rx}[,...]"
description: Broadcast when receiver routing changes. Comma-delimited TX:RX pairs.
- id: audio_volume_change
label: Audio Volume Levels Change
pattern: "~AudioVolumeLevels={level1},{level2},..."
description: Broadcast of all audio receiver volume levels in index order.
Macros
# UNRESOLVED: no multi-step sequences explicitly documented in source
Safety
confirmation_required_for:
- reboot
interlocks: []
# UNRESOLVED: no power-on sequencing or safety interlock procedures documented in source
Notes
- All commands are ASCII text terminated by
\n(0x0A). - Message prefixes:
?= request/query,!= control/action,#= error,~= unsolicited event. - Up to 10 simultaneous TCP connections supported.
- Default login credentials:
binary/binary(as shown in source example). - Scenes require the MoIP Controller app to be enabled.
- The
!Switch=0,{rx}command disconnects a receiver's source. - OSD position enumerations: 3=top-right, 7=bottom-left, 9=bottom-right.
- Serial pass-through baud format is compact, e.g.
9600-8n1. - IR uses Pronto Hex format codes.
Provenance
source_domains:
- snapav.com
source_urls:
- https://www.snapav.com/wcsstore/ExtendedSitesCatalogAssetStore/attachments/documents/MediaDistribution/ProtocolsAndDrivers/SnapAV_Binary_MoIP_API_V1.9.pdf
retrieved_at: 2026-04-30T04:24:51.843Z
last_checked_at: 2026-06-02T21:51:29.321Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:51:29.321Z
matched_actions: 14
action_count: 14
confidence: medium
summary: "All 14 Binary MOIP IP actions traced to specification. (10 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "exact model variants covered by this protocol not fully enumerated"
- "firmware version compatibility range not stated — only v3.0.4.8 confirmed"
- "no multi-step sequences explicitly documented in source"
- "no power-on sequencing or safety interlock procedures documented in source"
- "login credential change procedure not documented"
- "session timeout / keepalive behavior not documented"
- "maximum message length not stated"
- "firmware version compatibility range not stated"
- "exact model variants covered by this protocol not enumerated"
- "error code enumeration beyond \"#Error\" not documented"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0