我正在编写一个 iOS 应用来与 BLE 设备通信。设备可以在连接之间更改名称(不是在 BLE 连接期间),但 iOS 拒绝更改设备名称。
例如:我可以连接到名称为 SadName 的设备。我断开连接,关闭应用程序等,然后将设备名称更改为 HappyName。但是,当我扫描设备时,iOS 仍将外围设备名称显示为 SadName。
如果我调试应用程序并查看:
(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
peripheral.name 的值是 SadName 所以我不认为这是我在代码中错误解释的东西。我应该提一下,当我扫描设备时,我的代码是:
[self.CM scanForPeripheralsWithServices:nil options:0]; // Start scanning
我猜这仅仅是因为设备 UUID 相同,所以 iOS 将其从缓存设备列表中提取出来,但我想覆盖它。
想法?抱歉,我是 iOS 新手。 干杯 - 施密特鲍尔
最佳答案
iOS SDK 的CoreBluetooth API 没有提供强制刷新外设名称的方法。
目前当BLE设备中的设备名称发生变化时,在iOS中使用peripheral.name是不可行的。
Apple 建议通过指定您传递给 scanForPeripheralsWithServices 的 CBUUID 对象列表(包含一个或多个服务 UUID)来扫描特定设备:
NSArray *services = @[[CBUUID UUIDWithString: @"2456e1b9-26e2-8f83-e744-f34f01e9d701"] ]; // change to your service UUID!
NSDictionary *dictionary = [NSDictionary dictionaryWithObject:[NSNumber numberWithInt:1] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];
[self.manager scanForPeripheralsWithServices:services options:dictionary];
这样可以减少didDiscoverPeripheral的调用次数。不要只将 nil 传递给 scanForPeripheralsWithServices。它还允许您的应用在后台状态下扫描外围设备。
如果您正在寻找一种方法来广播在建立连接之前可用的动态信息,您可以使用通告或扫描响应数据。外围设备可以配置为广播名为Local Name 和Manufacturer Specific Data 的条目。此数据在 didDiscoverPeripheral 中可用:
- (void)centralManager: (CBCentralManager *)central
didDiscoverPeripheral: (CBPeripheral *)peripheral
advertisementData: (NSDictionary *)advertisementData
RSSI: (NSNumber *)RSSI {
NSString *localName = [advertisementData objectForKey:CBAdvertisementDataLocalNameKey];
NSData *manufacturerData = [advertisementData objectForKey:CBAdvertisementDataManufacturerDataKey];
NSLog(@"Local: name: %@", localName);
NSLog(@"Manufact. Data: %@", [manufacturerData description]);
}
Local Name 是一个 NSString,因此在此字段中只写入 BLE 设备上的可打印字符。 Manufacturer Data 是一个 NSData,它可以包含任何字节值,因此您甚至可以在此处使用二进制数据。
根据您使用的 BLE 设备,本地名称和制造商特定数据的长度是有限的。
在我的 BLE 设备上,我可以发送 128 位服务 UUID 和一个带有广告数据的 8 字符本地名称。制造商特定数据进入扫描响应数据,长度可以是 29 个字节。
使用 Adv./Scan Response Data 的好处是,它可以在此 BLE 设备上更改而无需重启。
建议:
- 扫描时使用服务UUID过滤(UUID必须是广告数据的一部分!我在上面的描述中省略了它)
- 使用通告/扫描响应数据进行进一步过滤
- 只要没有可用的确定性刷新,就不要考虑 peripheral.name
关于ios - iOS 的 BLE 外设名称不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938274/