iOS BLE外设名称更新后不正确的原因

笔者最近在做一个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.
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容