更新记录

1.2.8(2026-09-07)

  • 修复 Android:success/fail 回调 ClassCast(扁平 Option 不可强转为 BaseOption;入口去掉 coerce 重建)
  • .vue 直接传对象;.uvue 须 as XxxOption;须重打自定义基座并云端传统打包
  • 不传参行为与上一版兼容

1.2.7(2026-09-07)

  • 优化 uni-app x:入口将对象字面量归一化为 Option,业务页可直接传对象调用 API,无需再写 as XxxOption
  • 使用须制作自定义基座,并走云端传统打包(不支持离线打包、安心打包)
  • 不传参行为与上一版兼容

1.2.6(2026-09-06)

  • 修复协议 ArrayBuffer 转换:ByteArray.size Number.from
  • 修复称重组帧协议:ByteArray.size/下标统一 Number.from 与 toInt
  • 修复 App 端成功回调与驱动稳定性:去掉 undefined、可变属性强制解包改为局部拷贝;iOS BLE 状态/特性用 Number.from
  • 修复 Android 运行时 ClassCastException:成功回调与 onWeight 结果改为 UTSJSONObject 别名,避免强转为独立 Result 类型
  • 修复 Android 称重数据接收:共享会话对 ByteArray 使用 .size;去掉帧数组强制解包
  • 修复 Android SPP 读循环:available/read 返回值先 Number.from 再比较
  • 修复 Android BLE GATT 枚举:services/characteristics 的 size 先 Number.from 再循环
  • 修复 invoke 回调判空调用;可选 number 去掉 undefined 联合;部分 Android 原生返回值改 Number.from、可变属性局部拷贝
  • 使用须制作自定义基座,并走云端传统打包(不支持离线打包、安心打包)
  • 【务必使用此版本及以上版本打包使用,低版本存在缺陷】
查看更多

平台兼容性

uni-app(4.11)

Vue2 Vue3 Vue3插件版本 Chrome Safari app-vue app-vue插件版本 app-nvue app-nvue插件版本 Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本
× 1.2.6 × × 1.2.6 1.2.6 5.0 1.2.6 12 1.2.6 12 1.2.6
微信小程序 微信小程序插件版本 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
2.22.0 1.2.6 × × × × × × × × - × ×

uni-app x(4.11)

Chrome Safari Android Android插件版本 iOS iOS插件版本 鸿蒙 鸿蒙插件版本 微信小程序 微信小程序插件版本
× × 5.0 1.2.6 12 1.2.6 12 1.2.6 2.22.0 1.2.6

breao-bleweight 使用说明

蓝牙电子秤接入插件,适用于收银、计件、巡检等连续称重场景。

当前版本:1.2.8

  • Android:BLE 与经典蓝牙 SPP
  • iOS / 鸿蒙 / 微信小程序:BLE
  • 能力:可配置协议档与组帧;连续称重回调;去皮 / 置零 / 切单位 / 原始命令;getBondedDevices;有限退避重连
  • 不做 USB/RS232 有线秤、不做通用 BLE 调试器、不做多秤并行连接池

建议调用顺序:initstartScangetBondedDevicesconnect → 接收 onWeight 或发控制命令 → disconnect / destroy。请先扫描(或取已配对列表)再连接。各异步方法均支持 success / fail / completefailerrCode / errMsg。插件为单例连接语义:再次 init 会销毁上一实例。


1. 环境要求

  • HBuilderX 4.11 及以上
  • uni-app Vue3(App-vue / App-nvue)或 uni-app x(App;微信能力与 uni-app 一致)
  • 支持:App-Android、App-iOS、App-鸿蒙、微信小程序;uni-app 与 uni-app x(含 x 鸿蒙 BLE)
  • 不支持:H5 及其它小程序
  • Android 最低 API:21;iOS 最低 12;鸿蒙最低 API:12;微信小程序基础库建议 2.22.0 及以上
  • App 真机调试须制作自定义基座;正式发版须购买授权后走云端传统打包
  • 授权绑定唯一 appid + 包名

2. 安装与引入

将插件目录放入工程的 uni_modules/breao-bleweight,或从插件市场导入后同步。

