2

I have an app that simulates heart rate monitor peripheral (The peripheral app). I also have an app that receives the data and present it (The central app).

The central app decided to connect to the discovered peripheral based on its name.

The problem is that both app work perfectly good, except that the name is always "iPhone".

The advertising is done this way:

- (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");       
    }      
}

But on the central side, inside

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

The name property never changed.

Is there anything that should be done?

4

6 回答 6

3

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

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

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

于 2014-07-02T16:20:12.200 回答
2

CBAdvertisementDataLocalNameKey 仅更改广告数据中的 kCBAdvDataLocalName。当你 nslog 广告数据时,你会看到一些类似这样的数据:

{
    kCBAdvDataIsConnectable = 1;
    kCBAdvDataLocalName = Custom Name;
    kCBAdvDataServiceUUIDs =     (
        "FB694B90-F49E-4597-8306-171BBA78F846"
    );
}
于 2015-07-19T08:43:28.437 回答
1

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

广告可能正确地出现在中央一侧。您可以通过NSLogging 进行检查advertisementData。但是,如果您依赖该peripheral.name属性,则该属性将为空(如果您先连接)或包含“iPhone”字符串。

于 2013-09-01T22:03:45.800 回答
1

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

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

我当前的实现如下所示:

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

它对我有用,iPhone 喜欢培根,每个人都喜欢;)。

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

我希望这有帮助。

于 2013-09-03T12:33:59.117 回答
0

In most such applications instead of identifying the peripheral by name, the client app should be identifying it by a service ID, and the server (peripheral), should be providing a either a standard service ID, as defined at bluetooth.org, or a proprietary service ID/name.

于 2013-12-19T20:19:21.067 回答
0

我也有同样的问题。我同意 Mike 的观点,这看起来真的像 IOS 中的错误。如果您首先使用 TI 多功能工具(例如)发现您的外围设备,那么您的设备将在您在 CBAdvertisementDataLocalNameKey 中设置时被发现。

对 Dan1one:您应该使用 [[UIDevice currentDevice] model],而不是名称,以使字符串与默认值相同。

于 2015-05-08T07:53:46.000 回答