更新记录

1.0.0(2026-04-24) 下载此版本

phy-ble-ota

PHY BLE OTA 固件升级SDK — 基于 uni-app BLE API 实现,支持 SLB (PHY6222)SBK/SBH 两种蓝牙设备的 OTA 无线固件升级。

功能特点

  • 支持 BLE 设备扫描、连接、断开
  • 支持 SLB 设备(PHY6222 芯片)OTA 固件升级(.bin 文件)
  • 支持 SBK/SBH 设备 OTA 固件升级(.hex / .hex16 文件)
  • 自动识别设备类型和服务特性
  • 支持多设备批量升级
  • 支持 App 模式 → OTA 模式自动切换(SBK设备)
  • 支持固件版本校验
  • 完整的升级进度回调
  • 兼容 Android 和 iOS 平台

适用平台

平台 支持
App (Android)
App (iOS)
微信小程序

安装

方式一:DCloud 插件市场(推荐)

  1. 在 DCloud 插件市场搜索 phy-ble-ota
  2. 点击"使用插件"导入到你的 uni-app 项目
  3. 或直接在项目中 npm install(如果已发布到 npm)

方式二:手动安装

uni_modules/phy-ble-ota 目录复制到你的 uni-app 项目根目录。

快速开始

1. 导入 SDK

import {
  handleSearchDevice,
  handleStopScanBleDevices,
  handleListenOTACallBack,
  selectOTAFile,
  selectOTADevice,
  otaDeviceList,
} from '@/uni_modules/phy-ble-ota/js_sdk'

2. 初始化并注册回调

onLoad() {
  // 注册OTA事件回调
  handleListenOTACallBack((errCode, errMsg, deviceID) => {
    console.log(`[${deviceID}] ${errCode}: ${errMsg}`)
    // 处理进度更新、错误、成功等事件
    switch (errCode) {
      case 11027: // 进度更新
        const progress = errMsg.match(/进度条:(\d+\.?\d*)%/)
        if (progress) {
          this.upgradeProgress = parseFloat(progress[1])
        }
        break
      case 11032: // 升级完成
        console.log('升级成功!')
        break
      case 10001: // 错误
      case 11030:
        console.error('升级错误:', errMsg)
        break
    }
  })
}

3. 扫描设备

// 开始扫描
handleSearchDevice(
  true,           // repeat - 是否重复上报
  this.isAndroid, // 是否Android平台
  (devices) => {  // 发现设备回调
    devices.forEach(device => {
      if (device.name && device.deviceId) {
        console.log('发现设备:', device.name, device.deviceId)
      }
    })
  },
  () => {         // 扫描启动成功回调
    console.log('扫描已启动')
  }
)

// 停止扫描
handleStopScanBleDevices(() => {
  console.log('扫描已停止')
})

4. 选择固件文件

// 从本地读取文件后传入
uni.readFile({
  filePath: '/static/firmware.bin',
  success: (res) => {
    selectOTAFile(
      'firmware.bin',     // 文件名(根据后缀自动识别设备类型)
      this.isAndroid,     // 是否Android
      res.data            // 文件内容
    )
  }
})

5. 选择设备并开始升级

// 添加到升级列表
const deviceInfo = {
  name: device.localName || device.name,
  deviceId: device.deviceId,
  mac: device.deviceId,
  disconnectTimes: 0,
  OTAType: 0,
  famewareCheck: false
}
otaDeviceList.push(deviceInfo)

// 开始升级
selectOTADevice(otaDeviceList)

API 参考

蓝牙扫描与连接

函数 说明
handleSearchDevice(repeat, deviceType, devicesCall, startScanCall) 扫描蓝牙设备。Android需先检查定位权限
handleStopScanBleDevices(call) 停止扫描
handleConnectionBleDevice(deviceId) 连接BLE设备,自动识别SLB/SBK服务
handleListenBLEScan(call) 监听蓝牙适配器状态和扫描状态变化
closeBLEConnection(deviceId) 关闭蓝牙连接
disconnectedDevice(deviceId) 设备断开回调处理(根据文件类型分发到SLB或SBK)

固件升级

函数 说明
selectOTAFile(fileName, phoneType, data) 选择升级文件,根据后缀自动路由(.bin → SLB,.hex/.hex16 → SBK)
selectOTADevice(deviceList) 选择要升级的设备并自动连接第一个设备
handleListenOTACallBack(call) 注册OTA事件回调
handleGetMTUSize() 获取当前MTU大小(默认20字节)

