# PGEAR CAN-Sniffer G1 使用说明

> 更新日期：2026-10-01  
> 适用范围：当前 PGEAR CAN-Sniffer G1 固件的 BLE 数据、RaceChrono DIY 和 Wi-Fi 原始 CAN 采集功能。

## 1. 产品介绍

PGEAR CAN-Sniffer G1 是一款 CAN 总线数据采集设备，可将车辆总线上的数据通过蓝牙低功耗（BLE）或 Wi-Fi 传输给手机、电脑，用于查看车辆参数、记录行驶数据和分析 CAN 报文。

设备负责接收和转发 CAN 数据。发动机转速、车速、油门、温度等具体参数，需要由接收端根据相应车型的数据定义进行解析。连接成功不代表已经获得该车型的全部参数；不同车型、年款和接入位置可能使用不同的 CAN ID 和计算规则。

### 1.1 使用方式

| 使用方式 | 接收端 | 主要用途 |
| --- | --- | --- |
| BLE Profile 数据 | 支持 PGEAR CAN-Sniffer G1 接口的应用 | 根据车型配置采集指定 CAN ID，解析并显示车辆参数 |
| RaceChrono DIY BLE | 支持 DIY CAN-Bus 功能的 RaceChrono 应用 | 在 RaceChrono 中配置车辆通道，记录和分析车辆数据 |
| Wi-Fi 原始数据 | SavvyCAN 或兼容 GVRET TCP 的工具 | 查看原始报文、采集日志、分析车型协议 |

### 1.2 当前连接参数

| 项目 | 参数 |
| --- | --- |
| 正式名称 | PGEAR CAN-Sniffer G1 |
| VCC 输入电压 | **4.5–40 V DC** |
| 内部供电 | DC-DC 降压转换为 3.3 V |
| CAN 线路抗干扰 | 共模滤波，抑制高频共模噪声 |
| 蓝牙设备名称 | `PGEAR CAN-Sniffer G1` |
| Wi-Fi 热点名称 | `PGEAR CAN-Sniffer G1` |
| Wi-Fi 密码 | `12345678` |
| Wi-Fi 设备地址 | `192.168.4.1` |
| 原始数据连接协议 | GVRET over TCP |
| TCP 端口 | `23` |
| CAN 通道数量 | 1 |
| 当前 CAN 速率 | **500 kbps** |
| CAN 工作模式 | 只监听（Listen-only） |
| CAN 数据类型 | 经典 CAN，单帧数据最多 8 字节 |
| 默认启动状态 | BLE 数据模式，Wi-Fi 关闭 |

当前固件不主动向 CAN 总线发送报文，不提供主动 OBD 查询、故障码清除或报文注入功能。当前应用入口固定使用 500 kbps；在 Profile 或电脑软件中填写其他速率不会改变设备的实际 CAN 速率。

### 1.3 电源与线路技术特点

**宽范围直流输入。** VCC 支持 4.5–40 V 直流输入，覆盖常见 12 V、24 V 电源的标称电压。设备内部通过 DC-DC 开关降压电路将输入转换为 3.3 V，为内部电路供电。开关降压方式适合较高输入电压到低压的转换，有助于减少线性降压带来的功耗与发热。

**CAN 线路共模滤波。** CAN H、CAN L 信号线路采用共模滤波器件，抑制两条线上同向出现的高频噪声，同时尽量减小对 CAN 差分信号的影响。该设计有助于降低电磁干扰，提高复杂布线环境中的信号抗干扰能力。

共模滤波不提供电气隔离，也不等同于隔离式 CAN 接口。接线时仍需按说明连接地线。

## 2. 使用前准备

### 2.1 所需设备

- PGEAR CAN-Sniffer G1 及与实际硬件匹配的线束、电源。
- 可接入的 500 kbps 经典 CAN 总线。
- 手机：用于 BLE 应用或 RaceChrono 连接，也可用于开启 Wi-Fi 模式。
- 电脑：使用 SavvyCAN 时需要，可连接设备的 Wi-Fi 热点。
- 对应车型的 Profile 或 CAN 通道定义：需要显示车辆参数时准备。

### 2.2 接线

按照设备外壳标识、配套线束说明及车辆接线资料连接：

