我正在编程的 STM32 MCU 固件上有一个蓝牙 blueNRG 设备。我希望用户能够更改设备在蓝牙上可见的名称。该应用程序将新名称发送到设备,设备存储它,并在下次启动蓝牙时通过更新设备名称特征来设置它:
aci_gatt_update_char_value(service_handle, dev_name_char_handle, 0,
strlen(name), (uint8_t *)name);
但是,在设置新名称并重新启动设备(和 iOS 应用程序)后,iOS 应用程序会继续以旧名称看到它:
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let deviceName = peripheral.name // sees it as old one
}
但是在应用程序与设备连接和断开连接后,在下一次连接尝试时,即使设备没有重新启动,它也会看到新名称。我用两部 iPhone 做了一个实验,得到了以下结果:
假设当前设备名称是 oldName。iPhone1 连接到设备并将其名称更改为 newName。重新启动设备,重新启动 iPhone1 应用程序。尝试从 iPhone1 连接 - 它将设备视为 oldName。iPhone2 也将设备视为 oldName。从 iPhone1 连接到设备,断开连接并尝试从 iPhone1 再次连接 - 现在它将其视为 newName。与此同时,iPhone2 继续将其视为 oldName,即使在 iPhone2 应用程序重新启动后也是如此。所以同时 iPhone1 将其视为 newName,而 iPhone2 将其视为 oldName。在 iPhone2 上完成连接和断开连接程序后,它也开始将其视为 newName。
有人可以解释一下这种高度神秘的行为吗?为什么只有在连接和断开设备后,每部 iPhone 上的设备名称才会更新?