在Objective-C中本地列出蓝牙设备

时间:2009-11-12 16:04:33

标签: objective-c cocoa bluetooth

我正在尝试编写一个非常简单的终端应用程序,它将定期扫描蓝牙设备并显示范围内每个蓝牙设备的蓝牙网络地址(十六进制数字)。我的目标平台是Mac OS X,所以我认为这将涉及Objective-C。我没有任何Objective-C的经验(尽管我有C语言的所有基础知识),但这看起来应该非常简单。

在哪里可以找到快速本地列出蓝牙设备的文档和示例代码(或教程,或者过去曾使用过的代码)?

5 个答案:

答案 0 :(得分:5)

以下Mac Dev Center参考可能对您有用。它有点深入,但确实有代码示例。

Introduction to Bluetooth Device Access Guide

答案 1 :(得分:5)

使用带有Objective-C的蓝牙可以通过IOBluetooth框架实现。

基本操作的一些有用类的示例是:

  • IOBluetoothDevice
    • 连接方法
    • [IOBluetoothDevice pairedDevices]返回配对设备的NSArray
    • 很多其他的东西
  • IOBluetoothDeviceInquiry
    • 查找可用设备
  • IOBluetoothHostController
    • powerState属性可以告诉您自己的蓝牙是打开还是关闭

以下是使用IOBluetoothDeviceInquiry获取范围内每个蓝牙设备地址的示例代码。使用以下内容开始查询过程:

IOBluetoothDeviceInquiry *inquirer = [IOBluetoothDeviceInquiry inquiryWithDelegate:self];
// Configure further here if necessary
[inquirer start];

现在,您可以使用IOBluetoothDeviceInquiryDelegate方法获取找到的设备的地址:

#pragma mark - IOBluetoothDeviceInquiryDelegate Methods

- (void) deviceInquiryComplete:(IOBluetoothDeviceInquiry *)sender error:(IOReturn)error aborted:(BOOL)aborted {
    NSArray *devices = [sender foundDevices];
    for (IOBluetoothDevice *device in devices) {
        const BluetoothDeviceAddress *address = [device getAddress];
        // Do something with address
    }
    [sender performSelector:@selector(start) withObject:nil afterDelay:7];
}

答案 2 :(得分:0)

不知道任何示例代码,但您需要使用IOBluetooth框架中的IOBluetoothDeviceInquiry类。蓝牙设备访问指南有brief section on it

答案 3 :(得分:0)

你可以使用Gamekit Api和btstack框架工作......

但这是一个很大的挑战。

一切顺利......

如果你得到了出局..请发布你的经验。我也在寻找那个。

答案 4 :(得分:0)

命令行应用程序通常不使用RunLoop,但是IOBluetoothDeviceInquire依赖于主线程的RunLoop。此要求没有记录,它可能导致各种与环境有关的行为,但大多数情况下会导致搜索失败。特别是,仅设置自己的线程并驱动其RunLoop是不够的。

我通过反复试验发现了这一点。但是为了造福人类,可以在in this github project上找到搜索蓝牙设备的简单命令行应用程序的完整示例。

相关部分是委托处理程序

// The purpose of this delegate is to finish the RunLoop once the inquiry completes.

@interface DiscoveryFinisher : NSObject<IOBluetoothDeviceInquiryDelegate>
- (void) deviceInquiryComplete: (IOBluetoothDeviceInquiry *)sender error: (IOReturn)error aborted: (BOOL)aborted;
@end

@implementation DiscoveryFinisher
- (void)deviceInquiryComplete: (IOBluetoothDeviceInquiry *)sender error: (IOReturn)error aborted: (BOOL)aborted
{
    CFRunLoopStop(CFRunLoopGetCurrent());
}
@end

以及执行搜索的代码(CFRunLoopRun会阻塞直到搜索完成):

int main(int argc, const char* argv[])
{
    @autoreleasepool {
        DiscoveryFinisher* df = [[DiscoveryFinisher alloc] init];
        IOBluetoothDeviceInquiry* bdi = [[IOBluetoothDeviceInquiry alloc] initWithDelegate: df];
        [bdi setUpdateNewDeviceNames:NO];
        if ([bdi start] != kIOReturnSuccess) {
            return -1;
        }

        CFRunLoopRun();
        [bdi stop];

        NSArray *foundDevices = [bdi foundDevices];
        //... do something with them
    }

    return 0;
}

此处委托仅用于最终停止RunLoop,但您可以将协议的其他部分实现为例如不断更新设备列表。警告,因为这在多线程应用程序中最有用:如果这样做,则必须注意mainThread才能正确驱动RunLoops。通常,最安全的方法是在单独的过程中进行设备搜索。