鸿蒙 蓝牙开发之设备查找(二)

本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

一、功能与开发准备

1.1 功能

  1. 扫描周边蓝牙设备 - 搜索发现附近可用的蓝牙设备

  2. 设置本机蓝牙扫描模式 - 控制本机被其他设备发现的权限

  3. 查找已配对设备信息 - 访问已建立配对关系的设备

1.2 前置条件

  • 周边设备:必须处于可被发现状态

  • 本机状态:蓝牙必须已开启(STATE_ONSTATE_BLE_ON

  • 权限要求:需要申请ohos.permission.ACCESS_BLUETOOTH权限

1.3 开发准备步骤

  1. 申请蓝牙权限:参考鸿蒙官方文档中的权限声明和授权申请指南

  2. 导入API模块

import { connection } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

二、扫描周边蓝牙设备

2.1 说明

  • 扫描:也称为"搜索"、"发现"或"查找"

  • 必要条件:周边设备必须处于可被发现状态

  • 扫描时长:约12秒

  • 资源消耗:扫描过程消耗蓝牙硬件资源,找到设备后应尽快停止

2.2 API版本差异

2.2.1 API Version 18+(推荐)

支持获取完整设备信息,包括:

  • 设备地址(deviceId)

  • 信号强度(rssi)

  • 设备名称(name)

  • 设备类型(deviceType)

事件名称'discoveryResult'
数据类型Array<connection.DiscoveryResult>

2.2.2 API Version 17及以下

仅支持获取设备地址信息

事件名称'bluetoothDeviceFind'
数据类型Array<string>

2.3 实现流程

步骤1:订阅扫描结果上报事件
// 定义扫描结果上报回调函数
function onReceiveEvent(data: Array<connection.DiscoveryResult>) {
    console.info('bluetooth device: ' + JSON.stringify(data));
}

try {
    // 发起订阅
    connection.on('discoveryResult', onReceiveEvent);
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
步骤2:发起设备扫描
try {
    // 判断本机设备是否正在进行扫描
    let scan = connection.isBluetoothDiscovering();
    if (!scan) {
        // 若当前不处于扫描过程,则开始扫描设备
        connection.startBluetoothDiscovery();
    }
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}
步骤3:停止设备扫描(重要)
// 定义扫描结果上报回调函数
function onReceiveEvent(data: Array<string>) {
    console.info('bluetooth device: ' + JSON.stringify(data));
}

try {
    // 判断本机设备是否正在进行扫描
    let scan = connection.isBluetoothDiscovering();
    if (scan) {
        // 若当前处于扫描过程,则停止扫描设备
        connection.stopBluetoothDiscovery();
    }
    // 若不再需要使用扫描,可以取消订阅扫描上报结果
    connection.off('discoveryResult', onReceiveEvent);
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}

三、设置本机蓝牙扫描模式

3.1 扫描模式说明

本机蓝牙扫描模式控制本机设备是否可以被周边其他设备扫描到或连接上。

3.1.1 扫描模式类型
  1. SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE

    • 可被扫描和可被连接

    • 系统行为:系统设置应用打开蓝牙后,若设置界面在前台,设置为此模式

  2. SCAN_MODE_CONNECTABLE

    • 仅可被连接(不可被扫描发现)

    • 系统行为:系统设置应用打开蓝牙后,若设置界面在后台,设置为此模式

3.1.2 注意事项
  • 非系统应用:一般不需要关注此模式设置

  • 系统设置应用:决定如何设置扫描模式

3.2 实现代码

try {
    // 获取当前本机的扫描模式
    let scanMode: connection.ScanMode = connection.getBluetoothScanMode();
    console.info('scanMode: ' + scanMode);
    
    if (scanMode != connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE) {
        // 将本机设备的扫描模式设置为可被发现和可被连接
        connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0);
    }
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}

四、查找已配对设备信息

4.1 说明

  • 目的:在发起扫描前,检查设备是否已配对,减少不必要的扫描流程

  • 应用:对已配对设备可直接发起连接和数据传输

4.2 实现代码

try {
    // 获取已配对设备信息
    let devices = connection.getPairedDevices();
    console.info('pairedDevices: ' + JSON.stringify(devices));
    
    // 若已知道设备地址,可主动查询该设备是否是已配对的
    if (devices.length > 0) {
        let pairState = connection.getPairState(devices[0]);
        console.info('device: ' + devices[0] + ' pairState is ' + pairState);
    }
} catch (err) {
    console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
}

五、完整示例

import { connection } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

export class DiscoveryDeviceManager {
    // 定义扫描结果上报回调函数
    onReceiveEvent = (data: Array<string>) => {
        console.info('bluetooth device: ' + JSON.stringify(data));
    };

    // 1. 开始发现设备
    public startDiscovery() {
        try {
            connection.on('bluetoothDeviceFind', this.onReceiveEvent);
        } catch (err) {
            console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
        }
        
        try {
            // 判断本机设备是否正在进行扫描
            let scan = connection.isBluetoothDiscovering();
            if (!scan) {
                // 若当前不处于扫描过程,则开始扫描设备
                connection.startBluetoothDiscovery();
            }
        } catch (err) {
            console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
        }
    }

    // 2. 停止发现设备
    public stopDiscovery() {
        try {
            // 判断本机设备是否正在进行扫描
            let scan = connection.isBluetoothDiscovering();
            if (scan) {
                // 若当前处于扫描过程,则停止扫描设备
                connection.stopBluetoothDiscovery();
            }
            // 若不再需要使用扫描,可以取消订阅扫描上报结果
            connection.off('bluetoothDeviceFind', this.onReceiveEvent);
        } catch (err) {
            console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
        }
    }

    // 3. 设置扫描模式
    public setScanMode() {
        try {
            // 获取当前本机的扫描模式
            let scanMode: connection.ScanMode = connection.getBluetoothScanMode();
            console.info('scanMode: ' + scanMode);
            
            if (scanMode != connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE) {
                // 将本机设备的扫描模式设为可被发现和可被连接
                connection.setBluetoothScanMode(connection.ScanMode.SCAN_MODE_CONNECTABLE_GENERAL_DISCOVERABLE, 0);
            }
        } catch (err) {
            console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
        }
    }

    // 4. 获取已配对设备
    public getPairedDevices() {
        try {
            // 获取已配对设备信息
            let devices = connection.getPairedDevices();
            console.info('pairedDevices: ' + JSON.stringify(devices));
            
            // 若已知道设备地址,可主动查询该设备是否是已配对的
            if (devices.length > 0) {
                let pairState = connection.getPairState(devices[0]);
                console.info('device: ' + devices[0] + ' pairState is ' + pairState);
            }
        } catch (err) {
            console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);
        }
    }
}

