首页 / 资讯中心 / 文章详情

极空(JK)BMS 保护板 BLE Notify 获取流程

极空(JK)BMS 保护板 BLE Notify 获取流程 ★ FEATURED ARTICLE
极空JKBMS 保护板 BLE Notify 获取流程本文基于BmsGpsDashAPP 真机抓包验证整理适配 JK02_32S、24 串布局适合安卓 BLE 开发、极空 BMS 二次开发、DIY 储能、房车电池监控的开发者阅读。代码参考位置BmsGpsDash/app/src/main/java/com/gpsbsm/dashboard/ble/一、流程总览扫描匹配 → 连接 → 发现服务 → requestMtu → 写 CCCD 订阅 → (可选)发握手命令 → 被动收帧 → 校验解析 │ │ └────────────── 断连/超时 → 退避重连回到开头←──────────────────────────┘核心认知BLE Notify 是订阅后被动接收。 手机端仅需完成一次订阅保护板会持续主动上送数据实测推送间隔中位数约 510ms不需要轮询发请求查询。握手读指令属于兜底补救手段只有长时间收不到推送帧时才用来触发上报。很多新手踩坑一直循环下发读命令拿数据不仅浪费蓝牙带宽还容易触发 BMS 限流、丢包。二、扫描与匹配极空 BMS 的蓝牙广播信息受模组、固件版本影响稳定性参差不齐这是开发里第一个要重视的点。表格项目值说明广播名前缀JK标准命名形如JK-B2A24S15P/JK_B2A16S15P横杠、下划线两种分隔符都存在服务 UUID0000ffe0-.../0000ff00-...广播携带该服务 ID 可作为初步筛选条件✅ 最可靠方案固定 MAC 直连实测部分固件广播名自定义为mangge完全不匹配 JK 前缀过滤规则开发经验总结广播名称、服务 UUID 匹配都存在失效概率不同批次蓝牙模组、改版固件差异很大。 量产 / 稳定版逻辑建议用户手动扫描绑定一次 MAC 地址后续启动优先 MAC 直连不再依赖广播内容过滤。三、连接与订阅核心关键步骤Android BLE 硬性约束Gatt 操作串行执行同一时刻只能有一个指令处于 pending 状态并发操作会被底层静默丢弃不会抛出异常极难排查。1. 建立 GATT 连接device.connectGatt(context, false, callback, BluetoothDevice.TRANSPORT_LE)autoConnectfalse主动连接模式重连、超时逻辑由业务代码自行实现不使用系统后台自动重连系统 autoConnect 延迟高、不可控。2. 发现服务动态查找 Notify 特征禁止硬编码 UUIDonServicesDiscovered回调触发后遍历全部服务、特征通过属性位判断 Notify 特征兼容老模组特征位置偏移部分老模组通知特征在 FFE2for (svc in gatt.services) { for (ch in svc.characteristics) { if (ch.properties and BluetoothGattCharacteristic.PROPERTY_NOTIFY ! 0) { notifyChars.add(ch) } } }常用参考 UUID表格UUID用途0000ffe0-0000-1000-8000-00805f9b34fbBMS 主服务0000ffe1-0000-1000-8000-00805f9b34fb通知 写共用特征接收推送帧、下发读 / 设置命令都走这个特征3. 先请求 MTU再订阅 CCCD顺序不可颠倒gatt.requestMtu(517)目标帧长度接近 300 字节MTU 设置 517 可以实现单包传输避免大包分片。 ⚠️ 必须等待onMtuChanged回调成功之后再执行 CCCD 订阅流程MTU 请求和写描述符不能并发。 如果 MTU 协商失败停留在默认 23代码层组帧器也要支持分片拼接属于降级兼容逻辑。4. 写入 CCCD开启 Notify 通知对每一个筛选出来的 Notify 特征操作它的 2902 描述符val cccd ch.getDescriptor(UUID.fromString(00002902-0000-1000-8000-00805f9b34fb)) cccd.value BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE // 0x02,0x00 gatt.writeDescriptor(cccd)区分两个模式NOTIFICATION0x02 0x00不需要应答极空 BMS 使用这个INDICATION0x01 0x00需要设备应答极少用到多个特征需要订阅时链式回调执行写完一个收到onDescriptorWrite成功回调再发起下一个 writeDescriptor全部订阅完成才算就绪。5. 可选下发握手读命令兜底触发数据推送订阅完成后如果 3s 内没有收到 BMS 推送帧向 FFE1 特征下发 20 字节读请求。重点区分下发命令头 和 BMS 上报响应帧头字节序相反高频踩坑点下发命令头AA 55 90 EB板子推送响应帧头55 AA EB 9020 字节读请求命令结构表格偏移内容说明0~3AA 55 90 EB命令包头4寄存器编号0x97 设备信息帧0x96 单体电压信息帧5载荷长度读请求固定 0x006~9参数值读请求填充 010~18保留 9 字节✅必须清零抓包看到官方 APP 这里是内存脏数据直接复制会校验失败19sum8 校验和0~18 字节累加和 0xFF示例请求单体信息帧0x96完整 HEXAA 55 90 EB 96 00 00 00 00 00 00 00 00 00 00 00 00 00 00 19四、收帧、校验与组帧解析响应帧基础结构固定 300 字节表格偏移长度内容0~34帧头55 AA EB 9041帧类型0x01 设置帧 / 0x02 单体信息帧 / 0x03 设备信息帧 / 0x05 日志帧51帧计数器逐帧自增跳号代表丢包可统计丢帧率6~298293载荷区单体电压、总电流、SOC、温度、MOS 状态、告警位图等2991sum8 校验和0~298 全部字节累加 0xFF校验规则简单累加和 sum8不是 CRC很多 BMS 协议会混用 CRC不要搞混。BLE 数据流三大问题组帧器必须处理粘包MTU 较大时一次onCharacteristicChanged回调带回多帧完整数据断包分片MTU23 场景300 字节帧拆分为多个小包需要基于帧头 固定帧长重组脏字节干扰部分透传模组固件会混杂AT\r\n调试字符组帧器要支持同步重置跳过无效字节重新查找帧头✅ 推荐组帧方案滑动环形缓冲区收到字节写入缓冲区持续扫描缓冲区查找帧头55 AA EB 90判断剩余数据是否满足 300 字节长度满足 → 计算 sum8 校验校验通过交付上层解析校验失败丢弃首字节重新找帧头固件布局自动判别多版本兼容0x02 都代表单体信息帧但是载荷布局不一样不能只依靠帧类型判断表格布局类型判别规则字段特点JK02_24S固件主版本 11单体电压 uint16JK02_32S固件主版本 ≥11本文实测版本单体电压数据区偏移 16JK04特征识别单体电压采用 IEEE754 float 存储如果没有收到 0x03 设备信息帧使用字段合理性打分策略自动适配布局电压、温度、容量是否在物理合理区间。 一个约定值温度探头未接入时BMS 上报 -200.0℃业务层识别为传感器离线不要直接展示这个温度。五、超时、重连退避策略稳定长期运行的 BLE 设备超时和退避是保证不死连的关键表格事件超时阈值处理动作长时间无新推送帧6s链路僵死主动 gatt 关闭触发重连订阅就绪后无数据3s补发一次 0x96 读指令订阅后持续无数据12s判定链路被占用执行断连重连断连重试间隔1→2→4→8→15→30s指数退避达到 30s 之后固定 30s 重试扫描阶段同样退避防止频繁扫描耗电连接优先级绑定 MAC 直连 上一次成功连接 MAC自动记忆 广播扫描匹配连接成功后持久化 MAC实现 APP 打开自动连接的效果。六、高频踩坑清单避坑重点CCCD 并发写入循环批量 writeDescriptor后续请求静默丢失日志看起来订阅成功实际收不到通知必须链式回调串行执行MTU 协商和 CCCD 订阅并发两个 GATT 操作抢占通道MTU 协商失败停留在 23 字节触发大量分片下发命令保留位直接复制抓包脏数据10~18 字节必须清零否则 sum8 校验直接失败命令头、上报帧头颠倒下发 AA5590EB接收 55AAEB90是最高发的错误把 - 200℃当成有效温度这是探头未接的协议标记值广播过滤规则写死固件支持自定义蓝牙名称MAC 绑定才是稳定方案BMS 单连接限制极空保护板同一时间只允许一台蓝牙主机接入官方 APP 占用连接时第三方 APP 无法连上属于协议设计不是 bug不需要配对绑定FFE1 特征权限开放连接后直接订阅无 PIN 码、无加密配对流程七、写在最后极空 BMS 这套 Notify 主动推送模式相比传统一问一答的 BLE 协议带宽利用率更高、延迟更低适合电池实时监控场景。但安卓原生 BLE Gatt 串行机制、固件版本差异、模组广播不规范是开发过程中最耗费精力的地方。 组帧器、超时退避、多布局兼容这三块做好才能做到后台稳定长时间挂连。nRF Connect捕捉到的日志nRF Connect, 2026-10-11 mangge (28:D4:1E:13:4D:AB) I 20:37:46.359 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 80-38-01-00-00-00-00-00-00-00-00-00-30-F8-0B-01-00-00-00-00-00-00-00-47-D1-4F-00-00-71-70-00-00-35-00-00-00-85-64-18-00-60-00-00-00-B0-C7-C2-01-01-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-FF-00-01-00-00-00-01-00-00-00-00-00-E0-88-1F-40-00-00-00-00-40-1F-00-00-00-00-01-01-00-01-01-00-E5-CC-9B-11-00-00-00-00-28-01-30-F8-30-F8-01-00-9A-12-C0-0C-F7-05-00-00-80-51-01-00-00-00-01-01-00-00-00-00-00-00-00-00-00-FE-DF-7F-DC-0F-01-00-80-0B-00-00-00-15 I 20:37:46.381 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 41-54-0D-0A I 20:37:46.478 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 41-54-0D-0A I 20:37:46.592 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 55-AA-EB-90-02-1E-05-0D-04-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-FF-FF-FF-00-05-0D-00-00-00-00-6F-01-77-01-77-01-76-01-79-01-7E-01-7E-01-7E-01-7A-01-7B-01-7C-01-80-01-7D-01-78-01-75-01-78-01-77-01-74-01-73-01-75-01-78 I 20:37:46.592 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 01-7D-01-77-01-80-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-28-01-00-00-00-00 I 20:37:46.622 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 41-54-0D-0A I 20:37:46.729 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 41-54-0D-0A I 20:37:46.836 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 55-AA-EB-90-02-1F-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-05-0D-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-FF-FF-FF-00-05-0D-00-00-00-00-6F-01-77-01-77-01-76-01-79-01-7E-01-7E-01-7E-01-7A-01-7B-01-7C-01-80-01-7D-01-78-01-75-01-78-01-77-01-74-01-73-01-75-01-78-01-7D-01-77-01-80-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-28-01-00-00-00-00 I 20:37:46.863 Notification received from 0000ffe1-0000-1000-8000-00805f9b34fb, value: (0x) 82-38-01-00-00-00-00-00-00-00-00-00-30-F8-0B-01-00-00-00-00-00-00-00-47-D1-4F-00-00-71-70-00-00-35-00-00-00-85-64-18-00-60-00-00-00-B1-C7-C2-01-01-01-00-00-00-00-00-00-00-00-00-00-00-00-00-00-FF-00-01-00-00-00-01-00-00-00-00-00-E0-88-1F-40-00-00-00-00-40-1F-00-00-00-00-01-01-00-01-01-00-EA-CC-9B-11-00-00-00-00-28-01-30-F8-30-F8-01-00-9B-12-C0-0C-F7-05-00-00-80-51-01-00-00-00-01-01-00-00-00-00-00-00-00-00-00-FE-DF-7F-DC-0F-01-00-80-0B-00-00-00-20适合扩展方向数据本地存储、MQTT 上传、多 BMS 轮询、告警阈值判断、电池均衡状态解析。
阅读完成 · 觉得有帮助?
咨询建站