import {
  init,
  destroy,
  startScan,
  stopScan,
  connect,
  disconnect,
  getBondedDevices,
  getConnectionState,
  tare,
  zero,
  toggleUnit,
  sendRaw,
  getLastWeight,
} from '@/uni_modules/breao-bleweight'

// 联调或自研解析时可选导入(各端 app-* / 微信入口同样导出):
// DEFAULT_NAME_HINTS、PROTOCOL_TEMPLATE_LIBRARY、appendAndExtractFrames、
// parseFrame、parseYaohuaStx、parseAsciiWw、parseTemplate、buildCommandBytes、
// applyThrottle、calcReconnectDelayMs

3. API

3.1 init / destroy

init({
  transport: 'ble', // Android 老秤可设 'spp',详见 §4
  protocolProfile: 'yaohua_stx',
  onWeight(res) {
    console.log(res.weight, res.unit, res.stable)
  },
  onDisconnected(res) {
    console.log('disconnected', res)
  },
  success() {},
  fail(err) {
    console.error(err.errCode, err.errMsg)
  },
})

destroy({ success() {}, fail(err) { console.error(err.errCode, err.errMsg) } })

3.2 扫描与连接

startScan({
  timeout: 10000,
  success(res) {
    // res.devices: [{ name, address, rssi?, bonded? }]
  },
  fail(err) { console.error(err.errCode, err.errMsg) },
})

connect({
  address: 'XX:XX:XX:XX:XX:XX',
  success() {},
  fail(err) { console.error(err.errCode, err.errMsg) },
})

disconnect({ success() {}, fail() {} })
stopScan({ success() {}, fail() {} })

getBondedDevices({
  success(res) {
    // Android / 鸿蒙:res.devices 为系统已配对列表;iOS / 微信返回不支持
  },
  fail(err) { console.error(err.errCode, err.errMsg) },
})

请先扫描再连接(未扫描直接 connect 会返回中文错误「未找到该设备,请先扫描再连接」);亦可先 getBondedDevices(Android/鸿蒙)再连。Android SPP 建议系统已配对。参数默认值见 §4。

3.3 控制命令

tare({ success() {}, fail() {} })
zero({ success() {}, fail() {} })
toggleUnit({ success() {}, fail() {} })
sendRaw({ data: 'RN1', success() {}, fail() {} })

命令内容取自 init 中的 tareCommand / zeroCommand / toggleUnitCommand;亦可用 sendRaw 发送任意 ASCII 串。

3.4 状态与最近称重

getConnectionState({
  success(res) {
    // res.state: disconnected | connecting | connected | busy
    // res.busy: 扫描/连接等互斥操作进行中时为 true
  },
})

getLastWeight({
  success(res) {
    // res.sample 为最近一次解析结果;尚无数据时为 null
  },
})

3.5 onWeight 字段

字段 类型 说明
weight number 主重量数值
unit string 单位,如 kg、g、lb
stable boolean 是否稳定
zero boolean 是否零位
overload boolean 是否超载
gross number 毛重;协议含则解析,否则可能缺省
net number 净重;协议含则解析,否则可能缺省
tare number 皮重;协议含则解析,否则可能缺省
raw string 原始帧文本

3.6 协议辅助(同步)

各端 index 均导出下列纯函数,供联调、离线解析或与插件内组帧逻辑对齐:

符号 说明
DEFAULT_NAME_HINTS 内置设备名称过滤关键字;init / startScan 未传 nameHints 时使用
PROTOCOL_TEMPLATE_LIBRARY template 档可复制正则库;每项含 idtitleregexweightGroup(见 §4.2)
STX / CR 协议字节常量 0x02 / 0x0D;耀华 STX 档默认帧头/帧尾
appendAndExtractFrames incoming 追加到 buffer,按 frameHeader / frameTrailer / frameDelimiter / frameFixedLen 切出完整帧;超出 maxBufferSize 时截尾保留;返回 { buffer, frames }
parseFrame protocolProfile 与 template 配置将单帧 ByteArray 解析为 WeightSamplenull
parseYaohuaStx 解析耀华 STX 帧(可含首尾 STX/CR),内部转文本后走 parseAsciiWw
parseAsciiWw 解析 ww/wn/sw/sn 等连续输出文本为 WeightSample
parseTemplate templateRegex 与捕获组序号 templateWeightGroup 从帧文本提取重量
buildCommandBytes 将 ASCII 命令串转为 ByteArraysendRawtare/zero 等控制命令同源
applyThrottle 节流判断:距上次 emit 不足 throttleMs 时返回 true(应跳过本次 onWeight
calcReconnectDelayMs 计算第 attempt 次(从 0 起)自动重连等待毫秒:base × 2^nn 上限 8)

