- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个简单的应用程序:
1. 扫描可用的 BTLE 设备,以及
2. 将它们放在下拉菜单中供用户查看。
到目前为止,我已经导入了 IOBluetooth 框架,我有一个 IBOutlet 到 NSPopUpButton(我想在其中显示结果)和两个 IBActions 用于名为 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
正如我所说,我将非常感谢您的帮助。 我喜欢编程,但我对此感到沮丧,我相信你们中的任何一个人都会看一看这个并确切地知道发生了什么。
谢谢,大卫
最佳答案
好的,快速了解您需要做什么才能开始:
1.) 在你可以扫描任何东西之前,你需要分配你的 CentralManager,采用它的委托(delegate),并等待获得委托(delegate)回调:
-分配你在header中声明的central
central = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:nil];
-然后等待委托(delegate)回调
- (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 将设置在单例类中,您在 View Controller 中采用它的委托(delegate)方法。 (但是你可以这样弄湿你的脚)。
希望对您有所帮助!
关于objective-c - 如何在 Objective-C 中制作可用蓝牙设备的下拉列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18705259/
我是一名优秀的程序员,十分优秀!