| 信号 | 连接要求 |
| --- | --- |
| CAN H | 连接目标总线的 CAN H |
| CAN L | 连接目标总线的 CAN L |
| GND | 按配套接线说明连接地线 |
| VCC | 连接 4.5–40 V 直流电源正极 |

VCC 为外部电源输入，内部自动降压至 3.3 V；无需在 VCC 输入端另行转换为 3.3 V。连接前确认电压处于允许范围内，并按设备标识核对正负极。本说明不定义连接器针脚和线色，具体以配套线束说明为准。

接线和初次配置应在车辆停稳时进行。连接后确认 CAN H、CAN L 没有接反，线束连接牢固。使用车辆诊断接口时，还需要确认该接口实际开放了目标 CAN 数据；某些参数可能只在车辆内部其他总线上出现。

### 2.3 车型配置的作用

Profile 可以理解为车辆数据的“解释规则”。例如，同一条 CAN 报文可能同时包含转速与油门数据，应用需要知道：

- 读取哪个 CAN ID。
- 从数据的哪一位开始取值，以及取多少位。
- 使用哪种字节序，是否为有符号数。
- 如何通过倍率、除数和偏移量换算成实际值。

使用其他车型的配置，可能出现无数据、数值偏差或单位错误。应先确认车型、年款和接入的总线，再验证通道数值。

## 3. 快速开始：通过 BLE 查看车辆数据

1. 按硬件说明连接 PGEAR CAN-Sniffer G1 并供电。
2. 让目标车辆总线进入有数据的状态，例如打开点火开关。
3. 打开手机蓝牙，并授予应用所需的蓝牙或附近设备权限。
4. 在支持 PGEAR CAN-Sniffer G1 的应用内扫描设备，选择 **PGEAR CAN-Sniffer G1**。
5. 选择与车辆匹配的 Profile，由应用发送给设备。
6. 由应用启用数据通知，开始接收 CAN 数据。
7. 查看转速、车速等通道，确认数值与车辆实际状态一致。

BLE 应通过应用内的设备连接入口操作。系统蓝牙列表能否显示或配对，不是判断应用能否连接的唯一依据。

> 当前自定义 BLE 数据通道需要先加载 Profile。仅建立蓝牙连接或启用通知，不会自动持续输出所有原始 CAN 报文。需要采集全部报文时，使用 Wi-Fi 原始数据模式。

### 3.1 数据更新频率

自定义 BLE Profile 支持 `20`、`50`、`100` Hz 三档快照频率，默认 100 Hz。

| 设置 | 快照调度间隔 |
| --- | --- |
| 20 Hz | 50 ms |
| 50 Hz | 20 ms |
| 100 Hz | 10 ms |

该频率是设备检查并发送快照的调度频率。实际接收频率受车辆报文频率、数据变化、蓝牙连接和手机处理能力影响。

设备缓存每个指定 CAN ID 的最新数据；至少一个指定 ID 的数据内容或数据长度发生变化时，才会产生待发送快照。报文持续到达但内容完全相同，也可能没有新的快照通知。因此，不能仅用快照通知的间隔判断车辆总线是否停发。

一份快照可同时包含多个 ID 的最新值，它们不一定在同一时刻到达。需要逐帧分析或记录每次报文到达时，应使用 Wi-Fi 原始采集模式。

### 3.2 重新连接与断电

Profile、频率和模式设置没有通过当前应用逻辑保存到非易失存储。设备断电重启后恢复默认 BLE 模式，Wi-Fi 关闭，需要重新加载 Profile。

应用每次重新连接时应重新确认 Profile，并重新启用通知。BLE 断开本身不会自动关闭已开启的 Wi-Fi 热点。

## 4. 在 RaceChrono 中使用

PGEAR CAN-Sniffer G1 提供 RaceChrono DIY CAN-Bus BLE 服务。该通道与自定义 Profile 快照通道独立，RaceChrono 负责设置接收过滤规则并解析车辆数据。

### 4.1 添加设备

1. 给 PGEAR CAN-Sniffer G1 供电，并确保车辆总线有数据。
2. 打开 RaceChrono 的设置，进入添加其他设备的入口。
3. 选择 **RaceChrono DIY** 类型。
4. 将连接方式设为 **Bluetooth LE**。
5. 扫描并选择 **PGEAR CAN-Sniffer G1**，启用 CAN-Bus 功能。
6. 在车辆配置中添加或配置 CAN-Bus 数据通道。
7. 开始一次记录，确认目标通道有合理的数据。