SLB 设备专用

函数 说明
SLBSelectedFile(mPath, data) 处理SLB格式的bin文件,提取版本信息
SLBReadyCall(deviceId) SLB设备准备好,开始版本校验
SLBReceiveData(deviceId, data) 处理SLB设备返回的数据
disconnectedSLBDevice(deviceId) SLB设备断开连接处理
sendSLBCMD(deviceId, cmd) 向SLB设备发送命令

SBK/SBH 设备专用

函数 说明
SBHSelectedFile(mPath, data, deviceType) 处理SBK格式的hex/hex16文件,拆分为分区数据
SBKAppReadyCall(deviceId) SBK App模式准备就绪
SBKOTAReadyCall(deviceId) SBK OTA模式准备就绪
AppModeReceiveData(value, deviceId) SBK App模式数据接收处理
SBKOTAReceiveData(deviceId, data) SBK OTA模式数据接收处理
disconnectedSBKDevice(deviceId) SBK设备断开连接处理

工具函数

函数 说明
message(content, call, showCancel, title) 弹出提示框
ab2hex(buffer) ArrayBuffer 转十六进制字符串
blueToothWriteValue(hexString) 十六进制字符串转 ArrayBuffer(用于 BLE 写入)
hexToByteArray(hexString) 十六进制字符串转字节数组
crc16_CCITT(str) CRC16-CCITT 校验
ToHexFormat(original, length) 数字转指定位数十六进制字符串

UUID 常量

常量 说明
SLB_SERVICE_UUID 0000FEB3-... SLB 蓝牙服务 UUID
SLB_WRITECharacteristic_ID 0000FED5-... SLB 写特征值(带响应)
SLB_WRITEWithNoRsp_ID 0000FED7-... SLB 写特征值(无响应)
SLB_NOTIFYCharacteristic_ID 0000FED8-... SLB 通知特征值
SBH_OTA_SERVICE_UUID 5833FF01-... SBH OTA 蓝牙服务 UUID
SBH_OTA_WRITE_Characteristic 5833FF02-... SBH OTA 写特征值
SBH_OTA_NOTIFY_Characteristic 5833FF03-... SBH OTA 通知特征值
SBH_OTA_WRITE_WithNoResponse 5833FF04-... SBH OTA 写特征值(无响应)

回调事件码

事件码 说明 类型
10001 蓝牙适配器不可用/初始化失败 错误
10003 定位未开启或授权失败 错误
10005 升级文件版本信息 信息
10006 文件格式不支持 错误
10007 BLE 开始扫描 信息
10008 BLE 扫描停止/蓝牙关闭 信息
10009 开始二次扫描 信息
11001 连接蓝牙设备 信息
11002 连接成功 成功
11003 连接断开/连接失败 信息
11006 发现SLB/SBK服务 成功
11007 未能找到OTA服务 错误
11008 服务UUID被占用 错误
11009 获取设备服务失败 错误
11010 SBH App模式确认 成功
11011 SBK OTA模式确认 成功
11012 SLB OTA特性确认 成功
11013 特性异常 错误
11014 文件与设备不匹配 错误
11017 开启特征值监听失败 错误
11019 写数据失败 错误
11020/11021/11022 准备好开始交互 成功
11025 设备固件版本 信息
11026 升级成功/重启指令 成功
11027 升级进度 进度
11030 版本校验失败 错误
11032 升级完成后移出列表 成功

支持的设备

SLB 设备 (PHY6222)

  • 固件格式: .bin
  • 蓝牙服务: FEB3
  • 特征值: FED5(写), FED7(写无响应), FED8(通知)

SBK/SBH 设备

  • 固件格式: .hex / .hex16
  • 蓝牙服务: 5833FF01
  • 特征值: FF02(写), FF03(通知), FF04(写无响应)
  • 支持 App → OTA 模式自动切换

项目结构

uni_modules/phy-ble-ota/
├── package.json          # 插件清单
├── readme.md             # 本文档
└── js_sdk/
    ├── index.js          # 统一入口,重新导出所有公开API
    ├── blemanager.js     # BLE管理器 - 设备扫描/连接/服务发现
    ├── bleuniapi.js      # uni-app BLE API 底层封装
    ├── sbk_ota.js        # SBK/SBH 设备 OTA 协议实现
    ├── slb_ota.js        # SLB 设备 OTA 协议实现
    └── util.js           # 工具函数(CRC、Hex转换等)

开发指南

导入方式

// 方式1:从入口文件导入(推荐)
import { handleSearchDevice, selectOTAFile } from '@/uni_modules/phy-ble-ota/js_sdk'

// 方式2:按需导入具体模块
import { handleWriteAction } from '@/uni_modules/phy-ble-ota/js_sdk/bleuniapi.js'

完整升级流程

  1. 初始化 → 注册 handleListenOTACallBack 监听升级事件
  2. 选择文件selectOTAFile(fileName, isAndroid, fileData)
  3. 扫描设备handleSearchDevice(true, isAndroid, onDeviceFound, onScanStart)
  4. 选择设备 → 创建 deviceInfo 对象,添加到 otaDeviceList
  5. 开始升级selectOTADevice(otaDeviceList) — 自动连接并开始升级
  6. 监控进度 → 通过回调中的事件码 11027 获取进度百分比
  7. 升级完成 → 收到事件码 11032 表示升级成功

许可证

MIT


平台兼容性

phy-ble-ota

PHY BLE OTA 固件升级SDK — 基于 uni-app BLE API 实现,支持 SLB (PHY6222)SBK/SBH 两种蓝牙设备的 OTA 无线固件升级。

功能特点

  • 支持 BLE 设备扫描、连接、断开
  • 支持 SLB 设备(PHY6222 芯片)OTA 固件升级(.bin 文件)
  • 支持 SBK/SBH 设备 OTA 固件升级(.hex / .hex16 文件)
  • 自动识别设备类型和服务特性
  • 支持多设备批量升级
  • 支持 App 模式 → OTA 模式自动切换(SBK设备)
  • 支持固件版本校验
  • 完整的升级进度回调
  • 兼容 Android 和 iOS 平台

适用平台

平台 支持
App (Android)
App (iOS)
微信小程序

安装

方式一:DCloud 插件市场(推荐)

  1. 在 DCloud 插件市场搜索 phy-ble-ota
  2. 点击"使用插件"导入到你的 uni-app 项目
  3. 或直接在项目中 npm install(如果已发布到 npm)

方式二:手动安装

uni_modules/phy-ble-ota 目录复制到你的 uni-app 项目根目录。

快速开始

1. 导入 SDK

import {
  handleSearchDevice,
  handleStopScanBleDevices,
  handleListenOTACallBack,
  selectOTAFile,
  selectOTADevice,
  otaDeviceList,
} from '@/uni_modules/phy-ble-ota/js_sdk'

2. 初始化并注册回调

onLoad() {
  // 注册OTA事件回调
  handleListenOTACallBack((errCode, errMsg, deviceID) => {
    console.log(`[${deviceID}] ${errCode}: ${errMsg}`)
    // 处理进度更新、错误、成功等事件
    switch (errCode) {
      case 11027: // 进度更新
        const progress = errMsg.match(/进度条:(\d+\.?\d*)%/)
        if (progress) {
          this.upgradeProgress = parseFloat(progress[1])
        }
        break
      case 11032: // 升级完成
        console.log('升级成功!')
        break
      case 10001: // 错误
      case 11030:
        console.error('升级错误:', errMsg)
        break
    }
  })
}

3. 扫描设备

// 开始扫描
handleSearchDevice(
  true,           // repeat - 是否重复上报
  this.isAndroid, // 是否Android平台
  (devices) => {  // 发现设备回调
    devices.forEach(device => {
      if (device.name && device.deviceId) {
        console.log('发现设备:', device.name, device.deviceId)
      }
    })
  },
  () => {         // 扫描启动成功回调
    console.log('扫描已启动')
  }
)

// 停止扫描
handleStopScanBleDevices(() => {
  console.log('扫描已停止')
})

4. 选择固件文件

// 从本地读取文件后传入
uni.readFile({
  filePath: '/static/firmware.bin',
  success: (res) => {
    selectOTAFile(
      'firmware.bin',     // 文件名(根据后缀自动识别设备类型)
      this.isAndroid,     // 是否Android
      res.data            // 文件内容
    )
  }
})

5. 选择设备并开始升级

