2、鸿蒙BLE开发环境搭建:DevEco Studio安装、SDK配置、创建第一个BLE工程、模拟器与真机调试

好,咱们直接进入正题。做鸿蒙BLE开发,第一步就是把家伙事儿备齐。说白了,就是装好IDE、配好SDK、然后跑通第一个工程。这一步要是卡住了,后面全是白搭。我见过不少新手在这上面折腾半天,其实只要按步骤来,十分钟就能搞定。

2.1 DevEco Studio安装:别下错版本

DevEco Studio是华为官方的IDE,基于IntelliJ IDEA定制的。我个人习惯直接去华为开发者官网下载,别去第三方站点,你想想看,万一夹带点私货,那可就麻烦了。

注意: 下载时一定要选对版本。目前主流的稳定版是3.1或4.0系列。如果你要做BLE开发,建议用4.0以上版本,对低功耗蓝牙的支持更完善。我曾经遇到过用3.0版本死活连不上某些蓝牙芯片,后来发现是IDE的API映射有问题。

安装过程很简单,双击安装包,一路Next就行。但有两点我建议你注意:

  • 安装路径不要有中文——这是老生常谈了,但总有人踩坑。
  • 记得勾选“添加到PATH”——方便后续在命令行里调用hdc等工具。

2.2 SDK配置:选对API版本

装好IDE后,第一件事就是配SDK。打开DevEco Studio,点击 Configure → Settings → SDK Manager。你会看到一堆API版本,从API 6到API 12都有。

做BLE开发,我建议你至少选API 9以上。为什么?因为API 9开始,鸿蒙的蓝牙框架才真正稳定下来。API 8的BLE接口有不少坑,比如连接回调有时会丢失。嗯,这里要注意,如果你要兼容老设备,可以同时装多个版本。

小技巧: 我个人习惯把SDK装到固态硬盘上,编译速度会快很多。另外,SDK下载如果太慢,可以试试用华为的镜像源,在SDK Manager里把下载源改成 https://repo.huaweicloud.com

配好SDK后,记得检查一下 build.gradle 里的配置:

// 在entry模块的build.gradle中
ohos {
  compileSdkVersion 9
  defaultConfig {
    compatibleSdkVersion 9
  }
}

这里 compileSdkVersioncompatibleSdkVersion 最好保持一致,避免编译时出现奇怪的兼容性问题。

2.3 创建第一个BLE工程:从模板开始

SDK配好了,咱们来创建第一个工程。点击 File → New → Create Project。在模板选择里,找到 Empty Ability 或者 Feature Ability。我个人建议选 Empty Ability,干净利落,没有多余代码干扰你理解。

工程创建好后,你会看到这样的目录结构:

MyBleApp/
├── entry/
│   ├── src/
│   │   ├── main/
│   │   │   ├── java/
│   │   │   │   └── com/example/mybleapp/
│   │   │   │       └── MainAbilitySlice.java
│   │   │   ├── resources/
│   │   │   └── config.json
│   │   └── test/
│   └── build.gradle
├── gradle/
└── build.gradle

接下来,我们要在 config.json 里声明蓝牙权限。这是很多人容易忘的一步。不声明权限,代码写得再漂亮也白搭。

// config.json 中的module部分
"reqPermissions": [
  {
    "name": "ohos.permission.USE_BLUETOOTH"
  },
  {
    "name": "ohos.permission.DISCOVER_BLUETOOTH"
  },
  {
    "name": "ohos.permission.LOCATION"
  }
]
重点: 鸿蒙的BLE权限和Android不太一样。除了蓝牙权限,LOCATION 权限也是必须的,因为低功耗蓝牙扫描会用到位置信息。我曾经有个项目,扫描死活不出设备,查了半天才发现是忘了加位置权限。

2.4 模拟器与真机调试:别全指望模拟器

工程写好了,总得跑起来看看效果。DevEco Studio提供了两种调试方式:模拟器和真机。

2.4.1 模拟器调试

模拟器在 Tools → Device Manager 里启动。选择 Phone 类型的模拟器,点击启动就行。模拟器的好处是方便,不用插线,随时可以测。

但说实话,BLE开发不能全指望模拟器。为什么?因为模拟器里的蓝牙是虚拟的,它模拟不了真实的信号衰减、连接中断这些情况。我建议你只在模拟器上做UI调试和基本逻辑验证,真正的蓝牙通信测试,一定要上真机。

避坑指南: 我曾经在模拟器上跑BLE扫描,一切正常。结果上了真机,扫描间隔设得太短,导致设备发热严重。模拟器不会暴露这种问题,所以真机测试必不可少。

2.4.2 真机调试

真机调试需要做几步准备:

  1. 打开开发者模式:在手机设置里,连续点击“版本号”7次,直到提示“您已处于开发者模式”。
  2. 开启USB调试:在开发者选项里,打开 USB调试仅充电模式下允许ADB调试
  3. 连接电脑:用数据线连上电脑,手机上会弹出一个授权窗口,点“允许”。
  4. 在IDE里选择设备:点击运行按钮旁边的设备下拉框,选择你的手机。

如果IDE识别不到设备,可以试试在命令行里输入 hdc list targets。如果返回空,说明驱动没装好。去华为官网下载 HiSuite 或者手动安装USB驱动就行。

2.5 第一个BLE扫描代码:验证环境

环境搭好了,咱们写几行代码验证一下。在 MainAbilitySlice.java 里,添加一个简单的BLE扫描:

import ohos.bluetooth.BluetoothHost;
import ohos.bluetooth.ble.BleCentralManager;
import ohos.bluetooth.ble.BleScanCallback;
import ohos.bluetooth.ble.BleScanResult;

public class MainAbilitySlice extends AbilitySlice {
  private BleCentralManager centralManager;

  @Override
  public void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);

    // 初始化BLE中心管理器
    centralManager = new BleCentralManager(this);

    // 开始扫描
    centralManager.startScan(new BleScanCallback() {
      @Override
      public void onScanResult(BleScanResult result) {
        // 打印扫描到的设备
        System.out.println("发现设备: " + result.getDevice().getDeviceName());
      }

      @Override
      public void onScanFailed(int errorCode) {
        System.out.println("扫描失败,错误码: " + errorCode);
      }
    });
  }

  @Override
  protected void onStop() {
    super.onStop();
    // 记得停止扫描,不然耗电很快
    if (centralManager != null) {
      centralManager.stopScan();
    }
  }
}

这段代码很简单,就是启动BLE扫描,然后把发现的设备名打印出来。如果你在真机上跑起来,Log里能看到周围蓝牙设备的名字,那就说明环境完全OK了。

提示: 扫描回调里不要做耗时操作,比如写数据库或者网络请求。BLE回调是在Binder线程里执行的,阻塞了会影响后续扫描结果。我一般会在回调里用Handler把数据抛到主线程处理。

好了,环境搭建就到这里。下一章咱们会深入BLE的扫描参数配置,比如怎么设置扫描间隔、怎么过滤特定设备。这些东西在实际项目中非常关键,搞不好就会把功耗做得很差。咱们到时候细聊。