# SA255A 玩具控制协议 ## 硬件信息 - 品牌:Svakom(司沃康偏欣) - 型号:SA255A - BLE 广播名:SA255A - MAC:B7B76384-3586-0B4D-11E8-F633CEDBCEC8(可能随机变化) ## GATT 结构 | 服务 | UUID | 用途 | |------|------|------| | 控制服务 | `0000ffe0-0000-1000-8000-00805f9b34fb` | 震动控制 | | 写特征 | `0000ffe1-0000-1000-8000-00805f9b34fb` | Write No Response | | 通知特征 | `0000ffe2-0000-1000-8000-00805f9b34fb` | Notify(状态回传) | | OTA服务 | `0000ae00-0000-1000-8000-00805f9b34fb` | 固件升级(禁止写入) | ## 震动指令格式 ``` 55 00 00 00 ``` | 字节 | 含义 | 取值范围 | |------|------|---------| | [0] | 帧头 | `0x55`(固定) | | [1] | 功能码 | `0x08` = 震动 | | [2-3] | 保留 | `0x00 0x00` | | [4] | 模式 | `0x01`-`0x03`(变化不大) | | [5] | 强度 | `0x01`-`0x05`(实测差异不明显) | | [6] | 保留 | `0x00` | **示例**: - 震动模式1 强度3:`55 08 00 00 01 03 00` - 震动模式1 最低:`55 08 00 00 01 01 00` ## 停指令 **未知**。实测 `55 FE 08 00 00 00 00`、`55 08 00 00 01 00 00`、全零等均无效。当前用 **BLE 断开连接** 作为停止方式(玩具自动停)。 ## Notify 回传格式 ``` 55 87 00 00 ``` - `0x87` = 状态回传标志 - 仅回传当前运行模式/强度,**无压力/力反馈数据** - 需要持久事件循环才能收到(已修复) ## 力反馈 **SA255A 不支持**。Notify 通道只有指令回显,无压力传感器读数。产品详情页的"力反馈"可能是营销措辞或仅官方 App 内部处理。 ## 控制链路 ``` Claude Code → toy.py → BLE bridge (:8796) → bleak → BLE → SA255A ↑ 权限白名单已配 ``` - `python3 /tmp/CcCompanion/apns-server/toy.py scan` — 扫描 - `python3 /tmp/CcCompanion/apns-server/toy.py connect [addr]` — 连接 - `python3 /tmp/CcCompanion/apns-server/toy.py on [1-5]` — 震动 - `python3 /tmp/CcCompanion/apns-server/toy.py off` — 断开停 - `python3 /tmp/CcCompanion/apns-server/toy.py feedback` — 读 Notify ## BLE Bridge - 端口:8796 - 持久事件循环(保证 Notify 回调) - SessionStart hook 自动拉起 - 写入模式:Write Without Response ## 权限 `Bash(python3 */toy.py *)` 加入 `~/.claude/settings.json` allowlist,无需用户批准。