// 添加到升级列表
const deviceInfo = {
  name: device.localName || device.name,
  deviceId: device.deviceId,
  mac: device.deviceId,
  disconnectTimes: 0,
  OTAType: 0,
  famewareCheck: false
}
otaDeviceList.push(deviceInfo)

// 开始升级
selectOTADevice(otaDeviceList)

API 参考

蓝牙扫描与连接

函数 说明
handleSearchDevice(repeat, deviceType, devicesCall, startScanCall) 扫描蓝牙设备。Android需先检查定位权限
handleStopScanBleDevices(call) 停止扫描
handleConnectionBleDevice(deviceId) 连接BLE设备,自动识别SLB/SBK服务
handleListenBLEScan(call) 监听蓝牙适配器状态和扫描状态变化
closeBLEConnection(deviceId) 关闭蓝牙连接
disconnectedDevice(deviceId) 设备断开回调处理(根据文件类型分发到SLB或SBK)

固件升级

函数 说明
selectOTAFile(fileName, phoneType, data) 选择升级文件,根据后缀自动路由(.bin → SLB,.hex/.hex16 → SBK)
selectOTADevice(deviceList) 选择要升级的设备并自动连接第一个设备
handleListenOTACallBack(call) 注册OTA事件回调
handleGetMTUSize() 获取当前MTU大小(默认20字节)

SLB 设备专用

函数 说明
SLBSelectedFile(mPath, data) 处理SLB格式的bin文件,提取版本信息
SLBReadyCall(deviceId) SLB设备准备好,开始版本校验
SLBReceiveData(deviceId, data) 处理SLB设备返回的数据
disconnectedSLBDevice(deviceId) SLB设备断开连接处理
sendSLBCMD(deviceId, cmd) 向SLB设备发送命令

SBK/SBH 设备专用

函数 说明
SBHSelectedFile(mPath, data, deviceType) 处理SBK格式的hex/hex16文件,拆分为分区数据
SBKAppReadyCall(deviceId) SBK App模式准备就绪
SBKOTAReadyCall(deviceId) SBK OTA模式准备就绪
AppModeReceiveData(value, deviceId) SBK App模式数据接收处理
SBKOTAReceiveData(deviceId, data) SBK OTA模式数据接收处理
disconnectedSBKDevice(deviceId) SBK设备断开连接处理

工具函数

函数 说明
message(content, call, showCancel, title) 弹出提示框
ab2hex(buffer) ArrayBuffer 转十六进制字符串
blueToothWriteValue(hexString) 十六进制字符串转 ArrayBuffer(用于 BLE 写入)
hexToByteArray(hexString) 十六进制字符串转字节数组
crc16_CCITT(str) CRC16-CCITT 校验
ToHexFormat(original, length) 数字转指定位数十六进制字符串

UUID 常量

常量 说明
SLB_SERVICE_UUID 0000FEB3-... SLB 蓝牙服务 UUID
SLB_WRITECharacteristic_ID 0000FED5-... SLB 写特征值(带响应)
SLB_WRITEWithNoRsp_ID 0000FED7-... SLB 写特征值(无响应)
SLB_NOTIFYCharacteristic_ID 0000FED8-... SLB 通知特征值
SBH_OTA_SERVICE_UUID 5833FF01-... SBH OTA 蓝牙服务 UUID
SBH_OTA_WRITE_Characteristic 5833FF02-... SBH OTA 写特征值
SBH_OTA_NOTIFY_Characteristic 5833FF03-... SBH OTA 通知特征值
SBH_OTA_WRITE_WithNoResponse 5833FF04-... SBH OTA 写特征值(无响应)

回调事件码

事件码 说明 类型
10001 蓝牙适配器不可用/初始化失败 错误
10003 定位未开启或授权失败 错误
10005 升级文件版本信息 信息
10006 文件格式不支持 错误
10007 BLE 开始扫描 信息
10008 BLE 扫描停止/蓝牙关闭 信息
10009 开始二次扫描 信息
11001 连接蓝牙设备 信息
11002 连接成功 成功
11003 连接断开/连接失败 信息
11006 发现SLB/SBK服务 成功
11007 未能找到OTA服务 错误
11008 服务UUID被占用 错误
11009 获取设备服务失败 错误
11010 SBH App模式确认 成功
11011 SBK OTA模式确认 成功
11012 SLB OTA特性确认 成功
11013 特性异常 错误
11014 文件与设备不匹配 错误
11017 开启特征值监听失败 错误
11019 写数据失败 错误
11020/11021/11022 准备好开始交互 成功
11025 设备固件版本 信息
11026 升级成功/重启指令 成功
11027 升级进度 进度
11030 版本校验失败 错误
11032 升级完成后移出列表 成功

