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

一、蓝牙定义

      蓝牙技术是一种短距离无线通信技术,能够在设备之间传输数据。该技术由蓝牙技术联盟(Bluetooth Special Interest Group, SIG) 制定规范。

技术原理

蓝牙基于无线电技术实现通信:

  • 工作频段:2.4GHz

  • 抗干扰技术:采用频率跳跃扩频技术(Frequency Hopping Spread Spectrum, FHSS) 来避免与其他无线设备的干扰

  • 通信方式:通过发送和接收数据包进行通信,使用不同的蓝牙协议控制通信流程和数据传输

蓝牙技术分类

传统蓝牙(BR/EDR)
  • 全称:蓝牙基础率/增加数据率(Basic Rate/Enhanced Data Rate)

  • 技术特点

    • EDR是BR的增强版本,传输速率提高2-3倍

    • 最高传输速率:2-3Mbps

    • 通信范围:理想条件下约100米

  • 支持协议

    • 高级音频分发协议

    • 免提通话协议

    • 个人局域网协议

    • 电话簿访问协议

  • 应用场景

    • 蓝牙耳机、音响听音乐

    • 车载系统访问手机电话本、短信

    • 设备间数据共享

低功耗蓝牙(BLE)
  • 引入版本:从蓝牙4.0开始支持

  • 核心优势低功耗,适用于续航要求高的设备

  • 性能参数

    • 最高传输速率:1Mbps

    • 通信范围:通常10米左右

  • 应用领域

    • 穿戴设备

    • 智能家居

    • 物联网传感器

特性维度 传统蓝牙(BR/EDR) 低功耗蓝牙(BLE)
功耗水平 较高 极低
最大速率 2-3 Mbps 1 Mbps
典型距离 100米 10米
连接时间 数秒 毫秒级
应用场景 音频传输、文件共享 传感器数据、智能设备

二、蓝牙开发流程

2.1 开发环境准备

2.1.1 权限配置

必须申请权限ohos.permission.ACCESS_BLUETOOTH

  • 权限用途:允许应用访问蓝牙功能

  • 配置方式

    1. module.json5文件中声明权限

    2. 在应用运行时动态申请用户授权

权限配置:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.ACCESS_BLUETOOTH",
        "reason": "用于蓝牙设备连接和数据传输"
      }
    ]
  }
}
2.1.2 导入API模块
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';

2.2 蓝牙状态管理

2.2.1 蓝牙状态定义

鸿蒙定义了以下蓝牙状态常量:

状态 描述 应用操作权限
STATE_OFF 蓝牙已关闭 不可使用蓝牙其他功能
STATE_TURNING_ON 蓝牙正在开启 过渡状态
STATE_ON 蓝牙已打开 可以使用蓝牙其他功能
STATE_TURNING_OFF 蓝牙正在关闭 过渡状态
STATE_BLE_TURNING_ON 低功耗蓝牙正在开启 过渡状态
STATE_BLE_ON 低功耗蓝牙已打开 可使用BLE功能
STATE_BLE_TURNING_OFF 低功耗蓝牙正在关闭 过渡状态
2.2.2 订阅蓝牙开关状态变化

目的:获取实时的蓝牙开关状态

实现方法

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

export class BluetoothManager {
  private isSubscribed: boolean = false;
  
  // 状态变化回调函数
  private handleStateChange = (currentState: access.BluetoothState): void => {
    let statusDescription: string = '';
    
    switch(currentState) {
      case access.BluetoothState.STATE_OFF:
        statusDescription = '蓝牙已完全关闭';
        break;
      case access.BluetoothState.STATE_TURNING_ON:
        statusDescription = '传统蓝牙启动中...';
        break;
      case access.BluetoothState.STATE_ON:
        statusDescription = '传统蓝牙已就绪';
        break;
      case access.BluetoothState.STATE_BLE_TURNING_ON:
        statusDescription = '低功耗蓝牙启动中...';
        break;
      case access.BluetoothState.STATE_BLE_ON:
        statusDescription = '低功耗蓝牙已就绪';
        break;
      case access.BluetoothState.STATE_BLE_TURNING_OFF:
        statusDescription = '低功耗蓝牙关闭中...';
        break;
      case access.BluetoothState.STATE_TURNING_OFF:
        statusDescription = '传统蓝牙关闭中...';
        break;
      default:
        statusDescription = '未知状态';
    }
    
    console.log(`蓝牙状态更新: ${statusDescription}`);
  };
  
  // 订阅状态变化
  public startMonitoring(): void {
    if (this.isSubscribed) {
      console.warn('已存在状态监听,无需重复订阅');
      return;
    }
    
    try {
      access.on('stateChange', this.handleStateChange);
      this.isSubscribed = true;
      console.log('蓝牙状态监听已启动');
    } catch (error) {
      const err = error as BusinessError;
      console.error(`监听失败,错误码: ${err.code}, 错误信息: ${err.message}`);
    }
  }
  
  // 取消订阅
  public stopMonitoring(): void {
    if (!this.isSubscribed) {
      return;
    }
    
    try {
      access.off('stateChange', this.handleStateChange);
      this.isSubscribed = false;
      console.log('蓝牙状态监听已停止');
    } catch (error) {
      const err = error as BusinessError;
      console.error(`取消监听失败,错误码: ${err.code}, 错误信息: ${err.message}`);
    }
  }
}

2.3 开启蓝牙功能

2.3.1 开启流程
  1. 获取当前蓝牙状态

  2. 如果状态为STATE_OFF,则主动开启蓝牙

  3. 系统弹出授权对话框

  4. 用户同意后,蓝牙开启

2.3.2 实现代码
function enableDeviceBluetooth() {
    try {
        // 获取当前蓝牙状态
        let currentState = access.getState();
        
        // 检查是否为关闭状态
        if (currentState == access.BluetoothState.STATE_OFF) {
            // 主动开启蓝牙
            access.enableBluetooth();
            console.info('已请求开启蓝牙');
        } else {
            console.info('蓝牙已处于开启或中间状态');
        }
    } catch (err) {
        console.error('开启蓝牙失败,错误码: ' + (err as BusinessError).code + 
                     ', 错误信息: ' + (err as BusinessError).message);
    }
}

 用户交互:系统会弹出对话框提示"想要开启蓝牙",需要用户确认授权

2.4 关闭蓝牙功能

2.4.1 关闭流程
  1. 获取当前蓝牙状态

  2. 如果状态为STATE_ON,则主动关闭蓝牙

  3. 系统弹出确认对话框

  4. 用户同意后,蓝牙关闭

2.4.2 实现代码
function disableDeviceBluetooth() {
    try {
        // 获取当前蓝牙状态
        let currentState = access.getState();
        
        // 检查是否为开启状态
        if (currentState == access.BluetoothState.STATE_ON) {
            // 主动关闭蓝牙
            access.disableBluetooth();
            console.info('已请求关闭蓝牙');
        } else {
            console.info('蓝牙已处于关闭或中间状态');
        }
    } catch (err) {
        console.error('关闭蓝牙失败,错误码: ' + (err as BusinessError).code + 
                     ', 错误信息: ' + (err as BusinessError).message);
    }
}

 用户交互:系统会弹出对话框提示"想要关闭蓝牙",需要用户确认授权

2.5 完整示例

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

// 蓝牙适配器管理类
export class BluetoothAdapterController {
    
    // 状态变化回调函数
    private onBluetoothStatusChanged = (statusData: access.BluetoothState): void => {
        let statusDescription = '';
        
        switch(statusData) {
            case access.BluetoothState.STATE_OFF:
                statusDescription = 'STATE_OFF - 蓝牙已关闭';
                break;
            case access.BluetoothState.STATE_TURNING_ON:
                statusDescription = 'STATE_TURNING_ON - 蓝牙正在开启';
                break;
            case access.BluetoothState.STATE_ON:
                statusDescription = 'STATE_ON - 蓝牙已开启(可正常使用)';
                break;
            case access.BluetoothState.STATE_TURNING_OFF:
                statusDescription = 'STATE_TURNING_OFF - 蓝牙正在关闭';
                break;
            case access.BluetoothState.STATE_BLE_TURNING_ON:
                statusDescription = 'STATE_BLE_TURNING_ON - 低功耗蓝牙正在开启';
                break;
            case access.BluetoothState.STATE_BLE_ON:
                statusDescription = 'STATE_BLE_ON - 低功耗蓝牙已开启';
                break;
            case access.BluetoothState.STATE_BLE_TURNING_OFF:
                statusDescription = 'STATE_BLE_TURNING_OFF - 低功耗蓝牙正在关闭';
                break;
            default:
                statusDescription = '未知状态';
        }
        
        console.info('蓝牙状态变化: ' + statusDescription);
    };
    
