IOBluetooth和IOBluetoothUI库检测不同的外围设备,它们之间有什么区别吗?

时间:2014-08-10 01:51:01

标签: macos bluetooth bluetooth-lowenergy core-bluetooth iobluetooth

我希望我的第一个问题是正确的,如果我犯了任何错误,请纠正我。

我想在Mac OS X中创建一个程序,允许我连接到蓝牙设备。我从基础开始,检测所有可用的蓝牙外围设备。

我制作了两个测试代码,第一个使用IOBluetooth库,第二个使用带有apple功能的IOBluetoothUI来创建用户界面。

第一个我几乎无法检测到设备(AppleTV),第二个检测到iPhone 5,iPad 2和HC-05但不是AppleTV。使用第一个代码,我也应该能够检测到至少HC-05。

有没有区别(除了一个是带有UI功能的库)或者我做错了什么?我已经回顾了几个问题,但我还没有找到任何相关内容。

我读到iPhone只能被其他苹果产品检测到,这是真的吗?

先谢谢你。


IOBluetooth

的示例

标题

#import <Cocoa/Cocoa.h>
#import <IOBluetooth/IOBluetooth.h>

@interface AppDelegate : NSObject <NSApplicationDelegate, CBCentralManagerDelegate, CBPeripheralDelegate>
{
    CBCentralManager *myCentralManager;
    CBPeripheral *myPeripheral;
    NSMutableArray *Peripherals;
}
@property (assign) IBOutlet NSWindow *window;

@end

体:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

    //We initialize the Central Manager
    myCentralManager = [[CBCentralManager alloc] initWithDelegate:self queue:nil];

}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI
{
    NSLog(@"Discovered %@ %@", peripheral, advertisementData);
    if (!Peripherals){
        Peripherals =[[NSMutableArray alloc] initWithObjects:peripheral, nil];
    }else{
        [Peripherals addObject:peripheral];
    }

    NSLog(@"List of devices: %@",Peripherals);

}

- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
    //CBCentralManagerStatePoweredOn = 5;
    NSLog(@"Bluetooth state %ld", myCentralManager.state);
    if (myCentralManager.state == CBCentralManagerStatePoweredOn){
        NSLog(@"Scanning");
        [myCentralManager scanForPeripheralsWithServices:nil options:nil];
    }
}

@end

IOBluetoothUI

的示例

标题

#import <Cocoa/Cocoa.h>
#import <IOBluetoothUI/IOBluetoothUI.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    IBOutlet NSButton *button;
}

@property (assign) IBOutlet NSWindow *window;

- (IBAction)showBrowser:(id)sender;

@end

体:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{

}

- (IBAction)showBrowser:(id)sender{
   // Creating and initializing the window
   IOBluetoothServiceBrowserController *browser = [IOBluetoothServiceBrowserController serviceBrowserController:0];
   // launching the window
   [browser runModal];

}
@end

1 个答案:

答案 0 :(得分:0)

我最近一直在用这些框架做一些测试。如果您查看IOBluetooth.h,您可以看到它导入的CoreBluetooth框架仅适用于蓝牙低功耗。在我看来,IOBluetooth和IOBluetoothUI框架应该一起使用。 IOBluetoothUI框架向用户呈现UI,IOBluetooth框架从设备执行查询等。 IOBluetooth和IOBluetoothUI框架仅用于Bluetooth Classic,但为方便起见,导入了CoreBluetooth。您的第一个示例(使用CBCentralManager等)正在使用CoreBluetooth框架。

这就是你只能看Apple TV的原因。它只能支持蓝牙LE,而不支持蓝牙经典。您无法使用CoreBluetooth看到iOS设备的原因(即使它们有BLE芯片)是因为iOS只宣传自己为Bluetooth Classic设备。如果您想使用CoreBluetooth框架找到它们,首先必须使用CoreBluetooth编写应用程序,该应用程序将设备通告为BLE设备。请参阅CoreBluetooth Programming Guide: Performing Common Peripheral Role Tasks,了解如何做到这一点。

iOS设备肯定可以被Apple产品以外的设备用作Bluetooth Classic设备。想想汽车收音机。就BLE而言,我不太确定,但我不明白为什么不这样做。如果是这样,它需要一个应用程序来宣传它作为BLE设备。 iOS不会单独执行此操作。