Summary

RS-232 and TCP/IP control protocol for Oppo UDP-203 and UDP-205 4K Ultra HD Blu-ray players. Commands use a #XXX prefix and carriage return terminator; responses use @XXX prefix with OK/ER result codes. The protocol is shared across both models (some commands/inputs are UDP-205 only).

Transport

protocols:
  - serial
  - tcp
addressing:
  port: 23  # stated in source: "TCP port 23"
serial:
  baud_rate: 9600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable  # inferred from PON/POF/POW commands
- routable   # inferred from SIS input select + UIS updates
- queryable  # inferred from Q* query commands
- levelable  # inferred from SVL volume + UVL updates

Actions

# ===== A. Remote-key mapped commands =====
- id: power_toggle
  label: Power Toggle
  kind: action
  command: "#POW\r"
  params: []

- id: eject_toggle
  label: Open/Close Disc Tray
  kind: action
  command: "#EJT\r"
  params: []

- id: power_on
  label: Power On (discrete)
  kind: action
  command: "#PON\r"
  params: []

- id: power_off
  label: Power Off (discrete)
  kind: action
  command: "#POF\r"
  params: []

- id: dim
  label: Dim Front Panel Display
  kind: action
  command: "#DIM\r"
  params: []

- id: pure_audio
  label: Pure Audio Mode
  kind: action
  command: "#PUR\r"
  params: []

- id: volume_up
  label: Volume Up
  kind: action
  command: "#VUP\r"
  params: []

- id: volume_down
  label: Volume Down
  kind: action
  command: "#VDN\r"
  params: []

- id: mute
  label: Mute
  kind: action
  command: "#MUT\r"
  params: []

- id: num_1
  label: Numeric Key 1
  kind: action
  command: "#NU1\r"
  params: []

- id: num_2
  label: Numeric Key 2
  kind: action
  command: "#NU2\r"
  params: []

- id: num_3
  label: Numeric Key 3
  kind: action
  command: "#NU3\r"
  params: []

- id: num_4
  label: Numeric Key 4
  kind: action
  command: "#NU4\r"
  params: []

- id: num_5
  label: Numeric Key 5
  kind: action
  command: "#NU5\r"
  params: []

- id: num_6
  label: Numeric Key 6
  kind: action
  command: "#NU6\r"
  params: []

- id: num_7
  label: Numeric Key 7
  kind: action
  command: "#NU7\r"
  params: []

- id: num_8
  label: Numeric Key 8
  kind: action
  command: "#NU8\r"
  params: []

- id: num_9
  label: Numeric Key 9
  kind: action
  command: "#NU9\r"
  params: []

- id: num_0
  label: Numeric Key 0
  kind: action
  command: "#NU0\r"
  params: []

- id: clear
  label: Clear Numeric Input
  kind: action
  command: "#CLR\r"
  params: []

- id: goto
  label: Go To Location
  kind: action
  command: "#GOT\r"
  params: []

- id: home
  label: Home Menu
  kind: action
  command: "#HOM\r"
  params: []

- id: page_up
  label: Page Up
  kind: action
  command: "#PUP\r"
  params: []

- id: page_down
  label: Page Down
  kind: action
  command: "#PDN\r"
  params: []

- id: info_osd
  label: Show/Hide OSD
  kind: action
  command: "#OSD\r"
  params: []

- id: top_menu
  label: Top Menu
  kind: action
  command: "#TTL\r"
  params: []

- id: popup_menu
  label: Pop-up Menu
  kind: action
  command: "#MNU\r"
  params: []

- id: nav_up
  label: Navigation Up
  kind: action
  command: "#NUP\r"
  params: []

- id: nav_left
  label: Navigation Left
  kind: action
  command: "#NLT\r"
  params: []

- id: nav_right
  label: Navigation Right
  kind: action
  command: "#NRT\r"
  params: []

- id: nav_down
  label: Navigation Down
  kind: action
  command: "#NDN\r"
  params: []

- id: nav_enter
  label: Navigation Enter
  kind: action
  command: "#SEL\r"
  params: []

- id: setup
  label: Setup Menu
  kind: action
  command: "#SET\r"
  params: []

- id: return
  label: Return
  kind: action
  command: "#RET\r"
  params: []

- id: red
  label: Red Key
  kind: action
  command: "#RED\r"
  params: []

