Skip to content

BLE WiFi Provisioning (STA mode) fails on Hero 10 (fw 1.62.70) — No response on GP-0091/GP-0092 #902

@high-solutions

Description

@high-solutions

BLE WiFi Provisioning (STA mode) fails on Hero 10 (fw 1.62.70) — No response on GP-0091/GP-0092

TL;DR

  • Attempting to follow the official Tutorial 6 (RequestStartScan → write 02:02:02) on a GoPro Hero 10 (fw 1.62.70) results in no notification on GP-0092 (no scan response), despite the write succeeding and BLE otherwise working.
  • GP-0082/GP-0083 (Camera Management Service) sometimes responds with an odd payload (01:02:3a:03), but the response format appears incorrect/unsupported.
  • QR-code workaround only works when also configuring RTMP (requires internet) and is therefore not usable for a pure local setup.
  • Goal: programmatically provision 3× Hero 10 cameras onto the same local (no-internet) WiFi network and stream all three to one OBS machine.

Summary

Following the official Open GoPro Tutorial 6 (Connect WiFi STA mode) exactly, the GoPro Hero 10 with firmware H21.01.01.62.70 never responds to RequestStartScan on the documented Network Management characteristics GP-0091/GP-0092. The camera accepts the BLE write without error, but no notification is ever received on GP-0092.

Goal

We are building a local multi-camera streaming setup: 3 GoPro Hero 10 cameras connected to the same local WiFi network (no internet), each streaming video to a single machine (for use in OBS or or qlab). The intended flow is:

  1. Connect each GoPro to a local WiFi router via BLE WiFi provisioning (STA mode)
  2. Start the webcam/streaming service on each camera via the HTTP API
  3. Receive 3 simultaneous video streams on one computer

We cannot use the GoPro's own AP mode because each camera creates its own network — we need all 3 on the same network.
Also the distance between the cameras and the mac is too far for BLE, so we need to provision WiFi via BLE but then operate over WiFi.

Hardware & Software

  • Camera: GoPro Hero 10 Black (×3, identical)
  • Firmware: H21.01.01.62.70 (latest available)
  • Serial prefix: C3461326587501
  • Client OS: macOS (Apple Silicon M3)
  • BLE library: bleak 2.1.1
  • Python: 3.11.15
  • WiFi router: Local network with DHCP, no internet connection

BLE Services confirmed present

The camera correctly advertises all expected services and characteristics:

Service: 0000fea6-0000-1000-8000-00805f9b34fb (GoPro Inc.)
  b5f90072 [write]          ← GP-0072 Command Write     ✅ works
  b5f90073 [notify]         ← GP-0073 Command Notify    ✅ works
  b5f90074 [write]          ← GP-0074 Settings Write    ✅ works
  b5f90075 [notify]         ← GP-0075 Settings Notify   ✅ works
  b5f90076 [write]          ← GP-0076 Query Write
  b5f90077 [notify]         ← GP-0077 Query Notify

Service: b5f90090-aa8d-11e3-9046-0002a5d5c51b
  b5f90091 [write]          ← GP-0091 Network Mgmt Write   ❌ no response
  b5f90092 [notify]         ← GP-0092 Network Mgmt Notify  ❌ never fires

Service: b5f90080-aa8d-11e3-9046-0002a5d5c51b
  b5f90081 [notify]
  b5f90082 [write]          ← responds to protobuf writes (see below)
  b5f90083 [notify]         ← sends responses (see below)
  b5f90084 [notify]

Steps to reproduce

1. BLE connect + subscribe notifications ✅

Connect via BLE, subscribe to notifications on all notifiable characteristics including GP-0092. Wait 2 seconds for setup to complete.

2. Verify BLE communication works ✅

Send Set Shutter Off command to GP-0072:

Write GP-0072: 03:01:01:00
Response GP-0073: 02:01:02     ← success

BLE communication is fully functional.

3. Send RequestStartScan to GP-0091 ❌

Following Tutorial 6 exactly:

# Build RequestStartScan per tutorial:
# Feature ID = 0x02, Action ID = 0x02, empty protobuf body
# Insert length byte: len([0x02, 0x02]) = 2
request = bytes([0x02, 0x02, 0x02])  # [length=2][Feature=0x02][Action=0x02]

