iOS SDK的CoreBluetooth API没有提供强制刷新外设名称的方法。
目前,当BLEdevice中的设备名称发生变化时,在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。它还允许您的应用程序在后台状态下扫描外围设备。
如果您正在寻找一种在建立连接之前广播可用动态信息的方法,您可以使用公布或扫描响应数据。外设可以配置为广播称为本地名称 and 制造商特定数据。该数据可在 didDisconnectPeripheral 中找到:
- (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]);
}
本地名称是一个 NSString,因此在此字段中仅写入 BLE 设备上的可打印字符。制造商数据是 NSData,这可以包含任何字节值,因此您甚至可以在此处包含二进制数据。
根据您使用的 BLE 设备,本地名称和制造商特定数据的长度是有限的。
在我的 BLE 设备上,我可以发送 128 位服务 UUID 和带有广告数据的 8 字符本地名称。制造商特定数据进入扫描响应数据并且可以是 29 字节长。
使用高级/扫描响应数据的好处是,它可以在该 BLE 设备上更改而无需重新启动。
建议:
- 扫描时使用服务UUID进行过滤(UUID必须是广告数据的一部分!上面的描述中我省略了)
- 使用广告/扫描响应数据进行进一步过滤
- 只要没有可用的确定性刷新,就忘记外围设备名称