iOS BLE外设名称更新后不正确的原因
2018-11-28 本文已影响0人
淇则有岸_1fb5
笔者最近在做一个BLE相关的项目开发过程中遇到这样一个问题,当一个外设(peripheral)已经连接与ipad连接成功后,如果修改外设的名称,ipad扫描外设后获得的仍然是之前的名称,新名称不知所踪。检查代码后,我发现我的代码并没有问题,打印出个的perpheral.name依然是以前的值,
解决方法
APP当作蓝牙中心,连接其他的蓝牙外设时,首次连接成功过后,iOS系统内会将改外设缓存记录下来,下次重新搜索时,搜索到的蓝牙外设时,直接打印peripheral.name,得到的是之前缓存中的蓝牙名称,如果此期间蓝牙外设有更新蓝牙名称的话,这个参数并不会改变,所以需要换一种方式获取蓝牙外设的名称,广播数据包内就有一个字段kCBAdvDataLocalName,可以从中获取
- OC
-(void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary<NSString *,id> *)advertisementData RSSI:(NSNumber *)RSSI{
NSString *localName = [advertisementData objectForKey:@"kCBAdvDataLocalName"];
//you to do
}
- Swift
func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
let localName = advertisementData["kCBAdvDataLocalName"]
//you to do
}
Note
- iOS SDK 不提供强制刷新外围设备名称的方法,如果希望获取一以标识符来做设备绑定或断线重连时,最好用apple 提供的方法获取UUID进行绑定,或者和硬件工程师合作把设备MAC地址放在广播数据中发出来
- 这里有两个Name需要注意,一个是GAP name,一个是一个 advertising name,设备没有连接外设时,获取的perpheral.name会是advertising name,然后当设备第一次连接成功外设后,GAP name就会被缓存下来,以后在连接时,获取的也都是GAP Name, 这样就造成了修改名称后苹果设备不更新的问题,指的一提的是,苹果并不要求着两个名字相同, 所以除了上文提到的直接获取广告名字外,也可以让硬件工程师直接修改GAP name.