HarmonyOS学习路之开发篇—网络与连接(蓝牙开发 一)

2023-10-15 08:54:56 浏览数 (2)

蓝牙是短距离无线通信的一种方式,支持蓝牙的两个设备必须配对后才能通信。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​()

获取本机蓝牙已配对的蓝牙设备列。

打开蓝牙

  1. 调用BluetoothHost的getDefaultHost​(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
  2. 调用enableBt​()接口,打开蓝牙。
  3. 调用getBtState​(),查询蓝牙是否打开。
代码语言:javascript复制
// 获取蓝牙本机管理对象
BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context);
// 调用打开接口
bluetoothHost.enableBt();
// 调用获取蓝牙开关状态接口
int state = bluetoothHost.getBtState(); 

蓝牙扫描

  1. 开始蓝牙扫描前要先注册广播BluetoothRemoteDevice.EVENT_DEVICE_DISCOVERED。
  2. 调用startBtDiscovery()接口开始进行扫描外围设备。
  3. 如果想要获取扫描到的设备,必须在注册广播时继承实现CommonEventSubscriber类的onReceiveEvent(CommonEventData data)方法,并接收EVENT_DEVICE_DISCOVERED广播。
代码语言:javascript复制
//开始扫描
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​()

向远端设备发起配对。

开发步骤

  1. 调用BluetoothHost的getDefaultHost​(Context context)接口,获取BluetoothHost实例,管理本机蓝牙操作。
  2. 调用enable​Bt()接口,打开蓝牙。
  3. 调用startBtDiscovery​(),扫描设备。
  4. 调用startPair(),发起配对。
  5. 调用getDeviceAddr(),获取远端蓝牙设备地址。
代码语言:javascript复制
调用getDeviceAddr​(),获取远端蓝牙设备地址。
// 获取蓝牙本机管理对象
BluetoothHost bluetoothHost = BluetoothHost.getDefaultHost(context);
// 调用打开接口
bluetoothHost.enableBt();
// 调用扫描接口
bluetoothHost.startBtDiscovery(); 
// 设置界面会显示出扫描结果列表,点击蓝牙设备去配对
BluetoothRemoteDevice device = bluetoothHost.getRemoteDev(TEST_ADDRESS);
device.startPair();
// 调用接口获取远端蓝牙设备地址
String deviceAddr = device.getDeviceAddr();

0 人点赞