外围名称不符合NameKey

时间:2013-09-01 13:44:09

标签: ios objective-c core-bluetooth cbperipheral

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

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

问题在于,除了名称始终为"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

name属性从未更改过。

有什么应该做的吗?

6 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

CBAdvertisementDataLocalNameKey仅更改advertisementData中的kCBAdvDataLocalName。 当您使用nslog advertisementData时,您将看到如下数据:

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

答案 2 :(得分:1)

不幸的是,没有其他方法可以设置外围设备名称。 iPhone将始终具有名称:iPhone。

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

答案 3 :(得分:1)

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

此外,它似乎只是第一次发生,之后,甚至在启动和后续运行的应用程序之间Core蓝牙将尽力在广告阶段将这些值返回给你,即使是在第一次发现时,但那些可能是好的过时的价值观。

我目前的实施情况如下:

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

它只对我有用,iPhone爱培根,每个人都这样做。)。

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

我希望这有帮助。

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

到Dan1one: 你应该使用[[UIDevice currentDevice] model]而不是name来获得默认的字符串。