await client.write_gatt_char("b5f90091-...", request, response=True)
# Write succeeds (no BLE error), but...

Result: No notification ever arrives on GP-0092. Waited 60+ seconds. Tested multiple times.

4. Additional tests performed

Test UUID Bytes written Response
RequestStartScan GP-0091 02:02:02 ❌ No response on GP-0092
Same, write-without-response GP-0091 02:02:02 ❌ No response
Same, after WiFi AP OFF GP-0091 02:02:02 ❌ No response
Same, after WiFi AP ON GP-0091 02:02:02 ❌ No response
Same bytes to GP-0082 GP-0082 02:02:02 ✅ GP-0083: 01:02:3a:03
Without BLE header to GP-0082 GP-0082 02:02 ✅ GP-0083: 01:02:3a:03
Same bytes to GP-0072 GP-0072 02:02:02 ✅ GP-0073: 02:02:02

5. GP-0082/GP-0083 responds but with unknown format

When writing 02:02:02 to GP-0082 (Camera Management Service), we get a response 01:02:3a:03 on GP-0083. However:

  • This does not match the documented protobuf response format ([Feature=0x02][ActionResponse=0x82][body])
  • The same 4-byte response is returned regardless of whether we send 2 or 3 bytes
  • Interpreting as protobuf: 0x3A = field 7 wire_type 2 (length-delimited), 0x03 = length 3, but no following data — appears to be an error or unsupported-command response

What we expected

Per the official tutorial, writing 02:02:02 to GP-0091 should produce:

  1. ResponseStartScanning (Action ID 0x82) on GP-0092 — acknowledging the scan
  2. NotifStartScanning (Action ID 0x0B) on GP-0092 — with scanning state updates
  3. Final notification with SCANNING_SUCCESS (state=5) and a scan_id

None of these ever arrive.

What we verified

  • ✅ BLE connection is stable (commands on GP-0072/GP-0073 work perfectly)
  • ✅ Notifications are correctly registered on GP-0092 (confirmed via bleak)
  • ✅ The packet format matches the tutorial exactly: [length=2][Feature=0x02][Action=0x02]
  • ✅ Camera is powered on, not recording, not in USB mode
  • ✅ Tested with both write_gatt_char(response=True) and write_gatt_char(response=False)
  • ✅ Tested after disabling WiFi AP via Setting 0x3F
  • ✅ Tested after enabling WiFi AP via Setting 0x3F
  • ✅ Camera was freshly rebooted between test sessions
  • ✅ Get Hardware Info (0x3C) returns successfully, confirming camera is BLE-ready

Questions

  1. Is WiFi STA provisioning via GP-0091/GP-0092 supported on Hero 10 firmware 1.62.70?
  2. Should GP-0082/GP-0083 (Camera Management Service) be used instead for this firmware version? If so, what is the expected request/response format?
  3. The response 01:02:3a:03 on GP-0083 — is this an error code, and if so, what does it mean?
  4. Is there any other way to programmatically connect a Hero 10 to an external WiFi network (STA mode) without user interaction?

Workaround attempted (not viable)

We tried using GoPro Labs QR codes to configure the WiFi connection. However:

  • The QR code WiFi connection only works as part of the RTMP streaming configuration — the camera connects to WiFi solely to start an RTMP stream. You cannot use the QR code to just join a WiFi network without also configuring RTMP.
  • The WiFi connection is dropped as soon as the RTMP stream ends — so even if you get it connected, it disconnects itself when the stream stops or fails.
  • RTMP on the GoPro requires an internet connection — the camera apparently validates the RTMP server via DNS/internet, so it fails on our local-only network even though we have a perfectly functional local RTMP server running. This seems like an unnecessary limitation.

This workaround is therefore not usable for our use case (local network, no internet, long-running webcam streams to OBS).

Use case context

If anyone has an alternative approach to achieve this, we'd appreciate suggestions:

  • Goal: 3× GoPro Hero 10 → same local WiFi network (no internet) → stream video to 1 Mac running OBS
  • Constraints: No internet available at the location. All cameras must be on the same network. Streams must run for extended periods (hours).

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtriageNeeds to be reviewed and assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions