繁体   English   中英

外围名称不符合NameKey

[英]Peripheral name doesn't comply to NameKey

我有一个模拟心率监测器外围设备的应用程序(外围应用程序)。 我还有一个应用程序接收数据并呈现它(中央应用程序)。

中央应用程序决定根据其名称连接到发现的外围设备。

问题是两个应用程序都工作得很好,除了名称总是"iPhone"

广告是通过以下方式完成的:

- (IBAction)switchChanged:(id)sender
{
    if (self.advertisingSwitch.on) {
        NSDictionary *advData =
        @{CBAdvertisementDataLocalNameKey:@"Custom Name",
          CBAdvertisementDataServiceUUIDsKey:@[[CBUUID UUIDWithString:@"180D"]]};
       [self.peripheralManager startAdvertising:advData];
        NSLog(@"Advertising");
    }

    else {
        [self.peripheralManager stopAdvertising];
        [[self timerInterval] invalidate];
        NSLog(@"Stopped advertising");       
    }      
}

但是在中央那边

- (void) centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)aPeripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI

名称属性从未更改过。

有什么应该做的吗?

我在CBPeripheral.name观察到的是,设备实际上将名称设置为您使用CBAdvertisementDataLocalNameKey选择的名称。 但是,该名称不是永久性的。 如果断开主设备并重新连接,则名称通常已切换为“iPhone”。 如果外围设备由于错误而断开连接,我已经看到它以正确的外围设备名称重新连接,但是使用了新的UUID。

可能还有其他情况,名称也会切换到iPhone。

这似乎是iOS中的一个错误。 我在报告之前正在寻找确认。

CBAdvertisementDataLocalNameKey仅更改advertisementData中的kCBAdvDataLocalName。 当你使用nslog advertiseData时,你会看到一些这样的数据:

{
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = Custom Name;
    kCBAdvDataServiceUUIDs =     (
        "FB694B90-F49E-4597-8306-171BBA78F846"
    );
}

不幸的是,没有其他方法可以设置外围设备名称。 iPhone永远都有这个名字:iPhone。

广告可能在中央正确看到。 您可以通过检查NSLog晋的advertisementData 但是,如果您依赖peripheral.name属性,那么它将为空(如果您先连接)或包含“iPhone”字符串。

我记得它曾经发生在我身上,我认为这与Core Bluetooth处理缓存和服务发现的方式有关。 发生的事情是,起初我收到一个默认名称,如iPhone,iPad或什么都没有。 但是在发现服务或尝试建立连接之后,密钥神奇地改变了我在另一端设置的值。

此外,似乎只有在第一次之后,甚至在应用程序的启动和后续运行之间,Core Bluetooth都会尽力在广告阶段将这些值返回给您,即使是在第一次发现时也是如此,但这些值可能已经过时了值。

我目前的实现如下:

NSString * baconName = [[UIDevice currentDevice] name];
NSDictionary *advertisementData = @{CBAdvertisementDataServiceUUIDsKey:@[[CBUUIDUUIDWithString:BACON_SERVICE_UUID]],
CBAdvertisementDataLocalNameKey:baconName};

它对我有用,iPhone对培根很感兴趣,每个人都这样做;)。

因此,确保获取所需数据的最佳方法是创建另一个特征来传输您的标志,并不断发现要发现的外围设备的服务和特征,从而通过缓存或缓存来最大程度地减少对现有或缓存外围设备的发现。保留对它们的引用,CB应该为你做这个,并且他们尽最大努力,但只有你知道你的应用程序的业务逻辑以及对你来说重要的事情。 我过于偏执,并且始终保留对我感兴趣的已发现外围设备的引用。 就是我自己:它确保我拥有正确的信息,并最大程度地减少了对服务和特征的扫描和持续重新发现。

我希望这有帮助。

在大多数此类应用程序中,客户端应用程序应通过服务ID识别外围设备,而服务器(外围设备)应提供标准服务ID(如bluetooth.org中所定义)或专有服务ID /名称。

我也有同样的问题。 我和迈克一起,这看起来像是IOS中的错误。 如果首先使用TI多功能工具发现外围设备,则将在CBAdvertisementDataLocalNameKey中进行设置时发现您的设备。

到Dan1one:您应该使用[[UIDevice currentDevice]模型](而不是名称)来获取与默认字符串相同的字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM