-
Notifications
You must be signed in to change notification settings - Fork 192
Description
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:
- Connect each GoPro to a local WiFi router via BLE WiFi provisioning (STA mode)
- Start the webcam/streaming service on each camera via the HTTP API
- 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:
ResponseStartScanning(Action ID 0x82) on GP-0092 — acknowledging the scanNotifStartScanning(Action ID 0x0B) on GP-0092 — with scanning state updates- Final notification with
SCANNING_SUCCESS(state=5) and ascan_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)andwrite_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
- Is WiFi STA provisioning via GP-0091/GP-0092 supported on Hero 10 firmware 1.62.70?
- Should GP-0082/GP-0083 (Camera Management Service) be used instead for this firmware version? If so, what is the expected request/response format?
- The response
01:02:3a:03on GP-0083 — is this an error code, and if so, what does it mean? - 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).