4. 可配置项

字段 位置 默认 说明
transport init ble ble 或 spp;spp 仅 Android;其它端选 spp 返回 9070009
protocolProfile init yaohua_stx 协议档:yaohua_stx、ascii_ww、cas_g、stable_kg、template
debug init false 调试日志
bleServiceUuid init BLE 服务 UUID;无则遍历服务
bleNotifyUuid init 通知特征 UUID;无则宽松匹配首个可通知特征
bleWriteUuid init 写入特征 UUID;无则宽松匹配可写特征
bleChunkSize init 端默认 BLE 分片写字节数;经典 SPP 忽略
bleWriteInterval init 端默认 BLE 分片写间隔毫秒;经典 SPP 忽略
discoverDelayMs init 300 连接成功后延迟再发现服务/开通知,单位毫秒
continuousCommand init RN1 连接成功后发送的连续输出命令串;空串表示不自动发送
continuousRetryCount init 3 连接后若暂无称重数据,重发连续命令的次数
continuousRetryIntervalMs init 2000 无数据重试间隔,单位毫秒
tareCommand init ST07 去皮命令 ASCII 串,由 tare 发送
zeroCommand init SZ09 置零命令 ASCII 串,由 zero 发送
toggleUnitCommand init SU06 切单位命令 ASCII 串,由 toggleUnit 发送
frameHeader init 0x02 组帧帧头;yaohua_stx 默认 STX
frameTrailer init 0x0d 组帧帧尾;yaohua_stx 默认 CR
frameDelimiter init 分隔符组帧;非空时按分隔符切帧
frameFixedLen init 0 定长组帧字节数;大于 0 时按定长切帧
maxBufferSize init 4096 RX 缓冲区上限,防止粘包堆积占满内存
templateRegex init protocolProfile=template 时使用的正则,须能捕获重量
templateWeightGroup init 1 template 正则中重量所在捕获组序号(从 1 起)
weightThrottleMs init 80 onWeight 最小回调间隔毫秒;传 0 关闭节流
onlyStable init false true 时仅在 stable 为 true 时触发 onWeight
autoReconnectOnce init false 兼容开关:true 且未传 autoReconnectMax 时等价于重连 1 次(详见 §8)
autoReconnectMax init 0 意外断线后有限自动重连次数;0 关闭
autoReconnectBackoffMs init 500 自动重连基础退避毫秒;第 n 次等待 base×2^(n-1)
nameHints init / startScan 内置关键字 扫描名称过滤;默认含 SCALE、WEIGHT、YAOHUA、CAS 等
onWeight init 解析成功后的称重回调
onDisconnected init 被动断开回调
timeout startScan 10000 扫描超时毫秒
includeBonded startScan true 是否合并系统已配对设备(Android SPP 常用)
address connect 必填 设备地址:Android 多为 MAC;iOS/微信为 BLE deviceId
timeout connect 15000 连接超时毫秒
data sendRaw 必填 自定义 ASCII 命令串,按字节原样写出

不传参即用默认值。

4.1 协议档说明

档名 说明
yaohua_stx 以 STX(0x02)开头、CR(0x0D)结尾的帧;解析重量、单位及稳定/零位/超载等位(协议含则填)
ascii_ww 文本中含 ww/wn 等连续输出关键字的行式帧;ww 等视为稳定,wn 等视为未稳定
cas_g CAS/托利多类 G/ 毛重或 N/ 净重行;含 ST/US 时写入 stable;净重优先作 weight
stable_kg 行内浮点公斤(如 12.345kg);可选 ST(稳定)/ US(不稳定)标志
template 使用 templateRegex / templateWeightGroup 从帧文本提取重量;其它状态位按匹配结果尽力填充

