【问题标题】:iOS Corebluetooth services never discovered, but are visible in advertisingData of delegate methodiOS Corebluetooth 服务从未被发现,但在代理方法的广告数据中可见
【发布时间】:2013-08-25 15:42:30
【问题描述】:

我正在使用带有警报通知服务的 iOS 6 Corebluetooth。

尽管代理方法中的 adsData 看起来正确,但由于某种原因服务没有显示在外围设备中。

这是委托方法:

 (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    bool ourGuy = NO;
    NSLog(@"DATA: %@", advertisementData);

    NSArray *keys = [advertisementData allKeys];
    for (int i = 0; i < [keys count]; ++i) {
        id key = [keys objectAtIndex: i];
        NSString *keyName = (NSString *) key;
        NSObject *value = [advertisementData objectForKey: key];
        if ([value isKindOfClass: [NSArray class]]) {

            printf("   key: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding]);

            if ([keyName isEqualToString: @"kCBAdvDataServiceUUIDs"] ){

                NSArray *values = (NSArray *) value;
                for (int j = 0; j < [values count]; ++j) {
                    if ([[values objectAtIndex: j] isKindOfClass: [CBUUID class]]) {
                        CBUUID *uuid = [values objectAtIndex: j];                        

                        NSString *uuidString = [uuid representativeString];

                        NSLog(@"FOUND SERVICE UUID %@", uuidString);

                        if ([uuidString isEqualToString:kalertNotificationServiceUUIDString]){

                            NSLog(@"Connecting");

                            if (![foundPeripherals containsObject:peripheral]) {

                                ourGuy = YES;                                   
                            }                               
                        }

                    } else {
                        const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding];
                        printf("      value(%d): %s\n", j, valueString);
                    }
                }

            }
        } else {
            const char *valueString = [[value description] cStringUsingEncoding: NSUTF8StringEncoding];
            printf("   key: %s, value: %s\n", [keyName cStringUsingEncoding: NSUTF8StringEncoding], valueString);
        }
    }

    if (ourGuy){
        [foundPeripherals addObject:peripheral];
                peripheral.delegate = self;
        [centralManager connectPeripheral:peripheral options:nil];
    }


}

日志如下所示:

2013-08-25 23:30:17.417 myControl[688:907] DATA: {
    kCBAdvDataLocalName = myTEST;
    kCBAdvDataServiceUUIDs =     (
        "Unknown (<1811>)",
        "Unknown (<180f>)"
    );
}
   key: kCBAdvDataServiceUUIDs


2013-08-25 23:30:17.419 myControl[688:907] FOUND SERVICE UUID 1811
2013-08-25 23:30:17.421 myControl[688:907] Connecting
2013-08-25 23:30:17.422 myControl[688:907] FOUND SERVICE UUID 180f
   key: kCBAdvDataLocalName, value: myTEST
   key: kCBAdvDataTxPowerLevel, value: -8

服务发现的委托方法:

- (void) peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error{

    for (int i=0; i < peripheral.services.count; i++) {
        CBService *s = [peripheral.services objectAtIndex:i];
        NSLog(@" UUUID %@", [s.UUID representativeString]);
        //        [peripheral discoverCharacteristics:nil forService:s];
    }
}

该方法的日志:

2013-08-25 23:30:18.266 myControl[688:907]  UUUID 1800
2013-08-25 23:30:18.269 myControl[688:907]  UUUID 1801

这是 BLE GATT 和 GAP 的两个 UUID。在广告数据中看到的外围设备服务永远不会出现。我做错了什么?

【问题讨论】:

    标签: ios objective-c core-bluetooth bluetooth-lowenergy


    【解决方案1】:

    关于您的代码:您是否实现了peripheral:didDiscoverServices: 回调,您如何处理它?在最简单的情况下,它应该是这样的:

    - (void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error {
      /* Find all characteristics for all discovered services */
      for (CBService *service in peripheral.services)
      {
        [peripheral discoverCharacteristics:nil forService:service];
      }
    }
    

    此外,广告数据中的内容和提供的内容是两个不同的故事。外围设备可以宣传任何服务,即使是那些没有提供的服务我可以像这样在 iOS 中轻松启动广告:

    NSDictionary *data = @{CBAdvertisementDataServiceUUIDsKey:
            @[[CBUUID UUIDWithString:@"180D"], [CBUUID UUIDWithString:@"FFBC"]]};
    [peripheralManager startAdvertising:data];
    

    不添加任何这些服务。

    我建议您先尝试使用可运行的应用程序(例如 BLEUtility 或 BLExplr)来发现外围设备,然后查看外围设备是否真的提供这些服务。

    【讨论】:

    • 谢谢,实际上我正在实现外围设备:didDiscoverServices:我复制粘贴了错误的代码。我将编辑问题。我会尝试 BLEUtility 和 BLExplr 并会回来。顺便说一下,外围设备是非 iOS 设备(如果重要的话)。
    • 让我知道测试结果,并请添加您在外围设备上调用discoverServices: 方法的代码。
    • 将代码添加到问题中(而不是 didDiscoverCharaceristisc:) 并检查了 BLEUtility。该设备确实宣传一种服务,但只提供最基本的服务。我猜想解决这个问题需要深入研究设备 C 代码?
    • 是的,不幸的是,这意味着您处于问题的阴暗面。似乎iOS代码正在做它应该做的事情。但至少现在你有一些工具可以在尝试调试代码之前进行测试。
    • @allprog 你知道如何在 AdvertisementData NSDictionary 中添加更多信息吗?
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2012-11-06
    • 1970-01-01
    • 2014-01-22
    相关资源
    最近更新 更多