51

我目前正在创建一个可以使用蓝牙设备的 iPhone 应用程序(Xcode 4.3.1,IOS 5)!此应用程序的主要目标是室内导航(建筑物内的 GPS 并不十分准确)。

我在这里看到的唯一解决方案(将我的应用程序保留在 AppStore 上)是尝试扫描可用的蓝牙设备!

我尝试使用 CoreBluetooth 框架,但我没有得到可用设备的列表!也许我没有正确使用这些功能

#import <UIKit/UIKit.h>
#import <CoreBluetooth/CoreBluetooth.h>

@interface AboutBhyperView : UIViewController <CBPeripheralDelegate, CBCentralManagerDelegate>
{
    CBCentralManager *mgr;
}
@property (readwrite, nonatomic) CBCentralManager *mgr;
@end



- (void)viewDidLoad
{
    [super viewDidLoad];

    mgr = [[CBCentralManager alloc] initWithDelegate:self queue:nil];
}


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


    NSLog([NSString stringWithFormat:@"%@",[advertisementData description]]);
}

-(void)centralManager:(CBCentralManager *)central didRetrievePeripherals:(NSArray *)peripherals{
    NSLog(@"This is it!");
}


- (void)centralManagerDidUpdateState:(CBCentralManager *)central{ 
    NSString *messtoshow;

    switch (central.state) {
        case CBCentralManagerStateUnknown:
        {
            messtoshow=[NSString stringWithFormat:@"State unknown, update imminent."];
            break;
        }
        case CBCentralManagerStateResetting:
        {
            messtoshow=[NSString stringWithFormat:@"The connection with the system service was momentarily lost, update imminent."];
            break;
        }
        case CBCentralManagerStateUnsupported:
        {
            messtoshow=[NSString stringWithFormat:@"The platform doesn't support Bluetooth Low Energy"];
            break;
        }
        case CBCentralManagerStateUnauthorized:
        {
            messtoshow=[NSString stringWithFormat:@"The app is not authorized to use Bluetooth Low Energy"];
            break;
        }
        case CBCentralManagerStatePoweredOff:
        {
            messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered off."];
            break;
        }
        case CBCentralManagerStatePoweredOn:
        {
            messtoshow=[NSString stringWithFormat:@"Bluetooth is currently powered on and available to use."];
            [mgr scanForPeripheralsWithServices:nil options:nil];
            //[mgr retrieveConnectedPeripherals];

//--- it works, I Do get in this area!

            break;
        }   

    }
    NSLog(messtoshow); 
} 

我不确定这条线,如何传递正确的参数?

[mgr scanForPeripheralsWithServices:nil options:nil];

我看了看苹果参考..我还是不明白那个 CBUUID 是什么???每个设备都有一些蓝牙ID?我在哪里可以找到它?

- (void)scanForPeripheralsWithServices:(NSArray *)serviceUUIDs options:(NSDictionary *)options;

参数 serviceUUIDs - 应用程序感兴趣的 CBUUID 数组。 options - 自定义扫描的字典,请参阅 CBCentralManagerScanOptionAllowDuplicatesKey。

有没有其他方法可以在 IOS 上使用蓝牙?我的意思是,不使用 BLE 4.0 的旧框架!

任何意见,将不胜感激!

谢谢!

4

5 回答 5

23

本指南对蓝牙 3.0 很有希望。请记住,CoreBluetooth 框架仅适用于低功耗蓝牙 (4.0)。在bluetooth.com 的 dev-pages中,您可以看到一些全局定义服务的示例,正​​如 Guan Yang 所提到的,您可以看到心率服务是 0x180D。单位的 UUID 由制造商定义。

这是一个代码片段,可能会对您有所帮助。

// Initialize a private variable with the heart rate service UUID    
CBUUID *heartRate = [CBUUID UUIDWithString:@"180D"];

// Create a dictionary for passing down to the scan with service method
NSDictionary *scanOptions = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO] forKey:CBCentralManagerScanOptionAllowDuplicatesKey];

// Tell the central manager (cm) to scan for the heart rate service
[cm scanForPeripheralsWithServices:[NSArray arrayWithObject:heartRate] options:scanOptions]
于 2012-06-20T22:04:56.923 回答
15

在蓝牙中,有“服务”。一个设备发布1..N服务,每个服务都有1..M特性。每个服务都有一个唯一标识符,称为UUID

例如,提供“心率”服务的心率蓝牙传感器发布UUID 为 0x180D的服务。

(更多服务在这里

因此,当您执行搜索时,您必须提供一个UUID作为条件,告诉您要搜索哪个服务。

于 2012-10-11T10:47:44.620 回答
10

你应该看看其中一个例子。这是相关的行:

[manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"180D"]] options:nil];

(我知道这是一个 Mac OS X 示例,但 iOS CoreBluetooth API 非常相似。)

CBUUID 标识您感兴趣的服务,而不是设备。标准服务有一个 16 位 UUID,在这种情况下,0x180d 用于心率监测器,或者 0x180a 用于设备信息,而专有服务有一个 128 位 UUID(16 字节)。

大多数设备都实现了设备信息服务,所以如果您只是在寻找任何设备,您可以尝试[CBUUID UUIDWithString:@"180A"].

于 2012-04-17T14:45:57.907 回答
3

尝试在扫描设备时提供此信息

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:NO], CBCentralManagerScanOptionAllowDuplicatesKey, nil];

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

您将能够在didDiscoverPeripheral委托方法中获取设备列表

于 2013-06-27T20:29:40.230 回答
0

保持冷静并使用https://github.com/l0gg3r/LGBluetooth

所有你需要做的

[[LGCentralManager sharedInstance] scanForPeripheralsByInterval:4
                                                         completion:^(NSArray *peripherals) {
     }];

于 2014-02-17T17:54:59.060 回答