蓝牙是短距离无线通信的一种方式,支持蓝牙的两个设备必须配对后才能通信。HarmonyOS蓝牙主要分为传统蓝牙和低功耗蓝牙(通常称为BLE,Bluetooth Low Energy)。传统蓝牙指的是蓝牙版本3.0以下的蓝牙,低功耗蓝牙指的是蓝牙版本4.0以上的蓝牙。
当前蓝牙的配对方式有两种:蓝牙协议2.0以下支持PIN码(Personal Identification Number,个人识别码)配对,蓝牙协议2.1以上支持简单配对。
传统蓝牙
HarmonyOS传统蓝牙提供的功能有:
- 传统蓝牙本机管理:打开和关闭蓝牙、设置和获取本机蓝牙名称、扫描和取消扫描周边蓝牙设备、获取本机蓝牙profile对其他设备的连接状态、获取本机蓝牙已配对的蓝牙设备列表。
- 传统蓝牙远端设备操作:查询远端蓝牙设备名称和MAC地址、设备类型和配对状态,以及向远端蓝牙设备发起配对。
BLE
BLE设备交互时会分为不同的角色:
- 中心设备和外围设备:中心设备负责扫描外围设备、发现广播。外围设备负责发送广播。
- GATT(Generic Attribute Profile,通用属性配置文件)服务端与GATT客户端:两台设备建立连接后,其中一台作为GATT服务端,另一台作为GATT客户端。通常发送广播的外围设备作为服务端,负责扫描的中心设备作为客户端。
HarmonyOS低功耗蓝牙提供的功能有:
- BLE扫描和广播:根据指定状态获取外围设备、启动或停止BLE扫描、广播。
- BLE中心设备与外围设备进行数据交互:BLE外围设备和中心设备建立GATT连接后,中心设备可以查询外围设备支持的各种数据,向外围设备发起数据请求,并向其写入特征值数据。
- BLE外围设备数据管理:BLE外围设备作为服务端,可以接收来自中心设备(客户端)的GATT连接请求,应答来自中心设备的特征值内容读取和写入请求,并向中心设备提供数据。同时外围设备还可以主动向中心设备发送数据。
约束与限制
调用蓝牙的打开接口需要ohos.permission.USE_BLUETOOTH权限,调用蓝牙扫描接口需要ohos.permission.LOCATION权限和ohos.permission.DISCOVER_BLUETOOTH权限。
传统蓝牙本机管理
场景介绍
传统蓝牙本机管理主要是针对蓝牙本机的基本操作,包括打开和关闭蓝牙、设置和获取本机蓝牙名称、扫描和取消扫描周边蓝牙设备、获取本机蓝牙profile对其他设备的连接状态、获取本机蓝牙已配对的蓝牙设备列表。
接口说明
接口名 | 功能描述 |
---|---|
getDefaultHost(Context context) | 获取BluetoothHost实例,去管理本机蓝牙操作。 |
enableBt() | 打开本机蓝牙。 |
disableBt() | 关闭本机蓝牙。 |
setLocalName(String name) | 设置本机蓝牙名称。 |
getLocalName() | 获取本机蓝牙名称。 |
getBtState() | 获取本机蓝牙状态。 |
startBtDiscovery() | 发起蓝牙设备扫描。 |
cancelBtDiscovery() | 取消蓝牙设备扫描。 |
isBtDiscovering() | 检查蓝牙是否在扫描设备中。 |
getProfileConnState(int profile) | 获取本机蓝牙profile对其他设备的连接状态。 |
getPairedDevices() | 获取本机蓝牙已配对的蓝牙设备列。 |
打开蓝牙
- 调用BluetoothHost的getDefaultHost(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
- 调用enableBt()接口,打开蓝牙。
- 调用getBtState(),查询蓝牙是否打开。
// 获取蓝牙本机管理对象
BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context);
// 调用打开接口
bluetoothHost.enableBt();
// 调用获取蓝牙开关状态接口
int state = bluetoothHost.getBtState();
蓝牙扫描
- 开始蓝牙扫描前要先注册广播BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED。
- 调用startBtDiscovery()接口开始进行扫描外围设备。
- 如果想要获取扫描到的设备,必须在注册广播时继承实现CommonEventSubscriber类的onReceiveEvent(CommonEventData data)方法,并接收EVENT_DEVICE_DISCOVERED广播。
//开始扫描
bluetoothHost.startBtDiscovery();
//接收系统广播
public class MyCommonEventSubscriber extends CommonEventSubscriber {
@Override
public void onReceiveEvent(CommonEventData data) {
if (data == null) {
return;
}
Intent info = data.getIntent();
if (info == null) {
return;
}
//获取系统广播的action
String action = info.getAction();
//判断是否为扫描到设备的广播
if (BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED.equals(action)) {
IntentParams myParam = info.getParams();
BluetoothRemoteDevice device = (BluetoothRemoteDevice) myParam.getParam(BluetoothRemoteDevice.REMOTE_DEVICE_PARAM_DEVICE);
}
}
}
传统蓝牙远端设备操作
场景介绍
传统蓝牙远端管理操作主要是针对远端蓝牙设备的基本操作,包括获取远端蓝牙设备地址、类型、名称和配对状态,以及向远端设备发起配对。
接口说明
接口名 | 功能描述 |
---|---|
getDeviceAddr() | 获取远端蓝牙设备地址。 |
getDeviceClass() | 获取远端蓝牙设备类型。 |
getDeviceName() | 获取远端蓝牙设备名称。 |
getPairState() | 获取远端设备配对状态。 |
startPair() | 向远端设备发起配对。 |
开发步骤
- 调用BluetoothHost的getDefaultHost(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
- 调用enableBt()接口,打开蓝牙。
- 调用startBtDiscovery(),扫描设备。
- 调用startPair(),发起配对。
- 调用getDeviceAddr(),获取远端蓝牙设备地址。
调用getDeviceAddr(),获取远端蓝牙设备地址。
// 获取蓝牙本机管理对象
BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context);
// 调用打开接口
bluetoothHost.enableBt();
// 调用扫描接口
bluetoothHost.startBtDiscovery();
// 设置界面会显示出扫描结果列表,点击蓝牙设备去配对
BluetoothRemoteDevice device = bluetoothHost.getRemoteDev(TEST_ADDRESS);
device.startPair();
// 调用接口获取远端蓝牙设备地址
String deviceAddr = device.getDeviceAddr();