联调建议:先用串口/厂商手册确认帧样例,再选内置档;内置档不匹配时用 template,并按实际帧头尾配置 frameHeader / frameTrailer / frameDelimiter

4.2 template 示例正则库

protocolProfile: 'template' 时,将下列某一条复制到 templateRegextemplateWeightGroup 取捕获组序号(下列均为 1)。

插件导出 PROTOCOL_TEMPLATE_LIBRARY 与下表一致,可直接按 id 选取:

id title regex weightGroup
cas_gross CAS/托利多毛重 G/xxx.xxxkg G[/,\s]*([0-9.+-]+)\s*kg 1
cas_net 净重 N/xxx.xxxkg N[/,\s]*([0-9.+-]+)\s*kg 1
stable_kg_inline 行内浮点公斤 ([0-9]+(?:\.[0-9]+)?)\s*kg 1
ww_kg ww/wn 文本重量 w[wn]\s*([0-9.+-]+)\s*kg 1

手写正则示例(与上表等价):

# CAS/托利多毛重 G/xxx.xxxkg
G[/,\s]*([0-9.+-]+)\s*kg

# 净重 N/xxx.xxxkg
N[/,\s]*([0-9.+-]+)\s*kg

# 行内浮点公斤(可前置 ST/US 等杂讯)
([0-9]+(?:\.[0-9]+)?)\s*kg

# ww/wn 文本重量
w[wn]\s*([0-9.+-]+)\s*kg

亦可从 PROTOCOL_TEMPLATE_LIBRARYregex / weightGroupidtitle 便于业务侧展示或切换)。

示例:

init({
  protocolProfile: 'template',
  templateRegex: 'G[/,\s]*([0-9.+-]+)\\s*kg',
  templateWeightGroup: 1,
  // 行式输出常见以换行切帧:
  frameDelimiter: '\n',
  frameHeader: '',
  frameTrailer: '',
  onWeight(res) { console.log(res.weight) },
})

5. 完整示例

import {
  init,
  startScan,
  connect,
  tare,
  getLastWeight,
  disconnect,
  destroy,
} from '@/uni_modules/breao-bleweight'

init({
  transport: 'ble',
  protocolProfile: 'yaohua_stx',
  continuousCommand: 'RN1',
  weightThrottleMs: 80,
  onWeight(res) {
    console.log('weight', res.weight, res.unit, 'stable=', res.stable)
  },
  onDisconnected() {
    console.log('scale disconnected')
  },
  success() {
    startScan({
      timeout: 8000,
      success(scanRes) {
        const dev = scanRes.devices && scanRes.devices[0]
        if (!dev) return
        connect({
          address: dev.address,
          success() {
            tare({
              success() {
                getLastWeight({
                  success(last) {
                    console.log('last', last.sample)
                    disconnect({ success() { destroy({}) } })
                  },
                })
              },
            })
          },
        })
      },
    })
  },
  fail(err) {
    console.error(err.errCode, err.errMsg)
  },
})

6. 权限

请在应用 manifest / 隐私弹窗中按需声明,并说明用于连接电子秤与接收称重数据。

平台 权限 说明
Android android.permission.BLUETOOTH 蓝牙基础访问(API≤30)
Android android.permission.BLUETOOTH_ADMIN 蓝牙管理(API≤30)
Android android.permission.BLUETOOTH_SCAN 蓝牙扫描(Android 12+)
Android android.permission.BLUETOOTH_CONNECT 蓝牙连接(Android 12+)
Android android.permission.ACCESS_FINE_LOCATION 蓝牙扫描辅助定位
Android android.permission.ACCESS_COARSE_LOCATION 蓝牙扫描辅助定位
Android (运行时)BLUETOOTH_SCAN / CONNECT / 定位 扫描与连接前插件会 requestSystemPermission 申请;业务须引导用户同意并开启蓝牙
iOS NSBluetoothAlwaysUsageDescription 始终访问蓝牙
iOS NSBluetoothPeripheralUsageDescription 蓝牙外设访问
鸿蒙 ohos.permission.ACCESS_BLUETOOTH 蓝牙访问
鸿蒙 ohos.permission.DISCOVER_BLUETOOTH 蓝牙发现
鸿蒙 ohos.permission.MANAGE_BLUETOOTH 蓝牙管理
微信 openBluetoothAdapter 初始化蓝牙适配器
微信 startBluetoothDevicesDiscovery 扫描蓝牙设备
微信 createBLEConnection 建立 BLE 连接
微信 getBLEDeviceServices 获取 BLE 服务
微信 getBLEDeviceCharacteristics 获取 BLE 特征
微信 writeBLECharacteristicValue 写入 BLE 特征
微信 notifyBLECharacteristicValueChange 订阅 BLE 通知
微信 onBLECharacteristicValueChange 接收 BLE 通知数据

