#HarmonyOS NEXT 体验官#开发一款BLE低功耗蓝牙调试助手(一)连接BLE服务端 原创 精华
1 简介
HarmonyOS NEXT 1+8+N万物互联生态中的N指的是各种互联设备,其依靠多种通信技术建立连接,如星闪NearLink、蓝牙。BLE(Bluetooth Low Energy,低功耗蓝牙)是常用的短距通信技术之一,应用场景广泛,如智能手表、健康监测设备、智能家居等。BLE是一种能够在低功耗情况下进行通信的蓝牙技术,与传统蓝牙相比,BLE的功耗更低,适用于需要长时间运行的低功耗设备。
本篇将介绍如何使用HarmonyOS NEXT原生能力开发一个BLE调试助手。效果为:
- 支持扫描BLE设备
- 能扫描周围的BLE设备,列出设备名称以及MAC地址。
- 支持连接、订阅、发送BLE消息:
- 在扫描列表中选择期望连接的设备,点击连接按钮即可与BLE设备建立连接。
- 支持订阅、写入特定BLE服务(9011)的特征值(9012)。
目前APP作为客户端,调试的BLE设备作为服务端(手机也可以做服务端,后续文章进行解答),APP效果如下:
2 环境搭建
我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。
软件要求
- DevEco Studio版本:DevEco Studio NEXT Developer Preview2及以上。
- HarmonyOS SDK版本:HarmonyOS NEXT Developer Preview2 SDK及以上。
硬件要求
- 设备类型:华为手机。
- HarmonyOS系统:HarmonyOS NEXT Developer Preview2及以上。
环境搭建
- 安装DevEco Studio,详情请参考下载和安装软件。
- 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,详情请参考配置开发环境。
- 开发者可以参考以下链接,完成设备调试的相关配置:
3 代码结构解读
本篇文档只对核心代码进行讲解,对于完整代码,开源后提供下载链接。
4 构建应用主界面
调试助手主要有一个功能页面,将扫描设备列表、数据展示区、功能按钮区依次由至下布局。为了方便后续扩展更多BLE调试功能,本文将APP客户端连接BLE服务端设备的实现放在一个子组件中。Index整体的布局框架如下:
下面介绍BleScan子组件的实现,主要满足的功能需求以及实现如下:
- 下拉BLE设备列表触底后能刷新扫描列表:List onReachEnd方法实现;
- 能突出显示被连接的BLE设备:判断被选择的List Item与渲染的index是否一致;
- 能修改需要发送到BLE设备的内容:使用TextArea
5 BLE功能开发
5.0 调试助手实现思路
调试助手需要具备扫描发现、连接、订阅、读写特征值等功能。调试助手扮演两个角色:BLE客户端、BLE服务端。本文讲解的是BLE客户端的实现,即实现与BLE服务端设备(例如鼠标或者Hi2821/Hi3863等有BLE的模组开发板)连接。调试助手实现思路如下:
无论APP作为BLE客户端还是服务端,都需要设置手机蓝牙、扫描蓝牙设备,BLE详细参考见:@ohos.bluetooth.ble (蓝牙ble模块)-ArkTS API-Connectivity Kit(短距通信服务)-网络-系统 - 华为HarmonyOS开发者 (huawei.com)
5.1 扫描BLE设备
在文件BLEScanManager.ets 中详细介绍了BLE 设备扫描的实现,扫描设备之前需要完成以下步骤:
-
1.申请ohos.permission.ACCESS_BLUETOOTH权限
-
2.引入bel库: import { ble } from ‘@kit.ConnectivityKit’,导出的扫描实例,便于后续使用。
-
3.开启扫描ble.startBLEScan([scanFilter], scanOptions);
- 根据需求设置扫描过滤,如设备ID、设备服务UUID等。、
- 构造扫描参数
- 开启扫描
-
4.获取扫描结果 ble.on(‘BLEDeviceFind’, (data: Array<ble.ScanResult>)
-
- 关闭扫描
在Index.ets的APP客户端连接BLE服务端实现子组件@Component struct BleScan中,我们在页面渲染之前就开启扫描以及订阅扫描结果,实现启动APP即扫描BLE设备。
5.2 连接与订阅BLE服务
扫描到设备后,下一步需要连接选择的BLE设备,在文件BLEScanManager.ets 中详细介绍了BLE 设备扫描的实现,关键的实现步骤如下:
-
1.获取GATT Client实例、主动连接目标设备
-
使用获取实例时要传入待连接的设备ID,即使用5.1节扫描到的BLE设备ID。
-
Client实例调用.connect()接口连接BLE设备。
-
同时订阅连接状态,便于后续数据收发时辨别连接状态。、
-
-
2.发现自定义服务
订阅BLE设备服务之前,需要明确服务信息、筛选服务。
- 定义需要处理的服务(UUID 9011)、特征(UUID 9012)以及特征描述(UUID 2902)可自行修改。
- 对连接设备的服务进行扫描,this.found确认是否有需要的服务以及特征。
-
3.订阅特征值变化 on(‘BLECharacteristicChange’,…)
- 订阅前先构造需要操作的特征及其描述
-
扫描到需要的服务后this.found==true:
-
此时可以使用setCharacteristicChangeNotification订阅特征值变化,
-
当.on(‘BLECharacteristicChange’)时可接收到订阅特征值characteristicChangeReq.characteristicValue
-
上述步骤1在点击连接按钮时触发;步骤2、3在点击订阅按钮时触发。
5.3 发送数据(写入BLE服务的特征值)
实质上,通用属性协议是GATT(Generic Attribute)定义了一套通用的属性和服务框架,通过GATT协议,蓝牙设备可以向其他设备提供服务,也可以从其他设备获取服务。调试助手APP作为客户端时也可以对服务端提供的特征值进行写入(前提是服务支持写入权限),APP向BLE设备发送数据其实就是对特征值的写入过程。主要步骤如下:
-
- 点击发送按钮时先确认在连接状态,传入需要发送的内容到发送接口.writeCharacteristicValue(“data”)
-
2.写入特征值
-
与订阅一样需要构建特征及其描述
-
将需要传输的数据转换为Uint8Array(如string转为Uint8Array)
-
WRITE_NO_RESPONSE对指定服务特征进行写入操作
-
6 BLE调试助手测试
配置测试设备:
- 设备名BLE_UART_SERVER
- 服务UUID配置为9011
- BLE设备定义:
- 9011服务的,其特征UUID为9012
- 9012特征提供读Read、无返回的写Write No Respond和通知Notify权限。
开启后启动调试助手,扫描到设备,点击连接即可。
编辑需要发送的数据,点击发送,可以在BLE服务端(海思Hi2821)收到了数据内容。
通过这篇认识了很多新板子。
都是星闪板子。等星闪API开放,继续补上星闪调试功能!
大佬 求源码