Android NDK开发详解连接性之蓝牙配置文件
Bluetooth API 支持使用蓝牙配置文件。蓝牙配置文件是适用于设备间蓝牙通信的无线接口规范,例如免触摸配置文件。要使移动设备能够连接到无线耳机,两部设备都必须支持免触摸配置文件。
Bluetooth API 提供了以下蓝牙配置文件的实现:
耳机。耳机配置文件支持将蓝牙耳机与手机配合使用。Android 提供了 BluetoothHeadset 类,它是用于控制蓝牙耳机服务的代理。这包括蓝牙耳机和免提 (v1.5) 配置文件。BluetoothHeadset 类支持 AT 命令。如需详细了解此主题,请参阅特定于供应商的 AT 命令。
A2DP。高级音频分发配置文件 (A2DP) 配置文件定义了如何通过蓝牙连接将高质量音频从一台设备流式传输到另一台设备。Android 提供了 BluetoothA2dp 类,它是用于控制蓝牙 A2DP 服务的代理。
健康设备。Android 支持蓝牙健康设备配置文件 (HDP)。这样,您就可以创建应用,使用蓝牙与支持蓝牙的健康设备(例如心率监测仪、血糖仪、温度计、体重秤等)进行通信。如需查看受支持的设备列表及其对应的设备数据专业化代码,请参阅蓝牙的 HDP 设备数据专业化。 此外,在 ISO/IEEE 11073-20601 [7] 规范的“命名代码附录”中也以 MDC_DEV_SPEC_PROFILE_* 的形式引用这些值。如需详细了解 HDP,请参阅健康设备配置文件。
以下是使用配置文件的基本步骤:
获取默认适配器,如蓝牙设置中所述。
设置 BluetoothProfile.ServiceListener。此监听器会在 BluetoothProfile 客户端连接到服务或断开服务连接时通知他们。
使用 getProfileProxy() 与配置文件所关联的配置文件代理对象建立连接。在以下示例中,个人资料代理对象是 BluetoothHeadset 的实例。
在 onServiceConnected() 中,获取配置文件代理对象的句柄。
获得配置文件代理对象后,请使用它来监控连接状态并执行与该配置文件相关的其他操作。
以下代码段展示了如何连接到 BluetoothHeadset 代理对象,以便您可以控制耳机配置文件:
Kotlin
var bluetoothHeadset: BluetoothHeadset? = null
// Get the default adapter
val bluetoothAdapter: BluetoothAdapter? = BluetoothAdapter.getDefaultAdapter()
private val profileListener = object : BluetoothProfile.ServiceListener {
override fun onServiceConnected(profile: Int, proxy: BluetoothProfile) {
if (profile == BluetoothProfile.HEADSET) {
bluetoothHeadset = proxy as BluetoothHeadset
}
}
override fun onServiceDisconnected(profile: Int) {
if (profile == BluetoothProfile.HEADSET) {
bluetoothHeadset = null
}
}
}
// Establish connection to the proxy.
bluetoothAdapter?.getProfileProxy(context, profileListener, BluetoothProfile.HEADSET)
// ... call functions on bluetoothHeadset
// Close proxy connection after use.
bluetoothAdapter?.closeProfileProxy(BluetoothProfile.HEADSET, bluetoothHeadset)
Java
BluetoothHeadset bluetoothHeadset;
// Get the default adapter
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
private BluetoothProfile.ServiceListener profileListener = new BluetoothProfile.ServiceListener() {
public void onServiceConnected(int profile, BluetoothProfile proxy) {
if (profile == BluetoothProfile.HEADSET) {
bluetoothHeadset = (BluetoothHeadset) proxy;
}
}
public void onServiceDisconnected(int profile) {
if (profile == BluetoothProfile.HEADSET) {
bluetoothHeadset = null;
}
}
};
// Establish connection to the proxy.
bluetoothAdapter.getProfileProxy(context, profileListener, BluetoothProfile.HEADSET);
// ... call functions on bluetoothHeadset
// Close proxy connection after use.
bluetoothAdapter.closeProfileProxy(bluetoothHeadset);
供应商特定的 AT 命令
应用可以注册接收耳机发送的预定义供应商专用 AT 命令(例如 Plantronics +XEVENT 命令)的系统广播。例如,应用可以接收指示已连接设备电池电量的广播,并根据需要通知用户或执行其他操作。为 ACTION_VENDOR_SPECIFIC_HEADSET_EVENT intent 创建广播接收器,以处理耳机的供应商特定 AT 命令。
健康设备配置文件
Android 支持蓝牙健康设备配置文件 (HDP)。Bluetooth Health API 包含 BluetoothHealth、BluetoothHealthCallback 和 BluetoothHealthAppConfiguration 类,关键类和接口中对这些类进行了介绍。
注意 :系统已不再使用健康设备配置文件 (HDP) 和 MCAP 协议。新应用应使用基于蓝牙低功耗的解决方案,例如 BluetoothGatt、BluetoothAdapter.listenUsingL2capChannel() 或 BluetoothDevice#createL2capChannel(int)。
使用 Bluetooth Health API 时,了解以下关键 HDP 概念会很有帮助:
来源
将医疗数据传输到 Android 手机或平板电脑等智能设备的健康设备,如体重秤、血糖仪或温度计。
接收器
接收医疗数据的智能设备。在 HDP 应用中,接收器由 BluetoothHealthAppConfiguration 对象表示。
注册
用于注册接收器以与特定健康设备进行通信的过程。
情感联系
用于打开健康设备(源设备)和智能设备(接收器)之间的通道的过程。
创建 HDP 应用
以下是创建 HDP 应用所涉及的基本步骤:
获取对 BluetoothHealth 代理对象的引用。与常规耳机和 A2DP 配置文件设备一样,您必须使用 BluetoothProfile.ServiceListener 和 HEALTH 配置文件类型调用 getProfileProxy(),以与配置文件代理对象建立连接。
创建 BluetoothHealthCallback 并注册充当健康接收器的应用配置 (BluetoothHealthAppConfiguration)。
建立与健康设备的连接。
注意 :有些设备会自动启动连接。没有必要对这类设备执行此步骤。
成功连接到健康设备后,使用文件描述符对健康设备执行读写操作。接收的数据需要使用实现了 IEEE 11073 规范的运行状况管理器进行解读。
完成后,关闭健康通道并取消注册应用。当长期处于不活跃状态时,该通道也会关闭。
本页面上的内容和代码示例受内容许可部分所述许可的限制。Java 和 OpenJDK 是 Oracle 和/或其关联公司的注册商标。
最后更新时间 (UTC):2023-11-11。