- id: green
  label: Green Key
  kind: action
  command: "#GRN\r"
  params: []

- id: blue
  label: Blue Key
  kind: action
  command: "#BLU\r"
  params: []

- id: yellow
  label: Yellow Key
  kind: action
  command: "#YLW\r"
  params: []

- id: stop
  label: Stop
  kind: action
  command: "#STP\r"
  params: []

- id: play
  label: Play
  kind: action
  command: "#PLA\r"
  params: []

- id: pause
  label: Pause
  kind: action
  command: "#PAU\r"
  params: []

- id: previous
  label: Previous
  kind: action
  command: "#PRE\r"
  params: []

- id: rev
  label: Fast Reverse
  kind: action
  command: "#REV\r"
  params: []

- id: fwd
  label: Fast Forward
  kind: action
  command: "#FWD\r"
  params: []

- id: next
  label: Next
  kind: action
  command: "#NXT\r"
  params: []

- id: audio
  label: Audio Language/Channel
  kind: action
  command: "#AUD\r"
  params: []

- id: subtitle
  label: Subtitle Language
  kind: action
  command: "#SUB\r"
  params: []

- id: angle
  label: Camera Angle
  kind: action
  command: "#ANG\r"
  params: []

- id: zoom
  label: Zoom
  kind: action
  command: "#ZOM\r"
  params: []

- id: sap
  label: Secondary Audio Program
  kind: action
  command: "#SAP\r"
  params: []

- id: ab_replay
  label: AB Replay
  kind: action
  command: "#ATB\r"
  params: []

- id: repeat
  label: Repeat
  kind: action
  command: "#RPT\r"
  params: []

- id: pip
  label: Picture-in-Picture
  kind: action
  command: "#PIP\r"
  params: []

- id: resolution
  label: Switch Output Resolution
  kind: action
  command: "#HDM\r"
  params: []

- id: subtitle_hold
  label: Subtitle (hold) - Shift
  kind: action
  command: "#SUH\r"
  params: []

- id: option
  label: Option Menu
  kind: action
  command: "#OPT\r"
  params: []

- id: threed
  label: 3D Menu
  kind: action
  command: "#M3D\r"
  params: []

- id: picture_adjust
  label: Picture Adjustment
  kind: action
  command: "#SEH\r"
  params: []

- id: hdr_menu
  label: HDR Selection Menu
  kind: action
  command: "#HDR\r"
  params: []

- id: info_hold
  label: Info (hold)
  kind: action
  command: "#INH\r"
  params: []

- id: resolution_auto
  label: Resolution Auto
  kind: action
  command: "#RLH\r"
  params: []

- id: av_sync
  label: A/V Sync Adjustment
  kind: action
  command: "#AVS\r"
  params: []

- id: gapless_play
  label: Gapless Play
  kind: action
  command: "#GPA\r"
  params: []

- id: nop
  label: No Operation
  kind: action
  command: "#NOP\r"
  params: []

- id: input
  label: Input Menu
  kind: action
  command: "#SRC\r"
  params: []

# ===== B. Query Commands =====
- id: q_verbose_mode
  label: Query Verbose Mode
  kind: query
  command: "#QVM\r"
  params: []

- id: q_power
  label: Query Power Status
  kind: query
  command: "#QPW\r"
  params: []

- id: q_firmware
  label: Query Firmware Version
  kind: query
  command: "#QVR\r"
  params: []

- id: q_volume
  label: Query Volume
  kind: query
  command: "#QVL\r"
  params: []

- id: q_hdmi_resolution
  label: Query HDMI Resolution
  kind: query
  command: "#QHD\r"
  params: []

- id: q_playback
  label: Query Playback Status
  kind: query
  command: "#QPL\r"
  params: []

- id: q_track_title
  label: Query Track/Title
  kind: query
  command: "#QTK\r"
  params: []

- id: q_chapter
  label: Query Chapter
  kind: query
  command: "#QCH\r"
  params: []

- id: q_track_title_elapsed
  label: Query Track/Title Elapsed
  kind: query
  command: "#QTE\r"
  params: []

- id: q_track_title_remaining
  label: Query Track/Title Remaining
  kind: query
  command: "#QTR\r"
  params: []

- id: q_chapter_elapsed
  label: Query Chapter Elapsed
  kind: query
  command: "#QCE\r"
  params: []

- id: q_chapter_remaining
  label: Query Chapter Remaining
  kind: query
  command: "#QCR\r"
  params: []

