Struggling with BLE Reconnection on Quest 2 — UI and Auto-Reconnect Both Failing
Hey everyone,
(I'm sorry in advance for the AI wording, I just used it to summarize the Meta Support case.)
I've hit a wall with a BLE GATT connection issue on my Meta Quest 2 project and could really use some community guidance.
Summary / TL;DR:
My bonded BLE peripheral won't reconnect to the Quest 2 after a disconnection. The "Connect" button in the Bluetooth UI has never worked for this, and now the system's automatic background reconnection, which was my last resort, has also stopped working. This means the user has to "Forget Device" and re-pair every single time they want to use it, which is a deal-breaker for my app. Meta Support has already confirmed the UI button issue is a "known limitation."
Detailed Problem
I'm working with a standard BLE peripheral using the Heart Rate service. It pairs, bonds, and connects perfectly the first time, and data streams without a hitch. The problem is, once it disconnects, I can't get it to reconnect without a full re-pairing.
The Original Issue (The "Known Limitation")
The connect/disconnect buttons in the Quest's Bluetooth settings don't seem to manage the GATT connection state at all.
- "Disconnect" Button: Pressing this while the device is connected and streaming does nothing. The connection stays active.
- "Connect" Button: After the peripheral disconnects (e.g., goes out of range) and starts advertising again, pressing "Connect" in the UI just gives a "Couldn't connect" error.
The New, Blocking Issue
Previously, I could at least rely on the Quest OS to automatically reconnect in the background, even if it took 10+ minutes. This auto-reconnect has completely stopped working. Now, once the device is disconnected, it stays disconnected. The only way to get it working again is to manually unpair and re-pair it.
Technical Details & What I've Tried
- Device: Meta Quest 2, latest public firmware.
- GATT Profile: Standard Heart Rate Service.
- Advertising: Using legacy connectable advertising (ADV_IND).
- Security: Requires bonding. I'm using an encrypted CCCD for notifications.
- Privacy: The peripheral uses a Resolvable Private Address (RPA). I assume the Quest stores the IRK correctly since auto-reconnection used to work.
I've tried:
- Forgetting the device and re-pairing (the only temporary fix).
- Toggling Bluetooth on the Quest.
- Rebooting both the Quest and the peripheral.
My Core Questions
- Recommended Reconnection Flow? Since both the UI and auto-reconnect have failed me, what is the correct way to handle BLE reconnections on the Quest 2? Is there a standard workflow I'm missing?
- Programmatic Control? Is there any way for my native app to programmatically trigger a connection to a bonded device (e.g., something like Android's BluetoothDevice.connectGatt())? Can my app take control of the connection and bypass the buggy system UI?
- Advertising Strategy? Are there specific advertising parameters (intervals, flags, etc.) that make a peripheral more "reconnect-friendly" for the Quest? Could my use of legacy advertising with RPA be part of the problem?
- Possible OS Regression? Has anyone else noticed automatic BLE reconnections stop working recently? I'm wondering if this could be a bug in a recent Quest OS update.
I'm completely stuck, as my project depends on this connection being reliable. Any advice, workarounds, or shared experiences would be a huge help.
Thanks a lot.