ios - iOS 的 BLE 外设名称不正确

标签 ios objective-c iphone bluetooth bluetooth-lowenergy

我正在编写一个 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 NameManufacturer 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 设备上更改而无需重启。

建议:

  1. 扫描时使用服务UUID过滤(UUID必须是广告数据的一部分!我在上面的描述中省略了它)
  2. 使用通告/扫描响应数据进行进一步过滤
  3. 只要没有可用的确定性刷新,就不要考虑 peripheral.name

关于ios - iOS 的 BLE 外设名称不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25938274/

相关文章:

iphone - flv 通过 ffmpeg 和 x264 为 iphone/ipod 重新编码为 mp4(质量问题)

css - 我的网站会自动调整大小以适合我的 iPhone 屏幕,但图像不合适,我该如何解决?

iphone - 带有 UIPanGestureRecognizer 的多点触控

ios - 将 UIView 框架设置为等于来自不同 super View 的另一个 View 的框架

ios - 无法在 xcode 9 中为应用程序包 ID 创建 IXPlaceholder

ios - 在单击后退按钮时再次调用 searchBarTextDidBeginEditing 委托(delegate)方法

IOS Objective-C : Displaying Messages Dilemma

ios - UIView帧动画 "wiggle"

ios - 后退按钮未隐藏在导航 Controller 中

ios - UITapGestureRecognizer 根本不工作