本文档描述 BlueHIDFlow 嵌入式设备与客户端之间通过 MQTT 进行通信的消息格式和接口规范。
- 协议概述
- MQTT 配置信息
- MQTT 主题结构
- [命令消息(Command)](#4-命令消息 command)
- [摄像头消息(Camera)](#5-摄像头消息 camera)
- [响应消息(Response)](#6-响应消息 response)
- [状态消息(Status)](#7-状态消息 status)
- [日志消息(Log)](#8-日志消息 log)
- 命令执行结果码
- 使用示例
当前协议版本:1.0
BlueHIDFlow 支持两种命令格式:
新格式(推荐):
{
"version": "1.0",
"id": "uuid-v4",
"timestamp": 1716123456789,
"action": "tap",
"params": { "x": 500, "y": 300 },
"metadata": { "sessionId": "session-123" }
}旧格式(向后兼容):
{
"action": "TAP",
"message_id": "12345678",
"params": { "x": 500, "y": 300 }
}设备同时支持两种格式,旧格式默认使用协议版本 1.0。
| 新格式字段 | 旧格式字段 | 说明 |
|---|---|---|
id |
message_id |
消息唯一标识 |
version |
- | 协议版本(可选,默认 "1.0") |
timestamp |
- | 消息时间戳(可选) |
metadata.sessionId |
- | 会话标识(可选) |
| 参数 | 默认值 | 说明 |
|---|---|---|
| Broker 地址 | 可配置 | MQTT Broker 地址 |
| 端口 | 8883 |
TLS 加密端口 |
| 协议 | mqtts:// |
加密协议 |
| 用户名 | 可配置 | MQTT 认证用户名 |
| 密码 | 可配置 | MQTT 认证密码 |
| KeepAlive | 60 秒 |
连接保活间隔 |
| QoS | 1 |
至少一次投递 |
使用 DigiCert Global Root G2 CA 证书验证服务器身份。
设备 ID 始终使用 WiFi MAC 地址自动生成(如 1CDBD44B0308)。MAC 地址获取失败时使用 udid-XXXXXX(时间戳后 6 位)。
所有主题均以可配置的主题前缀开头(默认 bluehidflow/),以设备 ID 为后缀,实现设备隔离。
| 主题 | 方向 | QoS | Retain | 用途 |
|---|---|---|---|---|
{prefix}command/{device_id} |
客户端 → 设备 | 2 | 否 | 发送控制命令 |
{prefix}response/{device_id} |
设备 → 客户端 | 1 | 否 | 返回命令执行结果 |
{prefix}status/{device_id} |
设备 → 客户端 | 1 | 是 | 设备状态上报 |
{prefix}log/{device_id} |
设备 → 客户端 | 1 | 否 | 设备日志上报 |
{prefix}camera/{device_id} |
设备 → 客户端 | 1 | 否 | 摄像头数据上报 |
主题说明:
{prefix}:主题前缀,默认bluehidflow/,可通过 Web 配置修改{device_id}:设备唯一标识,例如1CDBD44B0308- 方向:描述消息的发送方向
- QoS:消息服务质量等级
- Retain:是否保留最新消息(新订阅者立即获取)
上位机发送命令到 {prefix}command/{device_id} 主题。
新格式(推荐):
{
"version": "1.0",
"id": "550e8400-e29b-41d4-a716-446655440000",
"timestamp": 1716123456789,
"action": "tap",
"params": {
"x": 500,
"y": 300
},
"metadata": {
"sessionId": "session-123"
}
}旧格式(兼容):
{
"action": "TAP",
"message_id": "12345678",
"params": {
"x": 500,
"y": 300
}
}字段说明:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
version |
String | 否 | 协议版本,默认 "1.0" |
id |
String | 是* | 消息唯一 ID(新格式) |
message_id |
String | 是* | 消息唯一 ID(旧格式,建议使用 id) |
timestamp |
Long | 否 | 消息时间戳(毫秒) |
action |
String | 是 | 命令类型(大小写不敏感) |
params |
Object | 否 | 命令参数,结构因 action 而异 |
metadata |
Object | 否 | 元数据,包含 sessionId 等 |
*注:id 和 message_id 二选一,推荐使用 id
| 命令 | 说明 | params 参数 |
|---|---|---|
TAP |
点击屏幕 | x, y, duration(可选) |
SWIPE |
滑动屏幕 | from_x, from_y, to_x, to_y, duration(可选) |
SWIPE_UP |
向上滑动 | duration(可选) |
SWIPE_DOWN |
向下滑动 | duration(可选) |
SWIPE_LEFT |
向左滑动 | duration(可选) |
SWIPE_RIGHT |
向右滑动 | duration(可选) |
CALIBRATE |
校准/配置 | sensitivity, move_delay, hid_x, hid_y 等 |
| 命令 | 说明 | params 参数 |
|---|---|---|
INPUT |
输入文本 | text, confirm(可选) |
KEY_PRESS |
按键 | key |
KEY_COMBO |
组合键 | key, modifiers |
HOME |
回到桌面 | 无 |
BACK |
返回 | 无 |
VOLUME_UP |
音量增大 | 无 |
VOLUME_DOWN |
音量减小 | 无 |
| 命令 | 说明 | params 参数 |
|---|---|---|
SWITCH_MODE |
切换 HID 模式 | mode |
WAIT |
等待 | duration |
STATUS |
查询状态(仅串口输出,不发 MQTT 响应) | 无 |
GET_CONFIG |
获取配置 | section(可选) |
SET_CONFIG |
设置配置 | 顶层配置节对象 |
RECONNECT |
重新连接 MQTT(未实现) | 无 |
CONFIG |
配置页面请求(未实现) | 无 |
GET_STATUS |
获取详细状态(未实现) | 无 |
| 命令 | 说明 | params 参数 |
|---|---|---|
CAPTURE |
无 | |
CAMERA_START |
interval(可选) |
|
CAMERA_STOP |
无 | |
CAMERA_STATUS |
无 |
注意:摄像头命令在当前固件版本中已注释禁用,发送后将返回
INVALID_PARAMS。
在指定坐标执行点击操作。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
x |
Integer | 是 | X 坐标(像素) |
y |
Integer | 是 | Y 坐标(像素) |
duration |
Integer | 否 | 点击持续时间(毫秒),默认 50ms |
示例:
{
"action": "TAP",
"message_id": "12345678",
"params": {
"x": 500,
"y": 300,
"duration": 100
}
}通过 BLE 键盘输入文本。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
text |
String | 是 | 要输入的文本内容 |
confirm |
String | 否 | 输入后按确认键:"space" 按空格,"enter" 按回车 |
示例(纯文本输入):
{
"action": "INPUT",
"message_id": "12345679",
"params": {
"text": "Hello World"
}
}示例(输入后按回车确认):
{
"action": "INPUT",
"message_id": "12345679",
"params": {
"text": "hello",
"confirm": "enter"
}
}已知限制: 中文输入法下数字键可能被候选词选择器拦截,建议切换英文输入法。
发送单个按键事件。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
key |
String | 是 | 按键名称(见下表) |
支持的按键名称:
| 分类 | 按键名 | 说明 |
|---|---|---|
| 导航 | ENTER |
回车 |
ESCAPE |
ESC 键 | |
BACKSPACE |
退格键 | |
DELETE |
删除键 | |
TAB |
Tab 键 | |
SPACE |
空格键 | |
| 方向 | UP |
方向键上 |
DOWN |
方向键下 | |
LEFT |
方向键左 | |
RIGHT |
方向键右 | |
| 翻页 | PAGE_UP |
向上翻页(Android 部分场景无效) |
PAGE_DOWN |
向下翻页(Android 部分场景无效) | |
| 功能键 | F1 - F12 |
功能键(Android 上用途有限) |
| 媒体键 | MUTE |
静音切换 |
PLAY_PAUSE |
播放/暂停 | |
NEXT_TRACK |
下一曲 | |
PREV_TRACK |
上一曲 | |
| 浏览器键 | BROWSER_BACK |
浏览器后退(等同于 BACK) |
BROWSER_HOME |
浏览器主页(等同于 HOME) | |
| 焦点激活 | DPAD_CENTER |
焦点确认(Consumer AC Select,尝试替代 ENTER 激活焦点元素) |
| 字母/数字 | A-Z, 0-9 |
单字符按键(直接发送 HID 扫描码) |
示例:
{
"action": "KEY_PRESS",
"message_id": "12345680",
"params": {
"key": "TAB"
}
}发送修饰键 + 按键的组合。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
key |
String | 是 | 按键名称(同 KEY_PRESS) |
modifiers |
Array | 是 | 修饰键列表,可选值:"ctrl", "shift", "alt", "gui" |
示例(Ctrl+C 复制):
{
"action": "KEY_COMBO",
"message_id": "12345681",
"params": {
"key": "C",
"modifiers": ["ctrl"]
}
}示例(Ctrl+Shift+A 多修饰键):
{
"action": "KEY_COMBO",
"message_id": "12345682",
"params": {
"key": "A",
"modifiers": ["ctrl", "shift"]
}
}注意: 媒体键不支持组合键修饰,发送媒体键的 KEY_COMBO 会忽略修饰键直接发送媒体键。
发送 AC Home 媒体键,回到手机桌面。
params 参数: 无
示例:
{
"action": "HOME",
"message_id": "12345683"
}发送 AC Back 媒体键,返回上一页。
params 参数: 无
示例:
{
"action": "BACK",
"message_id": "12345684"
}发送音量增减媒体键。
params 参数: 无
示例:
{
"action": "VOLUME_UP",
"message_id": "12345685"
}切换键盘/鼠标模式,切换后设备自动重启(约 5-8 秒)。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
mode |
String | 是 | 模式名称:"keyboard" 或 "mouse" |
示例:
{
"action": "SWITCH_MODE",
"message_id": "12345686",
"params": {
"mode": "mouse"
}
}注意: 模式切换通过 NVS 保存 + ESP.restart() 实现,设备会断开连接约 5-8 秒后重启。
从起点滑动到终点。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
from_x |
Integer | 是 | 起始 X 坐标 |
from_y |
Integer | 是 | 起始 Y 坐标 |
to_x |
Integer | 是 | 结束 X 坐标 |
to_y |
Integer | 是 | 结束 Y 坐标 |
duration |
Integer | 否 | 滑动持续时间(毫秒),默认 300ms |
示例:
{
"action": "SWIPE",
"message_id": "12345687",
"params": {
"from_x": 500,
"from_y": 500,
"to_x": 200,
"to_y": 500,
"duration": 500
}
}向指定方向滑动(从屏幕中心开始)。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
duration |
Integer | 否 | 滑动持续时间(毫秒),默认 300ms |
示例(向上滑动):
{
"action": "SWIPE_UP",
"message_id": "12345688",
"params": {
"duration": 400
}
}配置 HID 参数或执行校准操作。
params 参数(可选其一或多个):
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
sensitivity |
Float | 否 | HID 灵敏度(像素/HID 单位) |
move_delay |
Integer | 否 | HID 移动延迟(毫秒) |
hid_x |
Integer | 否 | HID X 坐标(用于测试) |
hid_y |
Integer | 否 | HID Y 坐标(用于测试) |
delay_ms |
Integer | 否 | 测试延迟(毫秒) |
step_by_step |
Boolean | 否 | 是否分步执行测试 |
示例(设置灵敏度):
{
"action": "CALIBRATE",
"message_id": "12345689",
"params": {
"sensitivity": 1.5
}
}等待指定时间。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
duration |
Integer | 是 | 等待时间(毫秒) |
示例:
{
"action": "WAIT",
"message_id": "12345690",
"params": {
"duration": 5000
}
}查询设备当前状态。注意:此命令仅通过串口输出状态信息,不发送 MQTT 响应。
params 参数: 无
响应方式: 串口打印(Serial),不通过 MQTT 返回
串口输出示例:
CMD: ===== 设备状态 =====
CMD: HID 模式: KEYBOARD
CMD: BLE 连接: 已连接
CMD: BLE 配对: 已配对
CMD: 屏幕尺寸: 1220 x 2700
CMD: HID 灵敏度: 1.00 像素/HID单位
CMD: HID 移动延迟: 50ms
CMD: ====================
示例:
{
"action": "STATUS",
"message_id": "12345691"
}获取设备配置信息。
params 参数:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
section |
String | 否 | 配置节名称(wifi, camera, mqtt, ai, bluetooth, phone, system),不传则返回全部 |
示例(获取手机配置):
{
"action": "GET_CONFIG",
"message_id": "12345692",
"params": {
"section": "phone"
}
}设置设备配置。
params 参数:
直接将配置节作为顶层键传入,支持同时设置多个配置节。
| 配置节 | 说明 | 主要字段 |
|---|---|---|
wifi |
WiFi 配置 | ssid, password |
camera |
摄像头配置 | resolution, jpegQuality, distanceCm |
mqtt |
MQTT 配置 | broker, port, username, password, caCert, deviceId |
ai |
大模型配置 | apiKey, apiUrl, model, timeoutMs |
bluetooth |
蓝牙配置 | deviceName, hidMode |
phone |
手机配置 | model, screenWidth, screenHeight, hidSensitivity, moveDelayMs |
system |
系统配置 | logLevel, debugEnabled |
示例(设置手机配置):
{
"action": "SET_CONFIG",
"message_id": "12345693",
"params": {
"phone": {
"model": "HUAWEI P60",
"screenWidth": 1220,
"screenHeight": 2700,
"hidSensitivity": 1.0
}
}
}重新连接 MQTT Broker。
params 参数: 无
示例:
{
"action": "RECONNECT",
"message_id": "12345694"
}当前状态:摄像头命令已在固件中禁用。以下文档保留供参考。
设备拍照后,通过可注入的图片上传接口(ICameraUploader)将图片上传到开发者自有的后端/对象存储,然后通过 bluehidflow/camera/{device_id} 主题发布图片 URL。
安全说明:上传逻辑已抽象为
ICameraUploader接口,开发者通过cameraServer.setUploader(...)注入自定义实现,不再内置任何第三方上传端点或 Token,避免泄露私有实现与凭据。
{
"url": "https://your-storage.example.com/path/to/frame.jpg",
"timestamp": 12345678
}字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
url |
String | 图片访问 URL(由上传器返回,开发者自行管理鉴权) |
timestamp |
Integer | 拍照时间戳(毫秒) |
设备执行命令后,发布响应到 bluehidflow/response/{device_id} 主题。
{
"message_id": "时间戳(与命令对应)",
"status": "执行状态",
"timestamp": 12345678,
"error": "错误信息(可选)",
"data": { ... }
}字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
message_id |
String | 对应命令的 message_id(时间戳) |
status |
String | 执行状态:PROCESSING, SUCCESS, FAILED |
timestamp |
Integer | 响应生成的设备毫秒时间戳 |
error |
String | 错误信息(失败时) |
data |
Object | 附加数据(如 GET_CONFIG 返回的配置) |
命令执行成功:
{
"message_id": "12345678",
"status": "SUCCESS",
"timestamp": 12345780
}命令执行失败:
{
"message_id": "12345678",
"status": "FAILED",
"timestamp": 12345780,
"error": "坐标超出屏幕范围"
}GET_CONFIG 响应(带数据):
{
"message_id": "12345686",
"status": "SUCCESS",
"timestamp": 12345800,
"data": {
"wifi": {
"ssid": "MyWiFi",
"password": "******"
},
"phone": {
"model": "HUAWEI P60",
"screenWidth": 1220,
"screenHeight": 2700,
"hidSensitivity": 1.0
}
}
}设备定期发布状态到 bluehidflow/status/{device_id} 主题(默认 30 秒间隔),新订阅者会立即收到最新状态(retain=true)。
注意:状态上报的前提是 MQTT 已连接成功。如果网络断开或 MQTT 未连接,则不会发布状态消息。
{
"device_id": "1CDBD44B0308",
"status": "connected",
"battery": 85,
"wifi_rssi": -45,
"uptime": 12345,
"ip": "192.168.1.100",
"mac": "1C:DB:D4:4B:03:08"
}字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
device_id |
String | 设备唯一标识(WiFi MAC 地址) |
status |
String | 设备状态:offline, connecting, connected, busy |
battery |
Integer | 电池电量百分比(当前固定值 85) |
wifi_rssi |
Integer | WiFi 信号强度(dBm),负数,越接近 0 信号越强 |
uptime |
Integer | 设备运行时间(秒) |
ip |
String | 设备 IP 地址 |
mac |
String | 设备 MAC 地址 |
设备定期上报日志到 bluehidflow/log/{device_id} 主题(默认 30 秒间隔,或错误时立即上报)。
[
{
"ts": 12345678,
"level": "日志级别",
"event": "事件类型",
"msg": "日志内容"
}
]字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
ts |
Integer | 设备毫秒时间戳 |
level |
String | 日志级别:INFO, WARN, ERROR |
event |
String | 事件类型(见下表) |
msg |
String | 日志内容 |
| 事件 | 说明 |
|---|---|
BOOT |
设备启动 |
WIFI_CONNECT |
WiFi 连接 |
WIFI_DISCONNECT |
WiFi 断开 |
MQTT_CONNECT |
MQTT 连接 |
MQTT_DISCONNECT |
MQTT 断开 |
BLE_CONNECT |
BLE 连接 |
BLE_DISCONNECT |
BLE 断开 |
ERROR |
异常错误 |
RESTART |
设备重启 |
CONFIG_SAVE |
配置保存 |
设备内部使用的命令执行结果码:
| 结果码 | 值 | 说明 |
|---|---|---|
SUCCESS |
0 | 命令执行成功 |
FAILED |
1 | 命令执行失败 |
INVALID_PARAMS |
2 | 参数无效 |
NOT_IMPLEMENTED |
3 | 功能未实现 |
TIMEOUT |
4 | 命令超时 |
RESPONSE_SENT |
5 | 命令已自行发送 MQTT 响应,execute() 末尾无需再发 |
RESPONSE_SENT用于 STATUS、GET_CONFIG、SET_CONFIG、SWITCH_MODE 等需要返回自定义数据的命令,它们在函数内部已直接调用mqtt.publishResponse()。
-
连接 MQTT Broker:
- Host:
your-mqtt-broker.example.com - Port:
8883 - SSL/TLS: 开启
- Username:
your_username - Password:
your_password
- Host:
-
订阅设备响应主题:
bluehidflow/response/1CDBD44B0308 -
发布键盘按键命令:
{ "action": "KEY_PRESS", "message_id": "12345678", "params": { "key": "ENTER" } } -
查看响应:
{ "message_id": "12345678", "status": "SUCCESS", "timestamp": 12345780 }
import paho.mqtt.client as mqtt
import json
import ssl
# 配置
BROKER = "your-mqtt-broker.example.com"
PORT = 8883
USERNAME = "your_username"
PASSWORD = "your_password"
DEVICE_ID = "1CDBD44B0308"
# 回调函数
def on_connect(client, userdata, flags, rc):
print(f"已连接,结果码:{rc}")
client.subscribe(f"bluehidflow/response/{DEVICE_ID}")
def on_message(client, userdata, msg):
print(f"收到响应:{msg.payload.decode()}")
# 创建客户端
client = mqtt.Client()
client.username_pw_set(USERNAME, PASSWORD)
client.tls_set(ca_certs=None, certfile=None, keyfile=None, cert_reqs=ssl.CERT_REQUIRED)
# 设置回调
client.on_connect = on_connect
client.on_message = on_message
# 连接
client.connect(BROKER, PORT, 60)
# 发布按键命令
command = {
"action": "KEY_PRESS",
"message_id": str(int(__import__('time').time() * 1000)),
"params": {
"key": "HOME"
}
}
client.publish(f"bluehidflow/command/{DEVICE_ID}", json.dumps(command))
print(f"已发布命令:{command}")
# 循环接收
client.loop_forever()上位机 设备 Broker
| | |
|--- 订阅 response 主题 ------->| |
| |--- 订阅 command 主题 -------->|
| | |
|--- 发布 KEY_PRESS 命令 ------------------------------------->|
| |<-----------------------------|
| | 处理命令 (发送按键) |
| | |
|<-- 返回 SUCCESS 响应 --------------------------------------|
| | |
| | 定期发布状态 (每 30 秒) ------->|
|<-- 收到 status 消息 ---------------------------------------|
| 配置节 | 说明 | 主要字段 |
|---|---|---|
wifi |
WiFi 配置 | ssid, password |
camera |
摄像头配置 | resolution, jpegQuality, distanceCm |
mqtt |
MQTT 配置 | broker, port, username, password, caCert, deviceId |
ai |
大模型配置 | apiKey, apiUrl, model, timeoutMs |
bluetooth |
蓝牙配置 | deviceName, hidMode |
phone |
手机配置 | model, screenWidth, screenHeight, hidSensitivity, moveDelayMs |
system |
系统配置 | logLevel, debugEnabled |
| 模式值 | 名称 | 说明 |
|---|---|---|
| 0 | KEYBOARD |
键盘模式(默认)。支持文字输入、按键、组合键、导航键、媒体键 |
| 1 | MOUSE |
鼠标模式。通过归零 + 相对移动模拟点击和滑动 |
注意:两种模式不能同时运行,切换需要重启设备(约 5-8 秒)。使用
SWITCH_MODE命令切换。
注意:代码内部使用 HijelHID 库的常量映射,实际 HID 报告使用库内部定义的值。以下表格为标准 HID 规范参考。
| KEY_PRESS 参数 | 标准 HID 扫描码 | Android 行为 |
|---|---|---|
ENTER |
0x28 | 回车/确认 |
ESCAPE |
0x29 | ESC(非返回) |
BACKSPACE |
0x2A | 退格删除 |
DELETE |
0x4C | 向后删除 |
TAB |
0x2B | 焦点跳转 |
SPACE |
0x2C | 空格 |
UP/DOWN/LEFT/RIGHT |
0x52/0x51/0x50/0x4F | 方向键/焦点移动 |
PAGE_UP/PAGE_DOWN |
0x4B/0x4E | 翻页(部分场景无效) |
F1-F12 |
0x3A-0x45 | 功能键(Android 用途有限) |
A-Z |
0x04-0x1D | 字母键 |
0-9 |
0x27,0x1E-0x26 | 数字键 |
| KEY_PRESS 参数 | Consumer Usage | Android 行为 |
|---|---|---|
HOME |
AC Home (0x0223) | 回桌面 |
BACK |
AC Back (0x0224) | 返回上一页 |
VOLUME_UP |
Volume Up (0x00E9) | 音量增大 |
VOLUME_DOWN |
Volume Down (0x00EA) | 音量减小 |
MUTE |
Mute (0x00E2) | 静音切换 |
PLAY_PAUSE |
Play/Pause (0x00CD) | 播放/暂停 |
NEXT_TRACK |
Next Track (0x00B5) | 下一曲 |
PREV_TRACK |
Prev Track (0x00B6) | 上一曲 |
DPAD_CENTER |
AC Select (0x0214) | 焦点确认(实验性) |
| 修饰键名称 | HID 修饰码 | 说明 |
|---|---|---|
ctrl |
0x01 | Ctrl / Control |
shift |
0x02 | Shift |
alt |
0x04 | Alt |
gui |
0x08 | Win / Cmd / Meta |
Q: 消息发送后没有收到响应?
- 检查设备是否在线(查看 status 主题)
- 确认
message_id是否正确 - 检查 QoS 设置(command 主题建议使用 QoS 2)
Q: KEY_PRESS 的 ENTER 在 app 内无法点击按钮?
- Android 上 ENTER 键(HID 0x28)映射为 KEYCODE_ENTER,不等同于 DPAD_CENTER
- 系统标准控件(如桌面图标)通常响应 ENTER,但自定义 View 可能不响应
- 可尝试
DPAD_CENTER键(实验性),或切换到鼠标模式使用 TAP
Q: 如何重置设备配置?
- 通过 Web 配置页面的"重置所有配置"按钮
- 或发送
SET_CONFIG命令重置特定配置节
Q: 鼠标模式点击不准确?
- Android 鼠标加速会影响 HID 鼠标定位精度
- 可通过
CALIBRATE命令调整灵敏度和移动延迟 - 建议优先使用键盘模式完成操作