不同应用版本的菜单文字可能有所不同。设备类型、BLE 连接方式及车辆 CAN-Bus 通道的配置方式，可参阅 [RaceChrono 官方 DIY 教程](https://racechrono.com/article/2572)。

### 4.2 配置车辆通道

设备发送的是原始 CAN 数据，RaceChrono 需要车型对应的 CAN ID 和解析公式，才能显示转速、车速或温度等参数。

在车辆配置中，按经过验证的车型定义设置通道名称、CAN ID、计算公式和单位。计算公式可参阅 [RaceChrono 官方公式说明](https://racechrono.com/support/equations)。

**自定义 BLE 的 `set_profile` JSON 不能直接当作 RaceChrono 通道公式使用。** 两者的配置入口和字段表达方式不同，应将信号定义转换为 RaceChrono 支持的规则。

### 4.3 使用边界

- 当前设备提供 CAN 数据；本固件没有提供 GPS 定位服务。
- RaceChrono 的逐帧通知使用其自己的过滤与最小通知间隔，不使用自定义 Profile 的 `rate` 设置。
- 实际车型信号能否获取，取决于接入总线上的报文以及车辆通道定义。
- 切换应用前，先断开当前 BLE 应用，避免多个应用争用设备。

## 5. 使用 Wi-Fi 和 SavvyCAN 采集原始报文

Wi-Fi 原始模式将接收到的 CAN 报文通过 GVRET TCP 转发给电脑，适合寻找 CAN ID、检查原始字节和保存日志。

该通道转发不受自定义 BLE Profile 的 ID 白名单限制，不需要先加载车型 Profile。

### 5.1 开启 Wi-Fi 模式

设备上电后默认关闭 Wi-Fi。Wi-Fi 模式控制需要蓝牙认证，仅支持通过官方 App 开启。

1. 打开**车涯或 PGEAR App**。
2. 在 **GO** 界面选择连接 **PGEAR CAN-Sniffer G1**。
3. 连接后选择 **wifi raw mode**。

开启后，电脑即可连接 `PGEAR CAN-Sniffer G1` Wi-Fi 热点。

### 5.2 连接电脑
c
1. 在电脑 Wi-Fi 列表中选择 `PGEAR CAN-Sniffer G1`。
2. 输入密码 `12345678`。
3. 如果系统提示“无互联网”，保持连接；热点用于设备数据通信。
4. 打开 SavvyCAN 的连接管理窗口，创建新连接。
5. 选择 **Network connection (GVRET)**。
6. 在地址输入项中填写 `192.168.4.1`，创建连接。
7. 检查主窗口是否开始收到 CAN 报文。

本项目配套的 SavvyCAN 网络 GVRET 实现使用 TCP 端口 `23`。如其他版本提供单独的端口设置项，填写 `23`；只有地址输入项时，填写 IP 地址即可。

| 连接项目 | 填写内容 |
| --- | --- |
| 连接类型 | Network connection (GVRET) |
| 地址 | `192.168.4.1` |
| 端口（若可设置） | `23` |
| 实际 CAN 速率 | 500 kbps，由设备当前固件固定 |

热点最多允许一个 Wi-Fi 客户端接入。采集时只让目标电脑连接该热点，避免手机占用连接名额。

### 5.3 查看和保存数据

连接后可在 SavvyCAN 中查看报文的 CAN ID、数据长度、原始数据和时间信息。需要显示物理值时，仍需提供与车辆匹配的信号定义，例如经过验证的 DBC。

建议先进行短时间采集，确认报文持续出现，再开始正式记录。采集结束后使用 SavvyCAN 的日志保存功能，将数据保存到电脑，文件名注明车型、日期、接入位置和测试条件。

PGEAR CAN-Sniffer G1 当前固件不提供设备本地日志存储。数据由接收端保存；高负载或网络处理不及时可能丢帧，当前队列满时会丢弃较旧数据，因此不能保证所有总线报文都被完整记录。

### 5.4 返回 BLE 数据模式

Wi-Fi 模式切换由官方 App 完成蓝牙认证后控制。设备断电重启后会关闭 Wi-Fi 热点及 TCP 连接，恢复默认 BLE 模式。

同一次上电期间，模式切换不会主动清除已加载的 Profile。返回 BLE 模式后仍应由应用确认配置和通知状态。断电重启也会回到默认 BLE 模式，但需要重新加载 Profile。

### 5.5 模式之间的关系

| 状态 | 自定义 BLE 快照 | 官方 App 模式控制 | Wi-Fi GVRET 数据 |
| --- | --- | --- | --- |
| 默认 BLE 模式 | 加载 Profile 并启用通知后可发送 | 蓝牙认证后可用 | 热点关闭 |
| Wi-Fi 原始模式 | 暂停 | 蓝牙连接及认证有效时可用 | 电脑连接后可接收 |

RaceChrono DIY 通知在独立的原始帧回调中处理，当前代码没有将它随 Wi-Fi 模式一起关闭。需要稳定采集时，建议一次使用一个主要数据接收端。

`192.168.4.1:23` 是二进制 CAN 数据服务地址。当前固件没有启用内置 HTTP 网页，直接用浏览器打开 `http://192.168.4.1` 不会出现配置界面。

## 6. 指示灯说明

当前固件将指示灯作为 BLE 数据发送活动提示：

| 状态 | 含义 |
| --- | --- |
| 常亮 | 默认状态，或最近没有成功提交 BLE 数据通知 |
| 约每秒闪烁两次 | 最近约 1.5 秒内有自定义 BLE 快照或 RaceChrono CAN 通知成功提交 |

指示灯不是完整的连接状态或 CAN 总线状态指示。CAN 数据没有变化、没有加载 Profile、没有开启通知时，都可能保持常亮。Wi-Fi GVRET 数据发送本身不更新该灯的活动计时，所以 Wi-Fi 正常采集时也可能常亮。

判断是否正在采集，应以应用或 SavvyCAN 中实际收到的数据为准。

## 7. 查询电池电压

支持 PGEAR CAN-Sniffer G1 接口的应用可查询设备电压采样值。手动调试步骤如下：

1. 建立 BLE 连接。
2. 启用 `0xFFE1` 的 Notify。
3. 向 `0xFFE1` 写入：

```json
{"cmd":"batt"}
```

4. 从该特征的通知中读取响应，例如：

```json
{"t":"batt","v":12.03}
```

`v` 的单位是伏特（V）。这是硬件分压和 ADC 采样得到的参考值，其准确性取决于实际电路和校准。该值不是电池剩余电量百分比。

## 8. 常见问题

### 8.1 扫描不到 PGEAR CAN-Sniffer G1

- 检查设备供电。
- 检查手机蓝牙及应用权限。
- 关闭其他正在连接设备的 BLE 应用，再重新扫描。
- 重启设备后在应用内扫描。
- 如果仍显示旧名称，确认设备已经烧录改名后的固件，并重新扫描；仅修改源码不会改变设备中的程序。

### 8.2 蓝牙连接成功，但没有车辆参数

- 自定义 BLE 应用需正确下发 Profile 并启用 Notify。
- 检查目标 CAN ID 是否实际出现在接入总线上。
- 确认目标总线速率为 500 kbps。
- 检查 CAN H、CAN L 和地线连接。
- 确认车辆总线已经唤醒。
- 检查是否处于 Wi-Fi 原始模式；此时自定义 BLE 快照暂停。
- 数据完全不变时可能不产生新的快照，先观察随车辆状态变化的通道。

### 8.3 转速、车速或温度数值不正确

检查车型配置的 CAN ID、起始位、位长度、字节序、符号、倍率、除数、偏移和单位。优先用已经验证的车型配置；能接收原始报文不代表解析规则正确。

### 8.4 找不到 Wi-Fi 热点

Wi-Fi 默认关闭。打开车涯或 PGEAR App，在 GO 界面连接 PGEAR CAN-Sniffer G1，连接后选择 wifi raw mode，再刷新电脑的 Wi-Fi 列表。重启后需要重新开启。

### 8.5 电脑连上热点，但 SavvyCAN 没有数据

- 确认连接类型为 Network connection (GVRET)，地址为 `192.168.4.1`，TCP 端口为 `23`。
- 确认电脑仍连接 PGEAR CAN-Sniffer G1 热点，没有自动切回其他网络。
- 检查防火墙或 VPN 是否影响本地网络连接。
- 确认车辆总线有报文，接线正确且速率匹配。
- 断开已有的其他采集客户端，重新建立连接。
- 不要将设备速率设置为其他值；当前固件不会执行软件端的改速请求。

### 8.6 设备网页打不开

当前固件仅提供 BLE 与 GVRET TCP 数据通道，没有启用内置网页。使用配套应用或 SavvyCAN 完成连接和采集。

### 8.7 指示灯常亮，是否代表采集失败

不一定。Wi-Fi 数据发送不驱动活动闪烁，BLE 快照也会在数据不变时停止更新。检查接收端是否有数据，而不是只看指示灯。

### 8.8 断电后配置丢失

这是当前固件的行为。每次上电后由应用重新发送 Profile，需要 Wi-Fi 时重新开启热点。

## 9. 开发接入参考

以下内容面向需要接入 PGEAR CAN-Sniffer G1 的应用开发人员。普通用户可按前面的连接步骤使用。

### 9.1 GATT 服务

| 服务 UUID | 特征 UUID | 用途 |
| --- | --- | --- |
| `0xFFE0` | `0xFFE1` | 自定义 Profile 写入、控制命令、快照及电压通知 |
| `0x1FF8` | `0x0001` | RaceChrono DIY 原始 CAN 通知 |
| `0x1FF8` | `0x0002` | RaceChrono DIY 过滤规则写入 |
| `0x00EE` | `0xEE01` | 预留通道，本说明不定义业务指令 |

通知通过 CCCD（`0x2902`）启用，写入字节 `01 00`。固件本地 MTU 设置为 500，客户端仍需进行 MTU 协商，不能假定所有手机都能接收最大长度通知。

### 9.2 Profile 示例

```json
{
  "cmd": "set_profile",
  "baud": 500000,
  "rate": 20,
  "channels": [
    {
      "id": 578,
      "name": "RPM",
      "start": 16,
      "len": 16,
      "sign": false,
      "big": false,
      "mult": 0.25,
      "div": 1,
      "offset": 0,
      "unit": "rpm"
    }
  ]
}
```

此例仅展示格式，不代表所有车辆使用 CAN ID `578`（`0x242`）发送转速。

| 字段 | 用途 |
| --- | --- |
| `cmd` | 按接口约定填写 `set_profile` |
| `baud` | 保留字段；当前固件忽略改速请求，实际固定 500000 bit/s |
| `rate` | 快照调度频率：20、50、100；缺省或其他值使用 20 Hz |
| `channels` | 通道数组，当前最多处理 32 个通道 |
| `id` | CAN ID，JSON 中使用十进制数值 |
| `name` / `unit` | 通道名称与单位 |
| `start` / `len` | 信号起始位与位长度 |
| `sign` | 是否按有符号数解析 |
| `big` | 是否使用大端解析规则 |
| `mult` / `div` / `offset` | 物理值换算参数 |
| `low` / `high` | 范围定义，接收端按应用规则处理 |

物理值换算公式：

```text
physical = raw × mult / div + offset
```

设备根据 `channels` 去重生成 CAN ID 白名单，快照只含这些 ID。位提取、符号扩展、字节序处理、物理值计算和范围判断由应用完成；设备不直接输出 RPM 等物理值。

旧接口约定中，`big=false` 使用 LSB 起始位，位 0 为 byte0 的 bit0；`big=true` 使用 MSB 顺序索引，位 0 为 byte0 的 bit7，位 8 为 byte1 的 bit7。该起始位表示法不能直接假定与任意 DBC 工具的 Motorola 起始位完全一致，导入配置时应由应用转换并验证。

### 9.3 Profile 写入顺序

**当前固件通过启用 `0xFFE1` Notify 的事件触发 Profile 解析。** 它没有在收到完整 JSON 后立即解析，也没有基于写入超时自动提交。

首次连接推荐顺序：

1. 发现 `0xFFE0` / `0xFFE1`，协商足够的 MTU。
2. 将 Profile 压缩为紧凑 JSON，以 UTF-8 写入 `0xFFE1`。
3. Profile 大于单次可写长度时，按顺序分块写入；每块长度不超过协商后的 ATT 可写长度，等待写入完成。
4. 全部块写入后，再向 CCCD 写入 `01 00`，触发缓存 Profile 解析并启用通知。
5. 检查收到的快照是否包含预期 ID。

如果通知已经启用，更新 Profile 前先写 `00 00` 关闭通知，写完新 Profile 后再写 `01 00`。不要只写 JSON 就等待它自动生效。

普通 Write 的分块会被固件累积；当前处理逻辑不处理 Prepare Write 的 Profile 内容。客户端应控制发送速度及总长度，避免缓冲区截断。直接 JSON 接收缓存为 4608 字节，需要留出结尾空间；不要把该缓存容量当作可无限扩展的接口。

建议使用 JSON 的 `channels` 格式。当前纯文本 ID 列表的回调没有将解析出的 ID 列表实际加载到快照过滤器，不应依赖该旧格式完成采集。没有专门的 Profile 加载成功应答，应结合实际通知验证生效情况。

### 9.4 自定义快照格式

每次通知为一个二进制快照：

| 偏移 | 长度 | 内容 |
| --- | --- | --- |
| 0 | 1 字节 | 帧头 `0xA5` |
| 1 | 4 字节 | 时间戳，uint32，小端，单位 ms |
| 5 | 1 字节 | 条目数量 N |
| 6 | N × 13 字节 | CAN 条目 |

每个条目：

```text
CAN ID：uint32 小端，4 字节
DLC：uint8，1 字节
DATA：固定 8 字节，仅前 DLC 字节有效
```

总长度为 `6 + N × 13` 字节，32 个条目时为 422 字节。客户端应确保实际通知容量足够；当前发送函数没有按客户端 MTU 对一个快照自动分包。

条目按 Profile 中不同 CAN ID 首次出现的顺序排列，尚未收到的 ID 不出现在快照中。时间戳来自最近一次引起缓存变化的 CAN 数据，基于设备启动后的计时；不是日期时间，也不是每个条目的独立到达时间。uint32 时间戳会回绕，客户端应处理回绕与设备重启。

同一 `0xFFE1` 特征也用于发送电压 JSON，接收端需区分 `0xA5` 二进制快照和 JSON 文本响应。当前没有旧文档所述的无 Profile 全量 JSON raw-frame 自动输出。

### 9.5 模式控制与电压查询

Wi-Fi 模式控制需要官方 App 完成蓝牙认证。公开使用流程以第 5.1 节的 App 操作为准，本说明不提供手动写入命令开启或切换 Wi-Fi 模式的操作步骤。

电压查询命令以 UTF-8 文本写入 `0xFFE1`，每条短命令使用一次普通 Write。

| 命令 | 作用 |
| --- | --- |
| `{"cmd":"batt"}` | 查询电压，通过 Notify 返回 JSON |
| `{"cmd":"voltage"}` | 查询电压的别名 |

### 9.6 RaceChrono DIY 数据格式

服务 `0x1FF8` 的 `0x0001` 通知包含：

```text
[CAN ID：4 字节，小端] + [本帧 CAN 数据：DLC 字节]
```

它不使用 `0xA5` 快照头，也没有单独的 DLC 或时间戳字段。过滤写入使用 `0x0002`，其中多字节字段使用大端：

| 首字节 | 后续内容 | 作用 |
| --- | --- | --- |
| `0x00` | 无 | 清空列表并禁止全部 ID |
| `0x01` | 最小间隔 uint16，单位 ms | 允许全部 ID，设置通知间隔 |
| `0x02` | 最小间隔 uint16 + CAN ID uint32 | 添加或更新指定 ID 的通知间隔 |

RaceChrono 过滤表最多保存 64 个 ID。通常由 RaceChrono 应用管理这些命令，普通用户无需手动写入。

## 10. 参数速查

```text
设备名称：PGEAR CAN-Sniffer G1
BLE 自定义服务 / 特征：0xFFE0 / 0xFFE1
RaceChrono DIY 服务：0x1FF8
Wi-Fi SSID：PGEAR CAN-Sniffer G1
Wi-Fi 密码：12345678
GVRET TCP 地址：192.168.4.1:23
CAN 速率：500 kbps
上电默认模式：BLE，Wi-Fi 关闭
开启 Wi-Fi：车涯或 PGEAR App → GO → 连接 PGEAR CAN-Sniffer G1 → wifi raw mode
Wi-Fi 模式控制：仅支持经过蓝牙认证的官方 App
返回默认 BLE 模式：断电重启
查询电压：{"cmd":"batt"}
```
