Profile 实战

BLE Profile 实战:Battery 与 Device Information 基础服务

发布于 2026-07-22 · 来自「嵌入式江湖」技术专栏

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 都把它们当"标配底座"。

四、实战坑提醒

  1. Battery Level 必须是 0~100:超范围会被主机截断或显示异常,计算时做好限幅。
  2. 电量 Notify 别刷太频繁:电量变化慢,变了再推即可,频繁 Notify 纯耗电。
  3. DIS 字符串用 UTF-8 编码,含中文时尤其注意,否则主机显示乱码。
  4. PnP ID 的 Vendor ID Source 别填错:SIG 分配的写 2,USB.org 分配的写 1,Vendor ID 要对应。
  5. DIS 全部只读,不需要 CCCD,别给它们加 Notify/Indicate 描述符。
  6. 多电池用多个 Battery Service 实例,并配 Battery Service State 等特性区分,不要在一个 Level 里塞多个电池。
  7. 固件/型号版本号格式统一(如 "1.2.3"),方便售后和日志排查。
  8. 别把敏感信息写进 Serial Number / DIS:这些特性通常未加密可读,序列号等可被任意连接方读取。

一句话总结:Battery(0x180F,电量 0x2A19)+ DIS(0x180A,厂商/型号/版本 + PnP ID 0x2A50)是 BLE 产品的"底座",实现成本低、收益高——能显著提升主机识别和电量体验,几乎每个产品都该带,尤其是 HID 类。

更多 BLE / 鸿蒙星闪 / 芯片选型 / MCU 实战,持续更新