蓝牙是短距离无线通信的一种方式,支持蓝牙的两个设备必须配对后才能通信。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对其他设备的连接状态、获取本机蓝牙已配对的蓝牙设备列表。
接口说明
表1 蓝牙本机管理类BluetoothHost的主要接口
打开蓝牙
1.调用BluetoothHost的getDefaultHost(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
2.调用enableBt()接口,打开蓝牙。
3.调用getBtState(),查询蓝牙是否打开。
// 获取蓝牙本机管理对象 BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context); // 调用打开接口 bluetoothHost.enableBt(); // 调用获取蓝牙开关状态接口 int state = bluetoothHost.getBtState();
蓝牙扫描
1.开始蓝牙扫描前要先注册广播BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED。
2.调用startBtDiscovery()接口开始进行扫描外围设备。
3.如果想要获取扫描到的设备,必须在注册广播时继承实现CommonEventSubscriber类的
传统蓝牙远端设备操作
场景介绍
//开始扫描 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); } } }
传统蓝牙远端管理操作主要是针对远端蓝牙设备的基本操作,包括获取远端蓝牙设备地址、类型、名称和配对状态,以及向远端设备发起配对。
接口说明
表1 蓝牙远端设备管理类BluetoothRemoteDevice的主要接口
开发步骤
1.调用BluetoothHost的getDefaultHost(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
2.调用enableBt()接口,打开蓝牙。
3.调用startBtDiscovery(),扫描设备。
4.调用startPair(),发起配对。
5.调用getDeviceAddr(),获取远端蓝牙设备地址。
调用getDeviceAddr(),获取远端蓝牙设备地址。 // 获取蓝牙本机管理对象 BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context); // 调用打开接口 bluetoothHost.enableBt(); // 调用扫描接口 bluetoothHost.startBtDiscovery(); // 设置界面会显示出扫描结果列表,点击蓝牙设备去配对 BluetoothRemoteDevice device = bluetoothHost.getRemoteDev(TEST_ADDRESS); device.startPair(); // 调用接口获取远端蓝牙设备地址 String deviceAddr = device.getDeviceAddr();