【HarmonyOS】鸿蒙应用蓝牙功能实现
前言
蓝牙技术是一种无线通信技术,可以在短距离内传输数据。它是由爱立信公司于1994年提出的,使用2.4 GHz的ISM频段,可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机等各种设备。
特点是低功耗、低成本、简单易用。目前已经发展到了第五代,支持更高的数据传输速率和更广的覆盖范围。
蓝牙实现原理
蓝牙的实现原理是基于无线电技术的短距离通信协议,使用2.4GHz频段的无线电波进行通信,使用频率跳跃技术(Frequency Hopping Spread Spectrum,FHSS)来避免与其他无线设备的干扰。
在通信过程中,蓝牙设备会发送和接收数据包,并且使用不同的蓝牙协议来控制通信流程和数据传输。
蓝牙跳频技术的原理
蓝牙跳频技术主要基于频率跳跃技术,即通过在不同频率上快速跳跃来发送数据。这种技术可以防止干扰和噪声影响数据传输,提高数据传输的可靠性。具体来说,当某条频率受到干扰或噪声时,系统会自动切换到其他频率上进行传输,从而确保数据的完整性和稳定性。
DEMO示例
以下为蓝牙开关和状态控制
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';export class BlueToothMgr {private static mBlueToothMgr: BlueToothMgr | undefined = undefined;public Ins(){if(BlueToothMgr.mBlueToothMgr){BlueToothMgr.mBlueToothMgr = new BlueToothMgr();}return BlueToothMgr.mBlueToothMgr;}// STATE_OFF 0 表示蓝牙已关闭。// STATE_TURNING_ON 1 表示蓝牙正在打开。// STATE_ON 2 表示蓝牙已打开。// STATE_TURNING_OFF 3 表示蓝牙正在关闭。// STATE_BLE_TURNING_ON 4 表示蓝牙正在打开LE-only模式。// STATE_BLE_ON 5 表示蓝牙正处于LE-only模式。// STATE_BLE_TURNING_OFF 6 表示蓝牙正在关闭LE-only模式。/*** 设置蓝牙访问(开关状态)* @param isAccess true: 打开蓝牙*/setBlueToothAccess(isAccess: boolean){try {if(isAccess){access.enableBluetooth();access.on('stateChange', (data: access.BluetoothState) => {let btStateMessage = this.switchState(data);if (btStateMessage == 'STATE_ON') {access.off('stateChange');}console.info('bluetooth statues: ' + btStateMessage);})}else{access.disableBluetooth();access.on('stateChange', (data: access.BluetoothState) => {let btStateMessage = this.switchState(data);if (btStateMessage == 'STATE_OFF') {access.off('stateChange');}console.info("bluetooth statues: " + btStateMessage);})}} catch (err) {console.error('errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);}}private switchState(data: access.BluetoothState){let btStateMessage = '';switch (data) {case 0:btStateMessage += 'STATE_OFF';break;case 1:btStateMessage += 'STATE_TURNING_ON';break;case 2:btStateMessage += 'STATE_ON';break;case 3:btStateMessage += 'STATE_TURNING_OFF';break;case 4:btStateMessage += 'STATE_BLE_TURNING_ON';break;case 5:btStateMessage += 'STATE_BLE_ON';break;case 6:btStateMessage += 'STATE_BLE_TURNING_OFF';break;default:btStateMessage += 'unknown status';break;}return btStateMessage;}
}
import { access } from '@kit.ConnectivityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { BlueToothMgr } from '../manager/BlueToothMgr';
import { abilityAccessCtrl, common } from '@kit.AbilityKit';
struct Index {private TAG: string = "BlueToothTest";// 蓝牙状态 isStartBlueTooth: boolean = false; userGrant: boolean = false;async aboutToAppear() {await this.requestBlueToothPermission();let state = access.getState();console.log(this.TAG, "getState state: " + state);if(state == 2){this.isStartBlueTooth = true;}else{this.isStartBlueTooth = false;}}// 用户申请权限async reqPermissionsFromUser(): Promise<number[]> {let context = getContext() as common.UIAbilityContext;let atManager = abilityAccessCtrl.createAtManager();let grantStatus = await atManager.requestPermissionsFromUser(context, ['ohos.permission.ACCESS_BLUETOOTH']);return grantStatus.authResults;}// 用户申请蓝牙权限async requestBlueToothPermission() {let grantStatus = await this.reqPermissionsFromUser();for (let i = 0; i < grantStatus.length; i++) {if (grantStatus[i] === 0) {// 用户授权,可以继续访问目标操作this.userGrant = true;}}}setBlueToothState =()=>{try {if(!this.isStartBlueTooth){BlueToothMgr.Ins().setBlueToothAccess(true);}else{BlueToothMgr.Ins().setBlueToothAccess(false);}let state = access.getState();if(state == 2){this.isStartBlueTooth = true;}else{this.isStartBlueTooth = false;}console.log(this.TAG, "getState state: " + state);} catch (err) {console.error(this.TAG,'errCode: ' + (err as BusinessError).code + ', errMessage: ' + (err as BusinessError).message);}}build() {RelativeContainer() {if(this.userGrant){Text("蓝牙状态:" + this.isStartBlueTooth ? "开启" : "关闭").id('HelloWorld').fontSize(50).fontWeight(FontWeight.Bold).alignRules({center: { anchor: '__container__', align: VerticalAlign.Center },middle: { anchor: '__container__', align: HorizontalAlign.Center }}).onClick(this.setBlueToothState)}}.height('100%').width('100%')}
}
加权限配置:
"requestPermissions": [{"name" : "ohos.permission.ACCESS_BLUETOOTH","reason": "$string:permission_name","usedScene": {"abilities": ["EntryAbility"],"when":"inuse"}}]
操作日志: