Summary
Shure ULX-D digital wireless receiver family (ULXD4 1-channel, ULXD4D 2-channel dual, ULXD4Q 4-channel quad). This spec covers the TCP/IP ASCII command-string control interface on port 2202, used by AMX/Crestron programmers for remote control and status reporting. Messages are angle-bracketed ASCII strings with GET, SET, REP, REP ERR, and SAMPLE verbs, and an x channel index in the range 0-4.
Transport
protocols:
- tcp
addressing:
port: 2202
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred from FLASH, scan/sync lock, frequency/audio controls implying live device
- routable # inferred from frequency and group/channel selection
- queryable # inferred from GET commands returning REP
- levelable # inferred from AUDIO_GAIN commands
Actions
# CRITICAL: every distinct command row in source is enumerated as a separate action.
# Channel-bearing commands are emitted with the x parameter; the spec covers one action per
# command row, parameterized where the source shows a value range.
# --- Device commands ---
- id: get_all
label: GET ALL (discovery of all report strings)
kind: query
command: "< GET x ALL >"
params:
- name: x
type: integer
description: Channel index (0 = all channels, 1-4 = individual)
- id: audio_summing_mode_get
label: GET AUDIO_SUMMING_MODE
kind: query
command: "< GET AUDIO_SUMMING_MODE >"
params: []
- id: audio_summing_mode_set
label: SET AUDIO_SUMMING_MODE
kind: action
command: "< SET AUDIO_SUMMING_MODE {value} >"
params:
- name: value
type: string
description: OFF | 1+2 | 3+4 | 1+2/3+4 (quad) | 1+2+3+4 (quad)
- id: device_id_get
label: GET DEVICE_ID
kind: query
command: "< GET DEVICE_ID >"
params: []
- id: device_id_set
label: SET DEVICE_ID
kind: action
command: "< SET DEVICE_ID {yyyyyyyy} >"
params:
- name: yyyyyyyy
type: string
description: 8-character device ID (A-Z, a-z, 0-9, allowed punctuation, space)
- id: encryption_get
label: GET ENCRYPTION
kind: query
command: "< GET ENCRYPTION >"
params: []
- id: encryption_set
label: SET ENCRYPTION
kind: action
command: "< SET ENCRYPTION {setting} >"
params:
- name: setting
type: string
description: OFF | AUTO | MANUAL
- id: encryption_regenerate_key_set
label: SET ENCRYPTION_REGENERATE_KEY
kind: action
command: "< SET ENCRYPTION_REGENERATE_KEY {value} >"
params:
- name: value
type: string
description: REQUESTED (triggers regen). Device then REP COMPLETED, then REP INACTIVE.
- id: flash_set_device
label: SET FLASH (device identify)
kind: action
command: "< SET FLASH {state} >"
params:
- name: state
type: string
description: ON | OFF
- id: flash_set_channel
label: SET FLASH (channel identify)
kind: action
command: "< SET {x} FLASH {state} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: state
type: string
description: ON | OFF
- id: frequency_diversity_mode_get
label: GET FREQUENCY_DIVERSITY_MODE
kind: query
command: "< GET FREQUENCY_DIVERSITY_MODE >"
params: []
- id: frequency_diversity_mode_set
label: SET FREQUENCY_DIVERSITY_MODE
kind: action
command: "< SET FREQUENCY_DIVERSITY_MODE {status} >"
params:
- name: status
type: string
description: OFF | 1+2 | 3+4 (quad) | 1+2/3+4 (quad)
- id: fw_ver_get
label: GET FW_VER
kind: query
command: "< GET FW_VER >"
params: []
- id: high_density_get
label: GET HIGH_DENSITY
kind: query
command: "< GET HIGH_DENSITY >"
params: []
- id: high_density_set
label: SET HIGH_DENSITY
kind: action
command: "< SET HIGH_DENSITY {value} >"
params:
- name: value
type: string
description: OFF | ON
- id: model_get
label: GET MODEL
kind: query
command: "< GET MODEL >"
params: []
- id: na_device_name_get
label: GET NA_DEVICE_NAME
kind: query
command: "< GET NA_DEVICE_NAME >"
params: []
- id: scan_lock_get
label: GET SCAN_LOCK
kind: query
command: "< GET SCAN_LOCK >"
params: []
- id: scan_lock_set
label: SET SCAN_LOCK
kind: action
command: "< SET SCAN_LOCK {state} >"
params:
- name: state
type: string
description: ON | OFF
- id: sync_lock_get
label: GET SYNC_LOCK
kind: query
command: "< GET SYNC_LOCK >"
params: []
- id: sync_lock_set
label: SET SYNC_LOCK
kind: action
command: "< SET SYNC_LOCK {state} >"
params:
- name: state
type: string
description: ON | OFF
- id: net_settings_get
label: GET NET_SETTINGS
kind: query
command: "< GET NET_SETTINGS {interface} >"
params:
- name: interface
type: string
description: SC (Shure Control) | D1 (Dante Primary) | D2 (Dante Secondary; Split/Redundant only). ULXD4 supports SC only.
- id: net_settings_set
label: SET NET_SETTINGS
kind: action
command: "< SET NET_SETTINGS {interface} {ipMode} {ipAddr} {subnetMask} {gwAddr} >"
params:
- name: interface
type: string
description: SC | D1 | D2
- name: ipMode
type: string
description: AUTO | MANUAL
- name: ipAddr
type: string
description: aaa.aaa.aaa.aaa, or "na" when ipMode=AUTO
- name: subnetMask
type: string
description: bbb.bbb.bbb.bbb, or "na" when ipMode=AUTO
- name: gwAddr
type: string
description: ccc.ccc.ccc.ccc (000.000.000.000 = no gateway), or "na" when ipMode=AUTO
# --- Channel commands ---
- id: audio_gain_get
label: GET channel AUDIO_GAIN
kind: query
command: "< GET {x} AUDIO_GAIN >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: audio_gain_set
label: SET channel AUDIO_GAIN
kind: action
command: "< SET {x} AUDIO_GAIN {value} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: value
type: integer
description: 000-060 in steps of 1 (reported/set value; actual dB = value - 18; range -18 to +42 dB)
- id: audio_gain_inc
label: SET channel AUDIO_GAIN INC
kind: action
command: "< SET {x} AUDIO_GAIN INC {step} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: step
type: integer
description: Increment amount in 1-dB steps
- id: audio_gain_dec
label: SET channel AUDIO_GAIN DEC
kind: action
command: "< SET {x} AUDIO_GAIN DEC {step} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: step
type: integer
description: Decrement amount in 1-dB steps
- id: audio_mute_get
label: GET channel AUDIO_MUTE
kind: query
command: "< GET {x} AUDIO_MUTE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: audio_mute_on
label: SET channel AUDIO_MUTE ON
kind: action
command: "< SET {x} AUDIO_MUTE ON >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: audio_mute_off
label: SET channel AUDIO_MUTE OFF
kind: action
command: "< SET {x} AUDIO_MUTE OFF >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: audio_mute_toggle
label: SET channel AUDIO_MUTE TOGGLE
kind: action
command: "< SET {x} AUDIO_MUTE TOGGLE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: chan_name_get
label: GET channel CHAN_NAME
kind: query
command: "< GET {x} CHAN_NAME >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: chan_name_set
label: SET channel CHAN_NAME
kind: action
command: "< SET {x} CHAN_NAME {yyyyyyyy} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: yyyyyyyy
type: string
description: 8-character name; A-Z, a-z, 0-9, !"#$%&'()*+,-./:;<=>?@[\]^_`~ and space
- id: encryption_warning_get
label: GET channel ENCRYPTION_WARNING
kind: query
command: "< GET {x} ENCRYPTION_WARNING >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: frequency_set
label: SET channel FREQUENCY
kind: action
command: "< SET {x} FREQUENCY {######} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: ######
type: string
description: 6-digit frequency in KHz
- id: frequency_get
label: GET channel FREQUENCY
kind: query
command: "< GET {x} FREQUENCY >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: group_chan_set
label: SET channel GROUP_CHAN
kind: action
command: "< SET {x} GROUP_CHAN {gg},{cc} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: gg
type: string
description: Two-character group
- name: cc
type: string
description: Two-character channel
- id: group_chan_get
label: GET channel GROUP_CHAN
kind: query
command: "< GET {x} GROUP_CHAN >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: na_chan_name_get
label: GET channel NA_CHAN_NAME
kind: query
command: "< GET {x} NA_CHAN_NAME >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: rf_int_det_get
label: GET channel RF_INT_DET
kind: query
command: "< GET {x} RF_INT_DET >"
params:
- name: x
type: integer
description: Channel number (1-4)
# --- Metering commands ---
- id: meter_rate_get
label: GET channel METER_RATE
kind: query
command: "< GET {x} METER_RATE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: meter_rate_set
label: SET channel METER_RATE
kind: action
command: "< SET {x} METER_RATE {#####} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: #####
type: integer
description: Sample interval in ms (00100-99999). 00000 disables metering.
- id: sample_all
label: SAMPLE ALL (metered attributes)
kind: action
command: "< SAMPLE {x} ALL {nn} {aaa} {eee} >"
params:
- name: x
type: integer
description: Channel number (1-4)
- name: nn
type: string
description: Diversity LED state (see RF_ANTENNA)
- name: aaa
type: integer
description: RF level on in-use antenna (see RX_RF_LVL)
- name: eee
type: integer
description: Audio level 000-255 (see AUDIO_LVL)
- id: rf_antenna_get
label: GET channel RF_ANTENNA
kind: query
command: "< GET {x} RF_ANTENNA >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: rx_rf_lvl_get
label: GET channel RX_RF_LVL
kind: query
command: "< GET {x} RX_RF_LVL >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: audio_lvl_get
label: GET channel AUDIO_LVL
kind: query
command: "< GET {x} AUDIO_LVL >"
params:
- name: x
type: integer
description: Channel number (1-4)
# --- Side-channel (transmitter) commands ---
- id: batt_bars_get
label: GET channel BATT_BARS
kind: query
command: "< GET {x} BATT_BARS >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_charge_get
label: GET channel BATT_CHARGE
kind: query
command: "< GET {x} BATT_CHARGE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_cycle_get
label: GET channel BATT_CYCLE
kind: query
command: "< GET {x} BATT_CYCLE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_health_get
label: GET channel BATT_HEALTH
kind: query
command: "< GET {x} BATT_HEALTH >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_run_time_get
label: GET channel BATT_RUN_TIME
kind: query
command: "< GET {x} BATT_RUN_TIME >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_temp_c_get
label: GET channel BATT_TEMP_C
kind: query
command: "< GET {x} BATT_TEMP_C >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_temp_f_get
label: GET channel BATT_TEMP_F
kind: query
command: "< GET {x} BATT_TEMP_F >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: batt_type_get
label: GET channel BATT_TYPE
kind: query
command: "< GET {x} BATT_TYPE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_device_id_get
label: GET channel TX_DEVICE_ID
kind: query
command: "< GET {x} TX_DEVICE_ID >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_fw_ver_get
label: GET channel TX_FW_VER
kind: query
command: "< GET {x} TX_FW_VER >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_menu_lock_get
label: GET channel TX_MENU_LOCK
kind: query
command: "< GET {x} TX_MENU_LOCK >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_mute_button_status_get
label: GET channel TX_MUTE_BUTTON_STATUS (ULXD6/ULXD8)
kind: query
command: "< GET {x} TX_MUTE_BUTTON_STATUS >"
params:
- name: x
type: integer
description: Channel index (1-4)
- id: tx_mute_status_get
label: GET channel TX_MUTE_STATUS (ULXD6/ULXD8)
kind: query
command: "< GET {x} TX_MUTE_STATUS >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_offset_get
label: GET channel TX_OFFSET
kind: query
command: "< GET {x} TX_OFFSET >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_power_source_get
label: GET channel TX_POWER_SOURCE (ULXD6/ULXD8)
kind: query
command: "< GET {x} TX_POWER_SOURCE >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_pwr_lock_get
label: GET channel TX_PWR_LOCK
kind: query
command: "< GET {x} TX_PWR_LOCK >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_rf_pwr_get
label: GET channel TX_RF_PWR
kind: query
command: "< GET {x} TX_RF_PWR >"
params:
- name: x
type: integer
description: Channel number (1-4)
- id: tx_type_get
label: GET channel TX_TYPE
kind: query
command: "< GET {x} TX_TYPE >"
params:
- name: x
type: integer
description: Channel number (1-4)
Feedbacks
# Each REP response from a GET/SET, and unsolicited reports from the device.
# Values listed per source.
- id: audio_summing_mode
type: enum
values: [OFF, "1+2", "3+4", "1+2/3+4", "1+2+3+4"]
- id: device_id
type: string
values: [] # 8-char string, blank = unknown
- id: encryption
type: enum
values: [OFF, AUTO, MANUAL]
- id: encryption_regenerate_key
type: enum
values: [REQUESTED, COMPLETED, INACTIVE]
- id: flash
type: enum
values: [ON, OFF]
- id: frequency_diversity_mode
type: enum
values: [OFF, "1+2", "3+4", "1+2/3+4"]
- id: fw_ver
type: string
values: [] # 24-char string, Maj.Min.Pack.Build; trailing * = incomplete prior update
- id: high_density
type: enum
values: [OFF, ON]
- id: model
type: string
values: [] # 32-char string
- id: na_device_name
type: string
values: [] # 31-char ID
- id: scan_lock
type: enum
values: [OFF, ON]
- id: sync_lock
type: enum
values: [OFF, ON]
- id: net_settings
type: string
values: [] # interface ipMode ipAddr subnetMask gwAddr macAddr
- id: audio_gain
type: integer
values: [] # 000-060 (reported), actual dB = reported - 18; range -18 to +42 dB
- id: audio_mute
type: enum
values: [ON, OFF]
- id: chan_name
type: string
values: [] # 8-char string
- id: encryption_warning
type: enum
values: [OFF, ON]
- id: frequency
type: string
values: [] # 6-digit KHz
- id: group_chan
type: string
values: [] # gg,cc; invalid reported as "--"
- id: na_chan_name
type: string
values: [] # 31-char Dante channel name
- id: rf_int_det
type: enum
values: [NONE, CRITICAL]
- id: meter_rate
type: integer
values: [] # 00100-99999 ms; 00000 = off
- id: rf_antenna
type: enum
values: [AX, XB, AB, XX] # AB not possible on ULXD4
- id: rx_rf_lvl
type: integer
values: [] # 000-255 per antenna (3-char); actual dBm = reported - 128; range -128 to 127
- id: audio_lvl
type: integer
values: [] # 000-255 (3-char); actual dBFS = reported - 50
- id: batt_bars
type: integer
values: [] # 000-005, 255 = unknown
- id: batt_charge
type: integer
values: [] # 000-100 percent, 255 = unknown
- id: batt_cycle
type: integer
values: [] # 00000-65534 cycles, 65535 = unknown
- id: batt_health
type: integer
values: [] # 000-100 percent, 255 = unknown
- id: batt_run_time
type: integer
values: [] # 00000-65532 minutes; 65533=comm err, 65534=calculating, 65535=unknown/N/A
- id: batt_temp_c
type: integer
values: [] # 000-254; actual C = reported - 40; 255 = unknown/N/A
- id: batt_temp_f
type: integer
values: [] # 000-254; actual F = reported - 40; 255 = unknown/N/A
- id: batt_type
type: enum
values: [LION, ALKA, NIMH, LITH, WARN, UNKN]
- id: tx_device_id
type: string
values: [] # 8-char string; blank = unknown/N/A/no transmitter
- id: tx_fw_ver
type: string
values: [] # Maj.Min.Pack.Build; blank if unknown/no transmitter
- id: tx_menu_lock
type: enum
values: [ON, OFF, UNKN]
- id: tx_mute_button_status
type: enum
values: [PRESSED, RELEASED, UNKN]
- id: tx_mute_status
type: enum
values: [ON, OFF, UNKN]
- id: tx_offset
type: integer
values: [] # 000-033; actual dB = reported - 12; range -12 to +21 dB; 255 = unknown
- id: tx_power_source
type: enum
values: [BATTERY, EXTERNAL, UNKNOWN]
- id: tx_pwr_lock
type: enum
values: [ON, OFF, UNKN]
- id: tx_rf_pwr
type: enum
values: [LOW, NORMAL, HIGH, UNKN]
- id: tx_type
type: enum
values: [QLXD1, QLXD2, ULXD1, ULXD2, ULXD6, ULXD8, UNKN]
Variables
# Channel index `x` is the only universal variable; it ranges 0-4 with 0 = all.
- id: channel_index
type: integer
description: Channel index used in channel and side-channel commands (0=all, 1-4=individual)
range: [0, 4]
Events
# Unsolicited device-emitted notifications.
# All non-metered properties generate a REP on value change (per source: "with the exception of
# the metered properties, the device sends a REPORT when a value changes"). Metered properties
# emit SAMPLE messages at the configured METER_RATE.
- id: property_report
description: REP message sent automatically when any non-metered property changes value
shape: "< REP ... >"
- id: sample_report
description: SAMPLE message emitted periodically at METER_RATE for metered attributes
shape: "< SAMPLE {x} ALL {nn} {aaa} {eee} >"
- id: report_error
description: REP ERR emitted when a command is improperly formatted or values are out of range
shape: "< REP ERR ... >"
- id: flash_complete
description: REP FLASH OFF emitted by the device when an identify flash finishes
shape: "< REP FLASH OFF >"
Macros
# Multi-step sequences explicitly described in source.
- id: encryption_regenerate_key_sequence
description: Regenerate encryption key (only when ENCRYPTION=MANUAL). After SET, device emits three REPs in order: REQUESTED, COMPLETED, INACTIVE. Sync devices after.
steps:
- "< SET ENCRYPTION_REGENERATE_KEY REQUESTED >"
- "< REP ENCRYPTION_REGENERATE_KEY REQUESTED >" # accepted
- "< REP ENCRYPTION_REGENERATE_KEY COMPLETED >" # new key created
- "< REP ENCRYPTION_REGENERATE_KEY INACTIVE >" # ready for new request
notes: Sync transmitters after completion (per source reminder).
- id: change_shure_control_to_manual
description: Change Shure Control interface to MANUAL static IP (device does NOT auto-reboot for SC changes; client must reconnect at new IP).
steps:
- "< SET NET_SETTINGS SC MANUAL 192.168.1.123 255.255.255.0 192.168.1.1 >"
- "Reconnect client to new IP"
- "< GET NET_SETTINGS SC >" # confirm
- id: change_shure_control_to_auto
description: Change Shure Control interface to AUTO/DHCP.
steps:
- "< SET NET_SETTINGS SC AUTO na na na >"
- "Reconnect client to new IP"
- "< GET NET_SETTINGS SC >" # confirm
- id: change_dante_primary_to_manual
description: Change Dante Primary interface to MANUAL. Device reboots automatically; client must reconnect.
steps:
- "< SET NET_SETTINGS D1 MANUAL 10.10.1.15 255.255.255.0 10.10.1.1 >"
- "Wait for device reboot"
- "Reconnect client"
- "< GET NET_SETTINGS D1 >" # confirm
- id: enable_metering
description: Start periodic SAMPLE streaming on a channel.
steps:
- "< SET {x} METER_RATE 01000 >" # 1 second interval
- id: disable_metering
description: Stop periodic SAMPLE streaming on a channel.
steps:
- "< SET {x} METER_RATE 00000 >"
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlocks, or power-on sequencing requirements.
Notes
- Source document is "ULX-D Command Strings" from Shure pubs/commandstrings page; protocol is ASCII, angle-bracket delimited, over TCP/2202, no authentication.
- All ULXD4Q (quad) commands ignore 1+2/3+4 and 1+2+3+4 for AUDIO_SUMMING_MODE / FREQUENCY_DIVERSITY_MODE if invalid; device REP without applying change.
xchannel index: 0 = all channels, 1-4 = individual. ULXD4 has 1 channel; ULXD4D has 2; ULXD4Q has 4.GET ALLwith x=0 returns device-specific REP plus ALL channel REPs (including metered); sent once per receipt, not on change.- NET_SETTINGS: setting "SC" requires client reconnect at new IP; setting "D1"/"D2" triggers automatic device reboot.
- NET_SETTINGS: AUTO mode requires literal "na" for ipAddr/subnetMask/gwAddr.
- MAC address appears only in REP responses.
- FW_VER: 24-char string Maj.Min.Pack.Build. Trailing
*= previous firmware update was incomplete; rerun via Shure Update Utility. - Side-channel (transmitter) data: blank/padded REP means unknown, not applicable, or no transmitter present.
- TX_TYPE values listed also include QLXD1/QLXD2 — ULX-D receivers can report QLXD transmitters they receive.
- Companion/community modules (Bitfocus) cited port 2202 and angle-bracket syntax independently; primary source is Shure vendor doc.
Provenance
source_domains:
- shure.com
source_urls:
- https://www.shure.com/en-US/docs/commandstrings/ulxd
- https://www.shure.com/en-US/docs/commandstrings/mxa710
- https://www.shure.com/en-US/docs/commandstrings/mxw
- https://www.shure.com/en-US/docs/commandstrings/mxa920
- https://www.shure.com/en-US/docs/commandstrings/mxcwncs
retrieved_at: 2026-09-02T16:07:12.391Z
last_checked_at: 2026-09-21T22:17:09.480Z
Verification Summary
verdict: verified
checked_at: 2026-09-21T22:17:09.480Z
matched_actions: 64
action_count: 64
confidence: medium
summary: "All 64 spec actions have literal wire-level matches in the source; transport port 2202 and TCP confirmed; bidirectional coverage complete. (3 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source is ULX-D Command Strings page only; no safety, fault, or firmware notes"
- "source contains no safety warnings, interlocks, or power-on sequencing requirements."
- "power-on sequencing, fault recovery, voltage/current, max simultaneous clients, connection-loss behavior not stated in source."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0