- id: q_total_elapsed
  label: Query Total Elapsed
  kind: query
  command: "#QEL\r"
  params: []

- id: q_total_remaining
  label: Query Total Remaining
  kind: query
  command: "#QRE\r"
  params: []

- id: q_disc_type
  label: Query Disc Type
  kind: query
  command: "#QDT\r"
  params: []

- id: q_audio_type
  label: Query Audio Type
  kind: query
  command: "#QAT\r"
  params: []

- id: q_subtitle_type
  label: Query Subtitle Type
  kind: query
  command: "#QST\r"
  params: []

- id: q_subtitle_shift
  label: Query Subtitle Shift
  kind: query
  command: "#QSH\r"
  params: []

- id: q_osd_position
  label: Query OSD Position
  kind: query
  command: "#QOP\r"
  params: []

- id: q_repeat_mode
  label: Query Repeat Mode
  kind: query
  command: "#QRP\r"
  params: []

- id: q_zoom_mode
  label: Query Zoom Mode
  kind: query
  command: "#QZM\r"
  params: []

- id: q_hdr_setting
  label: Query HDR Setting
  kind: query
  command: "#QHR\r"
  params: []

- id: q_3d_status
  label: Query 3D Status
  kind: query
  command: "#Q3D\r"
  params: []

- id: q_hdr_status
  label: Query HDR Status
  kind: query
  command: "#QHS\r"
  params: []

- id: q_input_source
  label: Query Input Source
  kind: query
  command: "#QIS\r"
  params: []

- id: q_cddb
  label: Query CDDB Number
  kind: query
  command: "#QCD\r"
  params: []

- id: q_media_format
  label: Query Media File Format
  kind: query
  command: "#QFT\r"
  params: []

- id: q_file_name
  label: Query Media File Name
  kind: query
  command: "#QFN\r"
  params: []

- id: q_track_name
  label: Query Track Name
  kind: query
  command: "#QTN\r"
  params: []

- id: q_track_album
  label: Query Track Album
  kind: query
  command: "#QTA\r"
  params: []

- id: q_track_performer
  label: Query Track Performer
  kind: query
  command: "#QTP\r"
  params: []

- id: q_directory_size
  label: Query Directory Size
  kind: query
  command: "#QDS\r"
  params: []

- id: q_aspect_ratio
  label: Query Aspect Ratio
  kind: query
  command: "#QAR\r"
  params: []

# ===== C. Advanced Commands =====
- id: set_verbose_mode
  label: Set Verbose Mode
  kind: action
  command: "#SVM {mode}\r"
  params:
    - name: mode
      type: integer
      description: "0=off, 1=unused, 2=major status updates, 3=detailed status updates"

- id: set_hdmi_resolution
  label: Set HDMI Output Resolution
  kind: action
  command: "#SHD {resolution}\r"
  params:
    - name: resolution
      type: string
      description: "AUTO, SRC, UHD_AUTO, UHD24, UHD50, UHD60, 1080P_AUTO, 1080P24, 1080P50, 1080P60, 1080I50, 1080I60, 720P50, 720P60, 576P, 576I, 480P, 480I"

- id: set_zoom
  label: Set Zoom Ratio
  kind: action
  command: "#SZM {ratio}\r"
  params:
    - name: ratio
      type: string
      description: "1, AR, FS, US, 1.2, 1.3, 1.5, 2, 1/2, 3, 4, 1/3, 1/4"

- id: set_volume
  label: Set Volume
  kind: action
  command: "#SVL {level}\r"
  params:
    - name: level
      type: string
      description: "0..100 or MUTE"

- id: set_repeat
  label: Set Repeat Mode
  kind: action
  command: "#SRP {mode}\r"
  params:
    - name: mode
      type: string
      description: "CH, TT, ALL, OFF, SHF, RND"

- id: search
  label: Search To Title/Chapter/Time
  kind: action
  command: "#SRH {target}\r"
  params:
    - name: target
      type: string
      description: "T3, C10, C 0:00:34, T 0:12:13, 0:12:13"

- id: direct_play
  label: Direct Play
  kind: action
  command: "#DPL\r"
  params: []

- id: reset
  label: Reset (Clear Command Buffers)
  kind: action
  command: "#RST\r"
  params: []

