获取经典蓝牙连接设备列表(无BLE)[EAAccessoryManager]

Posted

技术标签:

【中文标题】获取经典蓝牙连接设备列表(无BLE)[EAAccessoryManager]【英文标题】:Get the list of classic bluetooth connected devices (no BLE) [EAAccessoryManager] 【发布时间】:2016-05-31 11:04:32 【问题描述】:

我需要做一个应用程序,它能够判断我当前是否连接到经典蓝牙设备(实际上,它将是蓝牙汽车设备)。

我的第一步是告诉当前连接的经典蓝牙设备是什么。我不能使用 CoreBluetooth,因为它仅适用于 LE。我尝试使用外部附件框架。

这里是代码(一个按钮启动方法):

- (IBAction)startMethodGetConnected:(id)sender 
     NSLog(@"button taped");
     // Get the number of accessories connected
     NSUInteger NumberOfAccessoriesConnected = [[EAAccessoryManager sharedAccessoryManager].connectedAccessories count];
     //Display the number 
     NSLog(@"number of accessories connected : %d", NumberOfAccessoriesConnected);
 

我曾尝试将 iPhone 连接到蓝牙键盘和蓝牙耳机。在这两种情况下,控制台都会显示数字为 0。

我怎样才能显示正确的数字?

【问题讨论】:

EAAcessoryManager 中似乎没有列出“普通”键盘和“普通”耳机等蓝牙设备。 是的,我认为这是因为设备必须是 MFI,而“普通”蓝牙设备可能并非如此。我找到的解决方案是使用 [[AVAudiosession sharedInstance] availableInputs] 来获取蓝牙输入,但是,使用此解决方案,我无法在后台接收通知(我必须播放音乐才能被允许接收通知)。 【参考方案1】:

来自苹果文档:

“支持外接附件的应用程序必须确保 正确配置他们的 Info.plist 文件。具体来说,您必须 包括 UISupportedExternalAccessoryProtocols 键来声明 您的应用程序支持的特定硬件协议。更多 有关此框架的信息,请参阅外部附件编程 话题。”here

您需要在 Info.plist 文件中使用您的 MFi 设备的协议添加此密钥。

<key>UISupportedExternalAccessoryProtocols</key>
<array>
    <string>your_protocol_name</string>
</array>

问候

【讨论】:

【参考方案2】:

你不能。您可以做的是检查播放路线。问题是您的汽车免提将成为 HeadsetBT。这是我在应用中使用的代码。

// create and set up the audio session
AVAudioSession* audioSession = [AVAudioSession sharedInstance];
[audioSession setDelegate:self];
[audioSession setCategory: AVAudioSessionCategoryPlayAndRecord error: nil];
[audioSession setActive: YES error: nil];

// set up for bluetooth microphone input
UInt32 allowBluetoothInput = 1;
OSStatus stat = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
                                         sizeof (allowBluetoothInput),
                                         &allowBluetoothInput
                                         );
NSLog(@"status = %x", stat);    // problem if this is not zero

// check the audio route
UInt32 size = sizeof(CFStringRef);
CFStringRef route;
OSStatus result = AudioSessionGetProperty(kAudioSessionProperty_AudioRoute, &size, &route);
NSLog(@"route = %@", route);
// if bluetooth headset connected, should be "HeadsetBT"
// if not connected, will be "ReceiverAndMicrophone"

【讨论】:

以上是关于获取经典蓝牙连接设备列表(无BLE)[EAAccessoryManager]的主要内容,如果未能解决你的问题,请参考以下文章

是否有可能(并且有意义)让蓝牙 iOT 设备在外围模式下同时监听 BLE 和蓝牙经典连接

android开发SPP经典蓝牙

Android 经典蓝牙开发(一)

蓝牙配对 - HFP 配置文件和经典蓝牙/BLE

Android和双模蓝牙设备:与BR / EDR(经典)配对时未找到自定义BLE服务

使用 react-native-ble-manager 获取可用蓝牙设备的列表