Skip to content

Theseus BLE discover and confirm ​

Approved: 17 September 2026 (#156)

On the map picker screen, Theseus hears nearby WTK_ advertisements, matches them to snapshot beacons by uname, and a tap writes pixel x/y through T5 field APIs (POST /theseus/beacons/:id/confirm).

This is phone BLE, not Gateway ID / Gatify, not Hansel printed-MAC deploy, and not route authoring.

No operator-actions row. OA-AT-hansel-mac-qr stays later.

Scan ​

  • flutter_blue_plus. Thin scanner in theseus/lib/ble/ (not a shared package, not an Ariadne fork).
  • Keep advName starting WTK_. Skip ads with serviceUuids (battery).
  • Discover every heard WTK_*. Do not require Ariadne’s active-uname allowlist.
  • If BLE is unsupported, the adapter is off, or permission is denied, show a short in-app status. Do not copy Keryx permission-recovery.

Match and confirm ​

  • Join heard name to NavBeacon.uname on the current floor.
  • Matched rows are confirmable. Unmatched names stay in the list and cannot POST (no beacon create).
  • Operator selects a matched row, then taps the map. No confirm without a selection.
  • The InteractiveViewer child is the PNG’s intrinsic pixel size, so tap dx/dy are floor x/y.
  • Optional mac only when remoteId normalizes to 12 hex. iOS UUIDs are omitted. Auth is Bearer th_… only.

Non-goals ​

Flame, Gatify, Hansel MAC/holder QR wizard, trilateration, fingerprint survey, pathfind, end-user maps, FCM, staff ntfy, safecall-ops, hospital rasters / mar.json. Graph drawing is route authoring.