Skip to content

GB-M0-R4-R2 — Read-only Buds SPP decoder + durable private capture #11

Description

@PNHD

Goal

Turn the physically proven SM-R510 SppNew RFCOMM stream into a safe, independently implemented, read-only GalaxyBridge decoder without sending any Buds commands.

Accepted baseline

Physical owner evidence for GB-M0-R4-R1B is accepted.

  • Branch: feature/gb-m0-feasibility
  • Baseline HEAD: 53bb959ba12fa44444ccd8b045e37ccd87ebd317
  • Target: Galaxy Buds2 Pro / SM-R510
  • RFCOMM UUID: 2e73a4ad-332d-41fc-90e2-16bef06523f2
  • SDP-resolved RFCOMM channel observed: 27
  • Connection established in ~1.6–1.9 s
  • Stable for ~60 s
  • 3363 bytes received
  • commands sent: 0
  • iPhone audio remained OK; no Watch audio takeover; audio remained OK after disconnect

Architecture candidate accepted for Buds M0: WATCH_RFCOMM_BRIDGE.

Offline evidence finding

The recoverable portion of the R1B raw stream contains multiple complete modern SPP frames. Independent offline parsing found complete frames with valid framing/CRC, including:

  • 0x61 EXTENDED_STATUS_UPDATED
  • 0xC2 SPATIAL_AUDIO_DATA
  • 0x63 VERSION_INFO
  • 0x41 METERING_REPORT
  • 0x47 USAGE_REPORT_V2
  • diagnostic/debug families

The first 0x61 frame is sufficient to justify a minimum read-only status decoder candidate. Do not add a status request unless unsolicited status proves insufficient.

Privacy gate

The captured stream also contains a serial-number-bearing message. Raw captures therefore contain private device identifiers.

Requirements:

  • raw capture stays local/private by default
  • do not commit raw capture or serial-bearing payloads
  • do not upload raw private capture to public GitHub
  • shared/exported summaries must redact serial/device identifiers

Implementation

  1. Implement an independent streaming decoder for modern SPP frames:
    • SOM 0xFD
    • 2-byte little-endian header
    • size bounds
    • request/response + fragment metadata
    • message ID
    • payload
    • CRC16-CCITT validation
    • EOM 0xDD
    • arbitrary RFCOMM chunk boundaries / multiple frames per read
    • malformed/truncated frame recovery with strict bounds
  2. Add frame summaries: timestamp/offset, ID, size, CRC validity, redacted type name when known.
  3. Decode minimum 0x61 EXTENDED_STATUS_UPDATED read-only fields needed for M0, beginning with revision, L/R battery, placement/coupling and noise-control mode. Clearly label uncertain/unsupported fields.
  4. Add durable binary capture to app-private/local test storage so evidence is not truncated by Logcat. Bound each M0 session (e.g. 64 KiB) and never auto-upload it.
  5. Produce a redacted share/export summary that never emits serial-bearing payloads.
  6. Use synthetic/sanitized test vectors in repository tests. Do not commit the owner's raw capture.

Hard safety constraints

  • RFCOMM writes remain exactly zero.
  • No status query yet.
  • No ANC/control writes.
  • No FOTA/reset/debug/unknown writes.
  • No alternate UUID probing needed in this task.
  • No GPL/AGPL implementation copying; external projects are protocol/reference evidence only unless source is permissively licensed and attribution is preserved.

Physical validation

On real Watch6 + SM-R510 with iPhone audio active:

  • connect exactly once to SppNew
  • capture <= 90 s read-only
  • decoder reports frames with CRC statistics
  • 0x61 status appears and is decoded if received
  • iPhone audio remains uninterrupted
  • commands sent remains 0

Evidence bundle

Create a PM ZIP after the run containing redacted summary, parser/test output, screenshots, commit patch/diff, build results and SHA256 manifest. Do not include the private raw serial-bearing binary by default; report its local path + hash only.

Acceptance

Maximum initial status: PARTIAL — READ_ONLY_DECODE_VERIFIED until PM reviews parser implementation and physical evidence.

Keep PR #3 draft/unmerged. Do not start Buds controls or head tracking.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions