Battery Service(0x180F)和 Device Information Service(0x180A)是所有 BLE 产品都该带的"基础设施"服务:一个让主机显示电量,一个让主机识别设备是谁、什么版本。它们简单,却最常被忽略——结果就是手机上显示"未知设备"、电量永远不更新。本文把它们一起讲清楚。
一、Battery Service(0x180F)
只有一个最常用的核心特性:
| 特性 |
UUID |
属性 |
说明 |
| Battery Level |
0x2A19 |
Read / Notify |
1 字节,0~100 表示百分比 |
- 主机可以直接读,也可以订阅 Notify(开 CCCD 0x2902):电量变化时设备主动推新值。
- 规范里还有 Battery Level Status(0x2A1B)、Battery Power State(0x2A1A)等,但基础产品只实现 Battery Level 就够了。
- 多电池设备(如带主机和配件):可以注册多个 Battery Service 实例,每个实例用 Battery Service State / Battery Service Level 等特性标注,简单设备一个实例即可。
二、Device Information Service(0x180A)
它是一组"只读字符串/标识"特性,用于设备自报家门:
| 特性 |
UUID |
类型 |
说明 |
| Manufacturer Name String |
0x2A29 |
UTF8S |
厂商名(如 "Nordic") |
| Model Number String |
0x2A24 |
UTF8S |
型号 |
| Serial Number String |
0x2A25 |
UTF8S |
序列号 |
| Hardware Revision String |
0x2A27 |
UTF8S |
硬件版本 |
| Firmware Revision String |
0x2A26 |
UTF8S |
固件版本 |
| Software Revision String |
0x2A28 |
UTF8S |
软件版本 |
| System ID |
0x2A23 |
8 字节 |
前 4 = 公司/OUI 标识,后 4 = 厂内唯一号 |
| PnP ID |
0x2A50 |
7 字节 |
Vendor ID Source + Vendor ID + Product ID + Product Version |
| Regulatory Cert Data List |
0x2A2A |
只读 |
认证数据(不常实现) |
- 规范没有强制必选特性,但 Manufacturer Name + Model Number 强烈建议实现:操作系统和 App 靠它们显示正确设备名和型号。
- PnP ID(0x2A50) 很实用:第 1 字节 Vendor ID Source(1 = USB.org,2 = Bluetooth SIG),接着 Vendor ID(2B)、Product ID(2B)、Product Version(2B)。它帮系统匹配图标/驱动,很多平台靠它识别设备类别。
- System ID(0x2A23) 结构类似 MAC:前 4 字节放 OUI 或公司标识,后 4 字节放厂内唯一编号。
三、为什么这两个最该带
- DIS 决定"你是谁":Windows / Android / iOS 的蓝牙面板、系统设置里显示的制造商和型号,基本来自 DIS。缺失时只能显示一串 MAC 或"未知设备"。
- Battery 决定"还剩多少电":用户看不到电量,体验断档;很多系统还会在电量低时弹提醒,前提是设备有 Battery Service 且电量在变时 Notify。
- 它们是通用搭档:HOGP(HID)规范明确要求 HID 设备带 Battery + DIS;HRS、CGM 类产品也建议带。几乎所有 SIG Profile 都把它们当"标配底座"。
四、实战坑提醒
- Battery Level 必须是 0~100:超范围会被主机截断或显示异常,计算时做好限幅。
- 电量 Notify 别刷太频繁:电量变化慢,变了再推即可,频繁 Notify 纯耗电。
- DIS 字符串用 UTF-8 编码,含中文时尤其注意,否则主机显示乱码。
- PnP ID 的 Vendor ID Source 别填错:SIG 分配的写 2,USB.org 分配的写 1,Vendor ID 要对应。
- DIS 全部只读,不需要 CCCD,别给它们加 Notify/Indicate 描述符。
- 多电池用多个 Battery Service 实例,并配 Battery Service State 等特性区分,不要在一个 Level 里塞多个电池。
- 固件/型号版本号格式统一(如 "1.2.3"),方便售后和日志排查。
- 别把敏感信息写进 Serial Number / DIS:这些特性通常未加密可读,序列号等可被任意连接方读取。
一句话总结:Battery(0x180F,电量 0x2A19)+ DIS(0x180A,厂商/型号/版本 + PnP ID 0x2A50)是 BLE 产品的"底座",实现成本低、收益高——能显著提升主机识别和电量体验,几乎每个产品都该带,尤其是 HID 类。