7. 错误码(907)

含义
9070001 成功
9070002 失败(忙碌、连接失败等)
9070003 未初始化或配置缺失
9070004 蓝牙未开启或不可用
9070005 未连接
9070006 参数非法
9070007 当前平台不支持
9070008 驱动不匹配或创建失败
9070009 传输方式不支持(如非 Android 选 spp)
9070010 尚未实现(预留)
9070011 帧解析错误

8. 平台注意

  • uni-app x(.uvue):须对入参使用 as XxxOption(见官方 error17);.vue 可直接传对象。须使用 1.2.8+ 并重打自定义基座
  • Android 默认 transport: 'ble';老式经典蓝牙秤请设 transport: 'spp',建议系统先配对
  • Android 扫描/连接前插件会申请蓝牙与定位运行时权限;业务仍须在隐私弹窗与系统设置中引导用户开启
  • iOS / 微信几乎只能 BLE;请先 startScanconnect(iOS 依赖扫描缓存外设)
  • 鸿蒙为 BLE GATT 通知读,不支持 spp;支持 getBondedDevices
  • 先扫后连:未扫描/未取已配对列表直接 connect 返回 9070006 及中文提示
  • 耀华类秤连上后若无数据,插件会按配置发送 continuousCommand(默认 RN1)并重试
  • BLE UUID 留空时自动匹配可通知 / 可写特征;特殊机型请在 init 填写厂商 UUID
  • template 档须提供能捕获重量的正则,并用 templateWeightGroup 指定组号;示例见 §4.2
  • 切换 transport 或彻底释放资源时,请 destroy 后再重新 init

断线与恢复

  • 主动 disconnect / destroy 属于有意关闭,不会触发 onDisconnected,也不会自动重连
  • 意外断线(GATT 关闭、链路丢失等)会回调 onDisconnected;业务可在此提示用户或自行 connect
  • autoReconnectMax > 0(或兼容 autoReconnectOnce: true)时:同一次 init 生命周期内,按次数上限自动用上次成功地址重连,间隔按 autoReconnectBackoffMs 指数退避(如 500、1000、2000…)
  • 用尽重连次数后需业务自行 connect,或 destroy 后重新 init
  • destroy 后清空 onWeight / onDisconnected,不会再回调
  • 自动重连成功后仍会走连接后流程(含 continuousCommand 与无数据重试)
  • 不保证弱网/频繁开关蓝牙下的无限重连;本插件不做连接池与多秤会话

隐私、权限声明

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

Android: android.permission.BLUETOOTH、android.permission.BLUETOOTH_ADMIN(API≤30); android.permission.BLUETOOTH_SCAN、android.permission.BLUETOOTH_CONNECT(Android 12+); android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION(蓝牙扫描辅助)。 iOS: NSBluetoothAlwaysUsageDescription、NSBluetoothPeripheralUsageDescription。 鸿蒙: ohos.permission.ACCESS_BLUETOOTH、ohos.permission.DISCOVER_BLUETOOTH、ohos.permission.MANAGE_BLUETOOTH。 微信小程序: 蓝牙能力(openBluetoothAdapter、startBluetoothDevicesDiscovery、createBLEConnection、getBLEDeviceServices、getBLEDeviceCharacteristics、writeBLECharacteristicValue、notifyBLECharacteristicValueChange、onBLECharacteristicValueChange;需用户授权蓝牙)。 用途:电子秤扫描、连接、连续称重数据接收与控制命令发送。

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

不采集、不上传任何数据;称重数据仅经本机蓝牙从已连接电子秤读取,控制命令仅发往用户已连接的设备。

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

暂无用户评论。