// 创建实例并导出
let discoveryDeviceManager = new DiscoveryDeviceManager();
export default discoveryDeviceManager as DiscoveryDeviceManager;

方法说明

startDiscovery() 方法
  • 功能:启动设备扫描

  • 执行流程

    1. 注册扫描结果监听器

    2. 检查当前扫描状态

    3. 如果未在扫描中,则启动扫描

stopDiscovery() 方法
  • 功能:停止设备扫描

  • 执行流程

    1. 检查当前扫描状态

    2. 如果在扫描中,则停止扫描

    3. 注销扫描结果监听器

setScanMode() 方法
  • 功能:设置本机扫描模式

  • 执行流程

    1. 获取当前扫描模式

    2. 如果不是目标模式,则设置为可被发现和可被连接模式

  • 注意:duration参数为0表示永久有效

getPairedDevices() 方法
  • 功能:获取已配对设备列表

  • 执行流程

    1. 获取所有已配对设备地址

    2. 可进一步查询特定设备的配对状态

  • 场景:在扫描前先检查设备是否已配对

备注:

  1. 合理使用配对信息:先检查已配对设备,减少不必要的扫描

  2. 扫描不到设备:确保目标设备蓝牙已开启且可被发现

  3. 重复设备发现:确保每次扫描前后正确注册和注销监听器

