我正在尝试编写一个简单的应用程序:
1.扫描可用的BTLE设备,和
2.将它们放在下拉菜单中供用户查看。
到目前为止,我已经导入了IOBluetooth框架,我有一个IBOutlet到NSPopUpButton(我想显示结果)和两个IBAction用于名为startScan和stopScan的按钮。
我已经有一段时间了,我需要寻求帮助。我在这个精彩的论坛上看到了其他帖子,但我对Objective-C编程比较陌生,我非常感谢你的帮助。
这是我的界面:
#import <Cocoa/Cocoa.h>
#import <IOBluetooth/IOBluetooth.h>
@interface AppDelegate : NSObject <NSApplicationDelegate, CBCentralManagerDelegate, CBPeripheralDelegate> {
CBCentralManager * central; // these properties are for the CBCentralManager
CBPeripheral * peripheral;
NSMutableDictionary * dictionary;
NSNumber * number;
}
@property (assign) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSPopUpButton *deviceList;
@property NSMutableArray * list; // this is the array to fill up the deviceList NSPopUpButton
- (IBAction)startScan:(id)sender;
- (IBAction)stopScan:(id)sender;
@end
这是我的实施:
@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
// Insert code here to initialize your application
CBCentralManager * central = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
NSLog(@"Central Manager's state is: %li", central.state);
}
- (IBAction)startScan:(id)sender {
// start scanning button
NSLog(@"Started scan. Discovering peripherals.");
NSArray * list;
}
- (IBAction)stopScan:(id)sender {
// stop scanning button
}
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
// I'm not sure how to make this work
}
- (void)centralManagerDidUpdateState:(CBCentralManager *)central {
NSLog(@"Central manager's state is updated to: %@", central);
}
- (void)retrievePeripherals:(NSArray *)peripheralUUIDs{
}
@end
就像我说的,我非常感谢你的帮助。 我喜欢编程,但我对此感到沮丧,我相信你们中的一个人会看一眼并确切知道发生了什么。
谢谢大卫
答案 0 :(得分:10)
快速了解您需要做什么才能开始:
1。)在您扫描任何内容之前,您需要分配CentralManager,采用其委托,并等待获得委托回调:
- 分配您在标题中声明的中心
central = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
- 然后等待委托回调
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
if(central.state == CBCentralManagerStatePoweredOn)
{
//okay your good to go and can now scan
}
else
{
//Unable to use CentralManager methods so print out the central.state and find out why
}
}
2.。)如果您想使用IBAction来控制扫描,您还需要每次检查状态。
- (IBAction)startScan:(id)sender
{
if(central.state == CBCentralManagerStatePoweredOn)
{
//nil scans for all peripherals. Change to an array of service UUID's if you're looking for specific devices. Change NO to YES if you want to allow duplicates
[central scanForPeripheralsWithServices:nil options:[NSDictionary dictionaryWithObjectsAndKeys:@NO, CBCentralManagerScanOptionAllowDuplicatesKey, nil];
}
}
3。)现在既然你已经设置了代理和扫描设备,那么就等待didDiscoverPeripheral回调:
- (void)centralManager:(CBCentralManager *)central didDiscoverPeripheral:(CBPeripheral *)peripheral advertisementData:(NSDictionary *)advertisementData RSSI:(NSNumber *)RSSI {
//you've found a peripheral so add it to your table
}
4.。)将您发现的CBPeripherals
存储在数组中,或仅存储在外围名称中(具体取决于您的使用案例)。将其输入到表的数据中,并在每个新的外围设备发现上调用reloadData。如果你想跟踪当前附近的那些,你可以继续并允许重复,你可以根据找到的时间/广告rssi删除/添加。
注意:理想情况下,Central将在Singleton类中设置,在其中您可以在视图控制器中采用它的委托方法。 (但你可以用这种方式弄湿你的脚)。
希望它有所帮助!
答案 1 :(得分:1)
你一定要看看来自apple的BTLE示例应用程序:https://developer.apple.com/library/mac/samplecode/HeartRateMonitor/Introduction/Intro.html这是一个OSX应用程序,可以完全实现您想要尝试的内容。在Mac上启动应用程序并使用iPhone / iPad / iPod上的LightBlue或BLE Utility应用程序来模拟心率传感器。
旁注:WiFi和BLE可能会干扰Mac。在测试时使用以太网连接以确保此问题不会妨碍您的测试。 William Henderson http://lists.apple.com/archives/bluetooth-dev/2013/Aug/msg00023.html也提供了更好的软件解决方案。
现在有几个人已经验证了解决方法,现在是:
sudo defaults write /Library/Preferences/com.apple.airport.bt.plist bluetoothCoexMgmt Hybrid
然后你需要重启。我已经尝试过,但迄今未能找到一种方法,可以在不重新启动的情况下生效。