支持的设备

SLB 设备 (PHY6222)

  • 固件格式: .bin
  • 蓝牙服务: FEB3
  • 特征值: FED5(写), FED7(写无响应), FED8(通知)

SBK/SBH 设备

  • 固件格式: .hex / .hex16
  • 蓝牙服务: 5833FF01
  • 特征值: FF02(写), FF03(通知), FF04(写无响应)
  • 支持 App → OTA 模式自动切换

项目结构

uni_modules/phy-ble-ota/
├── package.json          # 插件清单
├── readme.md             # 本文档
└── js_sdk/
    ├── index.js          # 统一入口,重新导出所有公开API
    ├── blemanager.js     # BLE管理器 - 设备扫描/连接/服务发现
    ├── bleuniapi.js      # uni-app BLE API 底层封装
    ├── sbk_ota.js        # SBK/SBH 设备 OTA 协议实现
    ├── slb_ota.js        # SLB 设备 OTA 协议实现
    └── util.js           # 工具函数(CRC、Hex转换等)

开发指南

导入方式

// 方式1:从入口文件导入(推荐)
import { handleSearchDevice, selectOTAFile } from '@/uni_modules/phy-ble-ota/js_sdk'

// 方式2:按需导入具体模块
import { handleWriteAction } from '@/uni_modules/phy-ble-ota/js_sdk/bleuniapi.js'

完整升级流程

  1. 初始化 → 注册 handleListenOTACallBack 监听升级事件
  2. 选择文件selectOTAFile(fileName, isAndroid, fileData)
  3. 扫描设备handleSearchDevice(true, isAndroid, onDeviceFound, onScanStart)
  4. 选择设备 → 创建 deviceInfo 对象,添加到 otaDeviceList
  5. 开始升级selectOTADevice(otaDeviceList) — 自动连接并开始升级
  6. 监控进度 → 通过回调中的事件码 11027 获取进度百分比
  7. 升级完成 → 收到事件码 11032 表示升级成功

许可证

MIT

隐私、权限声明

1. 本插件需要申请的系统权限列表:

┌─────────────────────────────────────────────┬──────────────────────────────────────────────┬──────┐ │ 权限 │ 用途 │ 必需 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ BLUETOOTH (Android) │ 开启蓝牙功能 │ 是 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ BLUETOOTH_ADMIN (Android) │ 扫描和连接蓝牙设备 │ 是 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ ACCESS_FINE_LOCATION (Android 6+) │ BLE 扫描需要精确定位权限(Android 系统要求) │ 是 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ ACCESS_COARSE_LOCATION (Android 6+) │ BLE 扫描需要粗略定位权限(Android 系统要求) │ 是 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ NSBluetoothAlwaysUsageDescription (iOS) │ 使用蓝牙进行设备通信 │ 是 │ ├─────────────────────────────────────────────┼──────────────────────────────────────────────┼──────┤ │ NSBluetoothPeripheralUsageDescription (iOS) │ 扫描和连接 BLE 外设 │ 是 │ └─────────────────────────────────────────────┴──────────────────────────────────────────────┴──────┘ 说明: - 定位权限仅 Android 平台需要(Android 系统要求 BLE 扫描必须开启定位),插件本身不获取也不使用位置信息 - 插件本身不声明权限,权限由宿主 manifest.json 配置

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

本插件不采集任何数据,不向任何服务器发送数据。 - 没有使用 uni.request、fetch、XMLHttpRequest 等任何网络请求 API - 没有集成任何第三方统计或分析 SDK - 没有读取用户个人信息(通讯录、相册、短信等) - 没有使用 uni.getStorage 以外的持久化存储(且仅用于本地缓存,不涉及上传) - 所有蓝牙通信数据仅在本地设备与 BLE 外设之间传输 - 固件文件由用户主动选择,仅用于本地 BLE 写入

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

本插件不包含任何形式的广告。 - 无广告 SDK 集成 - 无广告展示 - 无广告采集 - 无流量分发

许可协议

MIT协议

暂无用户评论。