使用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];
怎么了?
答案 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;
}