更新记录
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 调试器、不做多秤并行连接池
建议调用顺序:init → startScan 或 getBondedDevices → connect → 接收 onWeight 或发控制命令 → disconnect / destroy。请先扫描(或取已配对列表)再连接。各异步方法均支持 success / fail / complete;fail 含 errCode / 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 档可复制正则库;每项含 id、title、regex、weightGroup(见 §4.2) |
| STX / CR | 协议字节常量 0x02 / 0x0D;耀华 STX 档默认帧头/帧尾 |
| appendAndExtractFrames | 将 incoming 追加到 buffer,按 frameHeader / frameTrailer / frameDelimiter / frameFixedLen 切出完整帧;超出 maxBufferSize 时截尾保留;返回 { buffer, frames } |
| parseFrame | 按 protocolProfile 与 template 配置将单帧 ByteArray 解析为 WeightSample 或 null |
| parseYaohuaStx | 解析耀华 STX 帧(可含首尾 STX/CR),内部转文本后走 parseAsciiWw |
| parseAsciiWw | 解析 ww/wn/sw/sn 等连续输出文本为 WeightSample |
| parseTemplate | 用 templateRegex 与捕获组序号 templateWeightGroup 从帧文本提取重量 |
| buildCommandBytes | 将 ASCII 命令串转为 ByteArray;sendRaw 与 tare/zero 等控制命令同源 |
| applyThrottle | 节流判断:距上次 emit 不足 throttleMs 时返回 true(应跳过本次 onWeight) |
| calcReconnectDelayMs | 计算第 attempt 次(从 0 起)自动重连等待毫秒:base × 2^n(n 上限 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' 时,将下列某一条复制到 templateRegex,templateWeightGroup 取捕获组序号(下列均为 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_LIBRARY 取 regex / weightGroup(id、title 便于业务侧展示或切换)。
示例:
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;请先
startScan再connect(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与无数据重试) - 不保证弱网/频繁开关蓝牙下的无限重连;本插件不做连接池与多秤会话

收藏人数:
购买普通授权版(
试用
赞赏(0)
下载 26
赞赏 0
下载 12575274
赞赏 1949
赞赏
京公网安备:11010802035340号