- id: set_subtitle_shift
  label: Set Subtitle Shift
  kind: action
  command: "#SSH {shift}\r"
  params:
    - name: shift
      type: integer
      description: "-10..10"

- id: set_osd_position
  label: Set OSD Position
  kind: action
  command: "#SOP {pos}\r"
  params:
    - name: pos
      type: integer
      description: "0..5"

- id: set_time_display
  label: Set Time Information Display
  kind: action
  command: "#STC {type}\r"
  params:
    - name: type
      type: string
      description: "E=Total Elapsed, R=Total Remaining, T=Title Elapsed, X=Title Remaining, C=Chapter Elapsed, K=Chapter Remaining"

- id: set_hdr
  label: Set HDR Setting
  kind: action
  command: "#SHR {mode}\r"
  params:
    - name: mode
      type: string
      description: "Auto, On, Off"

- id: set_input_source
  label: Select Input Source
  kind: action
  command: "#SIS {source}\r"
  params:
    - name: source
      type: integer
      description: "0=BD-PLAYER, 1=HDMI-IN, 2=ARC:HDMI-OUT, 3=OPTICAL-IN, 4=COAXIAL-IN, 5=USB-AUDIO-IN (3-5 UDP-205 only)"

- id: set_screen_saver
  label: Set Screen Saver
  kind: action
  command: "#SSA {mode}\r"
  params:
    - name: mode
      type: string
      description: "ON, OFF, SAVE"

- id: app
  label: Launch Application
  kind: action
  command: "#APP {app}\r"
  params:
    - name: app
      type: string
      description: "DIS, MUS, PHO, MOV, NET, SET"

- id: set_sacd_priority
  label: Set SACD Priority
  kind: action
  command: "#SSD {prio}\r"
  params:
    - name: prio
      type: string
      description: "M=Multi-channel, S=Stereo, C=CD Mode"

- id: set_sacd_output
  label: Set SACD Output Mode
  kind: action
  command: "#SDP {mode}\r"
  params:
    - name: mode
      type: string
      description: "D=Output DSD, P=Output PCM, A=Auto"

- id: set_forward_speed
  label: Set Fast/Slow Forward Speed
  kind: action
  command: "#FWD {speed}\r"
  params:
    - name: speed
      type: string
      description: "1/32, 1/16, 1/8, 1/4, 1/2, 1, 2, 3, 4, 5"

- id: set_reverse_speed
  label: Set Fast/Slow Reverse Speed
  kind: action
  command: "#REV {speed}\r"
  params:
    - name: speed
      type: string
      description: "1/32, 1/16, 1/8, 1/4, 1/2, 1, 2, 3, 4, 5 (slow reverse not for UHD)"

- id: q_directory_item
  label: Query Directory Item
  kind: action
  command: "#QDR {index}\r"
  params:
    - name: index
      type: integer
      description: "1-based index of file/item in current directory listing"

Feedbacks

# Response codes per command are listed inline in the Actions section.
# Observed states (also surfaced as status updates when verbose >= 2):
- id: power_state
  type: enum
  values: [on, off]

- id: playback_state
  type: enum
  values: [play, pause, stop, step, frev, ffwd, sfwd, srev, setup, home_menu, media_center, screen_saver, disc_menu, load, open, clos]

- id: disc_type
  type: enum
  values: [uhbd, bdmv, dvdv, dvda, sacd, cdda, data, vcd2, svcd, unkw, no_disc]

- id: volume_level
  type: integer
  range: 0..100

- id: mute_state
  type: enum
  values: [mute, unmute]

- id: input_source
  type: enum
  values: [bd_player, hdmi_in, arc_hdmi_out, optical_in, coaxial_in, usb_audio_in]

Events

# Verbose mode 2+ unsolicited status updates.
# Format: @<code> <params>\r
- id: upw
  description: Power Status Update
  format: "@UPW {state}\r"
  values: ["1", "0"]

- id: upl
  description: Playback Status Update
  format: "@UPL {state}\r"
  values: ["DISC", "LOAD", "OPEN", "CLOS", "PLAY", "PAUS", "STOP", "STPF", "STPR", "FFW1..FFW5", "FRV1..FRV5", "SFW1..SFW5", "SRV1..SRV5", "HOME", "MCTR", "SCSV", "MENU"]

- id: uvl
  description: Volume Level Update
  format: "@UVL {level}\r"
  values: ["MUT", "000..100"]

