本文讲述的是在OpenHarmony轻量设备(L0设备)上进行BLE相关应用程序的开发。应用所在设备作为Gatt Client与其他Gatt Server设备进行连接和通信。

本文重点讲述BLE广播的实现。

BLE设备广播的接口

BLE设备可直接调用BLE的接口启动、停止发送广播报文。

// 开始发送BLE广播
startAdvertising(setting: AdvertiseSetting, advData: AdvertiseData, advResponse?: AdvertiseData): number
// 停止发送BLE广播。
stopAdvertising(): number

// 开始发送BLE广播。使用Callback异步回调。
startAdvertising(advertisingParams: AdvertisingParams, callback: AsyncCallback<number, number>): void
// 停止发送BLE广播。使用Callback异步回调。
stopAdvertising(advertisingId: number, callback: AsyncCallback<number>): void

详细的BLE设备连接接口说明请参考蓝牙ble模块

 

BLE设备广播接口的使用

以下为BLE设备广播的示例代码,通过按钮触发BLE设备广播报文的发送和停止。

1、点击"开始广播"按钮,开始发送广播报文。如果AdvertisingParams的duration参数设置为0,则代表一直发送广播报文,直到调用stopAdvertising接口才停止广播。

示例中AdvertisingParams的duration参数设置为2000,表示发送广播报文持续20秒钟,20秒钟后自动停止广播无需再调用stopAdvertising接口。

示例中发送的广播报文只携带了AD Type为0xFF的厂商自定义信息,不包含service的信息。

2、在广播停止前,点击"停止广播"按钮停止发送广播报文。

// connect.js
import ble from '@ohos.bluetooth.ble';

let advId = 0;

export default {
    data: {
       ...
    },       
    
    // 用户操作开始BLE发送广播报文
    onStartAdvertisingClick() {
        // 广播报文ad Type=0xff为manufacture部分,包含id+value
        // 广播报文的manufacture部分数据为: 0x0a ff 57 4b 50 96 50 c7 1f 60 60
        let manuArray = new Uint8Array([0x50,0x96,0x50,0xc7,0x1f,0x60,0x60]);
        if (manuArray == null) {
            console.error('failed to build manufacture data');
            return errEnum.failed;
        }

        let manuData = {
            manufactureId: 0x574B, // manufacture的id占据发送数据的前2个字节
            manufactureValue: manuArray.buffer
        };
        let advData = {
            serviceUuids: [], // 示例发送的广播报文不包含UUID
            manufactureData: [manuData],
            serviceData: [], // 示例发送的广播报文不包含service data
            includeDeviceName: false
        };

        let advSetting = {
            interval: 160, // 广播报文发送间隔 160slot = 100ms
            txPower: -7,
            connectable: true
        };
        let param = {
            advertisingSettings: advSetting,
            advertisingData: advData,
            duration: 2000 // 单位:10ms,广播持续20s后会自动停止广播
        };

        ble.startAdvertising(param, (err, advHandle) => {
            if (err) {
                console.error(`call ble startAdvertising failed, err ${err}`);
                return;
            }
            console.debug(`call ble startAdvertising success, handle ${advHandle}`);
            advId = advHandle;
        });
    },
    
    // 用户操作停止BLE发送广播报文
    onStopAdvertisingClick() {
        ble.stopAdvertising(advId, (err) => {
            if (err) {
                console.error(`call ble stopAdvertising failed, err ${err}`);
                return;
            }
            console.debug('call ble stopAdvertising success');
        });
    },
    
    ...
}

通过手机安装的蓝牙抓包工具nRF Connect,可以抓到上述示例中BLE设备发送的广播报文。

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