Android 蓝牙技术(一)- 经典蓝牙

Android平台支持蓝牙设备通过蓝牙协议栈来实现无线通信。应用层提供了Bluetooth APIs来使用蓝牙功能,
这些API可以使应用可以无线连接其他蓝牙设备实现点对点及多点间通信。

使用Bluetooth APIs,应用可以实现以下功能:

  • 扫描其他蓝牙设备
  • 在本地蓝牙适配器查询已配对的设备
  • 建立RFCOMM通道
  • 通过服务发现连接其他设备
  • 与其他设备进行数据交互
  • 管理多连接

本篇主要讲经典蓝牙技术,经典蓝牙适合耗电操作,包括流传输及Android设备间通信。对于有低功耗需求的蓝牙设备
Android 4.3 (API level 18) 提供了低功耗蓝牙相关的API。

准备工作

要在蓝牙设备间发送数据,必须先通过配对步骤组成通道。一个可被发现的设备来接收连接请求,另一个设备通过服务发现步骤
来发现此设备,可被发现的设备接收配对请求,两个设备交换安全码完成绑定骤。安全码会被设备缓存供以后使用。完成配对和
绑定步骤,设备开始交换数据,会话完成后,由发起配对请求的设备释放连接通道。两个设备保持绑定状态,这样,之后在蓝牙
范围之内且两个设备都没有移除绑定时就可以自动重新连接建立会话。

蓝牙权限

要使用蓝牙特性,必须声明两个权限。第一个是BLUETOOTH,进行蓝牙通信时需要此权限,如发起连接,接受连接和交换数据。

另一个权限是 ACCESS_FINE_LOCATION。之所以需要这个权限是因为蓝牙扫描可被用来收集用户的位置信息,这些信息可能来自于
用户的设备以及商店及公共场所使用的蓝牙信标。

另外,在 Android 8.0 (API level 26)及以上设备上,可通过CompanionDeviceManager来扫描附近配套设备而不需要位置权限。

**注意:**如果应用 targets 为 Android 9 (API level 28)及以下,可声明 ACCESS_COARSE_LOCATION 权限替代 ACCESS_FINE_LOCATION。

如果你的APP要发起设备发现或者操作蓝牙设置,除了 BLUETOOTH 权限外还要声明 BLUETOOTH_ADMIN 权限。多数具有发现周围蓝牙设备功能
的应用需要这项权限,至于这项权限其他的功能,除非是电池管理类应用需要根据用户需要修改蓝牙设备,否则不建议使用。

在 manifest 文件中声明权限:

<manifest ... >
  <uses-permission android:name="android.permission.BLUETOOTH" />
  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />

  <!-- If your app targets Android 9 or lower, you can declare
       ACCESS_COARSE_LOCATION instead. -->
  <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  ...
</manifest>

使用不同配置

从Android3.0开始,Bluetooth API便支持使用蓝牙配置文件,蓝牙配置文件是设备间基于蓝牙通信的无线接口规范。例如免提配置。
例如移动电话要连接无线耳机,两种设备都需要支持免提配置。

Android Bluetooth API 提供了以下几种蓝牙配置的实现:

  • Headset. Headset 配置支持耳机和手机一起使用。Android 提供了 BluetoothHeadset 类,该类是控制蓝牙耳机服务的代理类,
    包含了蓝牙耳机和免提(v1.5)配置。该类还包含对 AT 命令的支持。
  • **A2DP.**蓝牙立体声音频传输配置(A2DP)文件定义了高质量音频如何通过流式传输从一个设备传输到另一个设备。Android 提供了 BluetoothA2dp
    类,该类是控制蓝牙A2DP服务的代理类。
  • Health Device. Android 4.0 (API level 14)开始引入了对蓝牙健康设备 (HDP)配置文件的支持。改配置支持你创建通过蓝牙和
    蓝牙健康设备之间通信的应用,如心率仪、血压计、体温计及台秤等。有关已支持的设备及对应的规范码,参照HDP Device Data Specializations.
    这些值在 ISO/IEEE 11073-20601 规范的“命名法规附录”中也被称为 MDC_DEV_SPEC_PROFILE_*。详情参见健康设备配置文件

以下是使用配置文件的基本步骤:

  1. 获取默认适配器,参阅设置蓝牙
  2. 设置 BluetoothProfile.ServiceListener,此侦听器会在连接上和断开连接时通知 BluetoothProfile 客户端。
  3. 使用 getProfileProxy() 与配置文件关联的配置代理对象建立连接,下面例子中,配置代理对象是 BluetoothHeadset 实例。
  4. 在 onServiceConnected() 中获取配置代理对象句柄。
  5. 一旦拿到了配置代理对象,你可以使用它监测连接的状态及进行其他相关操作。

例如,这段代码展示了如何连接到 BluetoothHeadset 代理对象,以便控制耳机配置文件:

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)
供应商特定的 AT 指令

3.0 (API level 11)开始,应用可以注册能接收到耳机发送的预定义的厂商特定 AT 指令的广播 (如 Plantronics +XEVENT 命令)。
例如应用可收到指示已连接设备电池电量的广播,然后通知用户根据需要采取操作。以 ACTION_VENDOR_SPECIFIC_HEADSET_EVENT Intent 注册广播
来处理厂商特定的耳机 AT 指令。

健康设备配置文件

Android 4.0 (API level 14) 引入对健康设备配置文件(HDP)支持。相关API包括 BluetoothHealth, BluetoothHealthCallback, 和 BluetoothHealthAppConfiguration, 参见关键类和接口

在使用 Bluetooth Health API 时,理解以下 HDP 概念会有帮助:

Source
一个健康设备-如体重秤或血糖仪,发送医学数据给智能设备,如手机或平板。
Sink
智能设备接收医学数据,在一个 Android HDP 应用中,由 BluetoothHealthAppConfiguration 对象来表示。
Registration<

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值