我正在尝试编写一个非常简单的终端应用程序,它将定期扫描蓝牙设备并显示范围内每个蓝牙设备的蓝牙网络地址(十六进制数字)。我的目标平台是Mac OS X,所以我认为这将涉及Objective-C。我没有任何Objective-C的经验(尽管我有C语言的所有基础知识),但这看起来应该非常简单。
在哪里可以找到快速本地列出蓝牙设备的文档和示例代码(或教程,或者过去曾使用过的代码)?
答案 0 :(得分:5)
以下Mac Dev Center参考可能对您有用。它有点深入,但确实有代码示例。
答案 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。通常,最安全的方法是在单独的过程中进行设备搜索。