    // 初始化蓝牙状态监听
    public initializeBluetoothMonitor(): void {
        try {
            // 订阅状态变化事件
            access.on('stateChange', this.onBluetoothStatusChanged);
            console.info('蓝牙状态监听已启动');
        } catch (error) {
            const btError = error as BusinessError;
            console.error('启动监听失败,错误码: ' + btError.code + 
                         ', 错误信息: ' + btError.message);
        }
    }
    
    // 开启蓝牙
    public requestEnableBluetooth(): void {
        try {
            // 获取当前状态
            const btStatus = access.getState();
            
            if (btStatus === access.BluetoothState.STATE_OFF) {
                // 蓝牙关闭状态下才请求开启
                access.enableBluetooth();
                console.info('已发送蓝牙开启请求');
            } else {
                console.info('蓝牙当前状态: ' + btStatus + ',无需重复开启');
            }
        } catch (error) {
            const btError = error as BusinessError;
            console.error('开启蓝牙失败,错误码: ' + btError.code + 
                         ', 错误信息: ' + btError.message);
        }
    }
    
    // 关闭蓝牙
    public requestDisableBluetooth(): void {
        try {
            // 获取当前状态
            const btStatus = access.getState();
            
            if (btStatus === access.BluetoothState.STATE_ON) {
                // 蓝牙开启状态下才请求关闭
                access.disableBluetooth();
                console.info('已发送蓝牙关闭请求');
            } else {
                console.info('蓝牙当前状态: ' + btStatus + ',无需重复关闭');
            }
        } catch (error) {
            const btError = error as BusinessError;
            console.error('关闭蓝牙失败,错误码: ' + btError.code + 
                         ', 错误信息: ' + btError.message);
        }
    }
    
    // 停止监听蓝牙状态
    public stopBluetoothMonitor(): void {
        try {
            access.off('stateChange', this.onBluetoothStatusChanged);
            console.info('蓝牙状态监听已停止');
        } catch (error) {
            const btError = error as BusinessError;
            console.error('停止监听失败,错误码: ' + btError.code + 
                         ', 错误信息: ' + btError.message);
        }
    }
    
    // 获取当前蓝牙状态描述
    public getCurrentBluetoothStatus(): string {
        try {
            const currentState = access.getState();
            return this.convertStateToString(currentState);
        } catch (error) {
            return '获取状态失败';
        }
    }
    
    // 状态值转描述文字
    private convertStateToString(state: access.BluetoothState): string {
        switch(state) {
            case access.BluetoothState.STATE_OFF:
                return '蓝牙关闭';
            case access.BluetoothState.STATE_ON:
                return '蓝牙开启';
            case access.BluetoothState.STATE_BLE_ON:
                return '低功耗蓝牙开启';
            default:
                return '状态转换中';
        }
    }
}

// 创建实例并导出
const bluetoothController = new BluetoothAdapterController();
export default bluetoothController;

三、注意事项

  1. 必须声明权限:在应用配置文件中明确声明蓝牙访问权限

  2. 动态权限申请:在运行时向用户申请授权

  3. 权限检查:在执行蓝牙操作前检查权限状态

  4. 权限拒绝处理:提供友好的用户引导,说明权限必要性

  5. 超时处理:为状态转换设置合理的超时机制

  6. 状态监听:始终监听状态变化,处理异常情况

    开启蓝牙/关闭蓝牙:系统会自动弹出"想要开启蓝牙"对话框

建议

在蓝牙开启后,可以:

  1. 设备扫描:发现周边蓝牙设备

  2. 设备过滤:根据服务UUID过滤目标设备

  3. 连接管理:建立和维护设备连接

  4. 数据传输:实现数据读写功能

针对BLE设备:

  1. 服务发现:获取设备提供的服务列表

  2. 特性读写:读取和写入设备特性值

  3. 通知订阅:订阅特性值变化通知

  4. 描述符操作:配置通信参数

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