总结

核心功能

  1. 设备扫描:使用startBluetoothDiscovery()stopBluetoothDiscovery()控制扫描过程

  2. 结果监听:通过on('discoveryResult')on('bluetoothDeviceFind')接收扫描结果

  3. 模式设置:使用setBluetoothScanMode()控制本机可见性

  4. 配对查询:使用getPairedDevices()getPairState()访问配对信息

开发流程

  1. 准备阶段:申请权限,导入模块

  2. 初始化阶段:设置扫描模式,注册监听器

  3. 执行阶段:启动扫描,处理结果,及时停止

  4. 清理阶段:注销监听器,释放资源

<think>好的,用户想了解在鸿蒙系统上进行蓝牙驱动开发的教程或API文档。我需要先回忆HarmonyOS蓝牙开发相关资料。记得HarmonyOS开发者官网应该有文档,可能需要指导用户去官网查找。此外,OpenHarmony作为开源项目,可能在Gitee上有资源。 首先,应该分步骤说明如何获取文档和资源。第一步可能是访问官网,找到开发文档部分,特别是设备开发或者蓝牙模块。然后,可能需要提到API参考,比如蓝牙模块的接口说明,比如初始化、发现设备、连接等。 接下来,示例代码部分很重要,用户可能需要一个简单的例子来理解如何调用API。比如扫描蓝牙设备的代码片段,使用JavaScript或ArkTS语言,这是HarmonyOS常用的开发语言。 另外,社区资源也是关键,比如论坛、Stack Overflow、优快云,这些地方可能有开发者分享的经验和问题解答。还要注意提到调试工具,比如DevEco Studio的模拟器或真机调试功能。 最后,生成相关问题时要围绕蓝牙驱动开发,可能涉及配置步骤、API使用、调试方法、常见问题、开源代码以及与其他协议的对比。需要确保问题对用户进一步学习有帮助,覆盖他们可能遇到的后续疑问。 需要检查所有链接是否正确,是否有过时的信息,但用户可能无法访问外部链接,所以主要提供路径和方法,让用户自行查找。同时,确保回答结构清晰,分点说明,符合用户要求的格式,使用中文,避免Markdown,行内公式用$...$,独立公式用$$...$$,但在这个问题中可能涉及较少数学公式,不过如果有技术术语可能需要正确格式化。</think>在鸿蒙系统(HarmonyOS)上进行蓝牙驱动开发,需结合硬件适配、HDF驱动框架及蓝牙协议栈实现。以下是关键步骤和资源指引: --- ### 一、开发准备 1. **文档入口** - 访问[华为开发者联盟](https://developer.harmonyos.com/cn/docs/documentation/doc-guides/bluetooth-overview-0000001185694784),搜索“蓝牙开发指南”[^1]。 - OpenHarmony源码中查看`/drivers/peripheral/bluetooth`目录的接口定义[^2]。 2. **环境配置** - 安装DevEco Studio 3.0+,配置SDK中的蓝牙相关依赖库。 --- ### 、核心流程 1. **HDF驱动框架集成** 蓝牙驱动需继承HDF的`IDriverEntry`接口,实现设备初始化: ```c static int32_t HdfBluetoothEntry(struct HdfDeviceObject *device) { HDF_LOGI("Bluetooth driver initialized"); return HDF_SUCCESS; } ``` 2. **协议栈调用** 使用L2CAP/RFCOMM等协议接口时,需通过`BluetoothHost`模块注册回调: ```typescript import bluetooth from '@ohos.bluetooth'; bluetooth.startBluetoothDiscovery(); // 启动设备扫描 ``` --- ### 三、调试与测试 - **真机调试**:在`config.json`中声明蓝牙权限: ```json "reqPermissions": [{ "name": "ohos.permission.DISCOVER_BLUETOOTH" }] ``` - **HCI日志分析**:通过`hcidump`工具抓取蓝牙数据包[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值