Device: fēnix 8 Solar 47mm (006-B4532-00), firmware 23.39, Connect IQ 6.0.2 / API 6.0.3
SDK: 9.2.0
App type: watch-app
Summary
A connectable peripheral that advertises from a Resolvable Private Address never appears in onScanResults(). The exact same advertising payload sent from a public/static address is delivered normally. So the filtering seems to depend on the address type, not on the payload.
Peripheral
Panasonic LUMIX S5M2 camera. When switched on it advertises ADV_IND (legacy PDU, connectable, scannable) from a Resolvable Private Address. When switched off (Bluetooth standby) it advertises from its public address. The payload is the same in both cases except for one state byte:
02 01 06 | 09 FF 3A 00 00 xx xx xx xx xx | 11 07 1B C5 D5 A5 02 00 0D AC E6 11 14 32 20 C6 4A 05
Scan response: Complete Local Name.
What the app does
- Registers two profiles (
registerProfile, both returnSTATUS_SUCCESS): the advertised service054AC620-3214-11E6-AC0D-0002A5D5C51Band the GATT service the app uses afterwards. - Starts scanning (
SCAN_STATE_SCANNING). - Parses
ScanResult.getRawData()itself.getDeviceName()andgetManufacturerSpecificData()return null for every result on this device, but the raw data is complete.
Results
About 30 s scans, camera less than 1 m from the watch:
| Advertiser | Address type (per btmon) | Seen by the watch |
|---|---|---|
| Camera ON | Resolvable (e.g. 78:70:F5:xx:xx:xx) |
never (0 results across 6+ runs) |
| Camera in standby | Public (7C:B8:DA:xx:xx:xx) |
yes (about 30 results / 30 s) |
Linux PC (btmgmt add-adv) with identical payload, state byte 00 |
Public | yes (4–10 results) |
| Phones/speakers nearby (Apple, Sonos) | various | yes (hundreds) |
A Linux PC (BlueZ) and an Android phone see the camera in all states, and both can connect and use its GATT service without bonding, with MTU 23 and writes of at most 20 bytes. The watch-side flow is therefore expected to work if the scan result reaches the app.
Expected: advertisements from RPA peripherals are delivered to onScanResults() (maybe with the RPA as the address), so the app can pairDevice() with them.
Actual: they are silently dropped.
Questions
- Is this intended filtering (e.g. dropping unresolvable RPAs)? If so, is there a way to opt out?
- If it is a bug, is a fix planned for fēnix 8?
btmon logs and the test app source are available on request.