fix: use .withoutResponse for SaveConfig to prevent silent write drop
The beacon reboots instantly on SaveConfig (0x60). Using .withResponse meant CoreBluetooth expected a GATT ACK that never arrived, potentially causing the write to be silently dropped — leaving the config unsaved and the beacon LED still flashing after provisioning. Switching to .withoutResponse fires the bytes directly into the BLE radio buffer without requiring a round-trip ACK. The beacon firmware processes the save command from its buffer before rebooting. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
157ab6d008
commit
640bc32f92
1 changed files with 5 additions and 2 deletions
|
|
@ -174,9 +174,12 @@ final class DXSmartProvisioner: NSObject, BeaconProvisioner {
|
|||
await diagnosticLog?.log("write", "[\(index + 1)/\(commands.count)] \(name) (\(packet.count) bytes)")
|
||||
|
||||
// SaveConfig (last command) causes beacon MCU to reboot — it never sends an ACK.
|
||||
// Fire the BLE write and return immediately; the disconnect is expected.
|
||||
// Use .withoutResponse so CoreBluetooth fires the bytes immediately into the
|
||||
// BLE radio buffer without waiting for a GATT round-trip. With .withResponse,
|
||||
// the beacon reboots before the ACK arrives, and CoreBluetooth may silently
|
||||
// drop the write — leaving the config unsaved and the beacon still flashing.
|
||||
if name == "SaveConfig" {
|
||||
peripheral.writeValue(packet, for: writeChar, type: .withResponse)
|
||||
peripheral.writeValue(packet, for: writeChar, type: .withoutResponse)
|
||||
await diagnosticLog?.log("write", "✅ [\(index + 1)/\(commands.count)] SaveConfig sent — beacon will reboot")
|
||||
await diagnosticLog?.log("write", "✅ All commands written successfully")
|
||||
return
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue