scanForPeripheralsWithServices:options:指定服务时无法连接

时间:2014-04-06 02:31:50

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

使用scanForPeripheralsWithServices:选项时,我可以在使用时发现服务

// Scanning with nil services will return all devices.
NSLog(@"Looking for any service.");
[self.centralManager scanForPeripheralsWithServices:nil options:nil];

但是,当使用通过以下代码从蓝牙设备获得的服务标识符预先指定服务时,我无法发现该设备。

#define DEVICE_INFO_SERVICE_UUID @"180a"
NSArray *services = [NSArray arrayWithObjects:[CBUUID UUIDWithString:DEVICE_INFO_SERVICE_UUID], nil];

[self.centralManager scanForPeripheralsWithServices:services options:nil];

怎么了?

2 个答案:

答案 0 :(得分:6)

[ - CBCentralManager scanForPeripheralsWithServices:options:]仅返回主动宣传他们支持某项服务的外围设备。

如果外围设备没有公布您要查找的服务,则需要连接到该服务,然后发现您想要访问的服务。

由于广告包中的空间(扫描时处理的)空间有限,通常只会广告主要服务。设备信息服务通常在大多数BLE外围设备上可用,因此通常不会公布。但是,一旦使用[-CBPeripheral discoverServices:]连接到外设,您将看到此服务。


作为旁注,只是一个小的Objective-C提醒:

您可以使用初始化程序语法来减少代码的详细程度:

[self.centralManager 
 scanForPeripheralsWithServices:@[[CBUUID UUIDWithString:DEVICE_INFO_SERVICE_UUID]] 
                        options:nil];

答案 1 :(得分:0)

此代码适用于我(扫描带有服务的设备@" feff")

#define MY_SERVICE_UUID_STR      @"feff"
CBUUID *myUUID = [CBUUID UUIDWithString:MY_SERVICE_UUID_STR];
[self.CM scanForPeripheralsWithServices:[NSArray arrayWithObject:myUUID] options:nil];

在此代码中,我不会以 nil 结尾,并且列表中只有1项服务。

您是否正在检查中央管理器是否已启动?

if (self->CM.state  != CBCentralManagerStatePoweredOn)
{
    printf("CoreBluetooth not correctly initialized !\n");
    printf("State = %d (%s)\r\n",
        self->CM.state,[self centralManagerStateToString:self.CM.state]);
    return -1;
}