- id: udt
  description: Disc Type Update
  format: "@UDT {type}\r"
  values: ["UHBD", "BDMV", "DVDV", "DVDA", "SACD", "CDDA", "DATA", "VCD2", "SVCD", "UNKW"]

- id: uat
  description: Audio Type Update
  format: "@UAT {type} {nn/nn} {lang} {ch}\r"
  type_codes: ["DD", "DP", "DT", "TS", "TH", "TM", "PC", "MP", "CD", "UN"]

- id: ust
  description: Subtitle Type Update
  format: "@UST {nn/nn} {lang}\r"

- id: uis
  description: Input Source Update
  format: "@UIS {n} {name}\r"

- id: u3d
  description: 3D Status Update
  format: "@U3D {state}\r"
  values: ["3D", "2D"]

- id: uar
  description: Aspect Ratio Status Update
  format: "@UAR {code}\r"
  values: ["16WW", "16AW", "16A4", "21M0", "21M1", "21M2", "21F0", "21F1", "21F2", "21C0", "21C1", "21C2"]

- id: utc
  description: Time Code Update (verbose 3)
  format: "@UTC {ttt} {ccc} {type} {hh:mm:ss}\r"
  type_codes: ["E", "R", "T", "X", "C", "K"]

- id: uvo
  description: Video Resolution Update (verbose 3)
  format: "@UVO {source} {output}\r"
  source_or_output: ["_480I60", "_480P60", "_576I50", "_576P50", "_720P60", "_720P50", "1080I60", "1080I50", "1080P60", "1080P50", "1080P24", "1080P23", "_UHD60_", "_UHD24_", "_UHD50_", "_OTHER_"]

Variables

# Settable numeric/string parameters are encoded inline in their action's command template.
# No standalone variables beyond action params.

Macros

# UNRESOLVED: source does not document multi-step macro sequences beyond the documented
# GOTO workflow (GOT + numerics + SEL).

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements.

Notes

  • Protocol text is identical for UDP-203 and UDP-205 except where noted: SIS parameters 3 (OPTICAL-IN), 4 (COAXIAL-IN), and 5 (USB-AUDIO-IN) are UDP-205 only.
  • RS-232 is DCE on a female DB-9; use a straight-through cable, NOT null-modem.
  • IP control is carried over TCP (port 23), NOT telnet — a telnet client will fragment keystrokes and break the protocol. Use "Packet Sender" for ad-hoc testing.
  • Player broadcasts a UDP discovery message every 10s to 239.255.255.251:7624 in the form: Notify: OPPO Player Start\nServer IP: <ip> Server Port: 23 Server Name: <name>
  • Verbose mode controls response format. Mode 0 (default) omits the echoed command code in responses for BDP-8x/9x/10x compatibility. Modes 2 and 3 add unsolicited status update messages.
  • Client must wait for a response before issuing the next command. No response after 10s => retransmit.
  • Max command length: 25 bytes including # start and CR/LF end. Max response length: 25 bytes including @ start and CR end.
  • # (0x23) must never appear in parameters. @ (0x40) must never appear in response parameters.
  • GO TO multi-key sequences: send GOT, then numeric keys, then SEL — player responds to each individually, then OK/ER on the final SEL.

Provenance

source_domains:
  - download.oppodigital.com
  - oppodigital.com
source_urls:
  - http://download.oppodigital.com/UDP203/OPPO_UDP-20X_RS-232_and_IP_Control_Protocol.pdf
  - http://download.oppodigital.com/BDP103/BDP-103_RS232_Protocol_v1.1.pdf
  - https://www.oppodigital.com/support/blu-ray-bdp-83/BDP83_RS232_Protocol_v2.1.pdf
retrieved_at: 2026-06-12T03:05:37.528Z
last_checked_at: 2026-06-12T19:27:41.177Z

Verification Summary

verdict: verified
checked_at: 2026-06-12T19:27:41.177Z
matched_actions: 118
action_count: 118
confidence: medium
summary: "All 118 spec actions matched verbatim in source; transport parameters (port 23, baud 9600) confirmed; complete bidirectional coverage. (4 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "UDP discovery broadcast address 239.255.255.251:7624 is documented but is a discovery helper, not a control channel."
- "source does not document multi-step macro sequences beyond the documented"
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
- "firmware version range compatibility above UDP20X-54-1127 not stated."

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0