我希望我的第一个问题是正确的,如果我犯了任何错误,请纠正我。
我想在Mac OS X中创建一个程序,允许我连接到蓝牙设备。我从基础开始,检测所有可用的蓝牙外围设备。
我制作了两个测试代码,第一个使用IOBluetooth库,第二个使用带有apple功能的IOBluetoothUI来创建用户界面。
第一个我几乎无法检测到设备(AppleTV),第二个检测到iPhone 5,iPad 2和HC-05但不是AppleTV。使用第一个代码,我也应该能够检测到至少HC-05。
有没有区别(除了一个是带有UI功能的库)或者我做错了什么?我已经回顾了几个问题,但我还没有找到任何相关内容。
我读到iPhone只能被其他苹果产品检测到,这是真的吗?
先谢谢你。
标题
#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
标题
#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
答案 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不会单独执行此操作。