iOS SDK 的 CoreBluetooth API 没有提供强制刷新外设名称的方法。
目前在iOS中使用peripheral.name是不可行的,当BLEdevice中的设备名称发生变化时。
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