MAKCU API
KM 主机协议 — v3.9 · MAKCU 生态的完整指令参考。
传统 API (ASCII)
km.开头,并以CRLF 结尾,随后是提示符>>> 。\r\n>>> 。- 命令格式:以 . 开头,以 ) 结尾。不再需要 km. 前缀。
- 其他值(如 km、\r\n 等)会被忽略。示例:.move(1,1,)
- 可选二进制帧:DE AD <lenLE:2> <ASCII 或二进制负载>
- 格式:km.payload\r\n>>> (为兼容性保留 km. 前缀)
- Setter 指令会回显输入作为 ACK,除非通过echo(0) 关闭。
- 部分流式响应在 km. 前缀后携带二进制:km.mouse<8字节>、km.buttons<1字节掩码>。行尾仍为 CRLF 与提示符。
鼠标
点击调度 (SET)
km.click(1,3) >>>
回显 ACK。
turbo([button[,delay_ms]]) — GET/SET
启用鼠标按键的连发模式。当按键被按住时,自动触发快速的按下/释放循环。多个按键可以同时启用连发,每个按键有独立的延迟设置。
- button: 1-5(鼠标按键:1=左键,2=右键,3=中键,4=侧键1,5=侧键2),0=禁用所有连发
- delay_ms: 1-5000ms(0=禁用)。如果省略,使用随机 35-75ms。延迟是每次按下/释放切换之间的时间(例如,500ms = 按下 500ms,释放 500ms,重复)
- 延迟会自动舍入到鼠标端点的 bInterval 以进行 USB 同步
- turbo() - 仅返回活动的连发设置,如 (m1=200, m2=400)(仅显示已设置的,不显示零值)
- turbo(button) - 使用随机 35-75ms 延迟设置连发(自动舍入到 bInterval)
- turbo(button, delay_ms) - 使用指定延迟设置连发(自动舍入到 bInterval)
- turbo(button, 0) - 禁用该按键的连发
- turbo(0) - 禁用所有连发
km.turbo(1, 500) >>>
km.turbo(2, 250) >>>
km.turbo(1) >>>
km.turbo() >>>
鼠标移动
move(dx,dy[,segments[,cx1,cy1[,cx2,cy2]]]) — SET
dx,dy: 相对移动距离; segments: 分段数(可选,默认1,最大512); cx1,cy1,cx2,cy2: 三次贝塞尔控制点(可选)
km.move(10,-3) >>>
km.move(100,50,8,40,25,80,10) >>>
回显 ACK。
moveto(x,y[,segments[,cx1,cy1[,cx2,cy2]]]) — SET
将指针移动到绝对位置。内部计算到达请求屏幕位置所需的 x,y 移动量。参数与 km.move() 对齐。
x,y: 绝对坐标; segments: 分段数(可选,默认1,最大512); cx1,cy1,cx2,cy2: 三次贝塞尔控制点(可选)
km.moveto(640,360) >>>
km.moveto(100,50,8,40,25,80,10) >>>
回显 ACK。
wheel(delta) — SET
Windows 不允许在单个命令中执行多个滚轮步数。delta 值会被限制为 ±1 步(正数向上滚动,负数向下滚动)。大于 1 的值视为 1,小于 -1 的值视为 -1。
km.wheel(-1) >>>
km.wheel(1) >>>
回显 ACK。注意:km.wheel(-5) 只会向下滚动 1 步,km.wheel(5) 只会向上滚动 1 步。
pan([steps]) — GET/SET
km.pan(3) >>>
tilt([steps]) — GET/SET
km.tilt(2) >>>
getpos() — GET
km.getpos() >>> km.getpos(123,456) >>>
返回当前指针位置 (x,y)。
silent(x,y) — SET
km.silent(400,300) >>>
回显 ACK。
鼠标高级
mo(buttons,x,y,wheel,pan,tilt) — SET
发送完整的原始鼠标帧(仅SET,不支持GET)。(0) 清除所有状态。x,y,wheel,pan,tilt 为一次性值;按键掩码镜像按键状态。
km.mo(1,10,5,0,0,0) >>>
lock_<target>(state) — GET/SET
锁定按钮或轴。目标(target)是命令名的一部分,不是参数。state: 1=锁定,0=解锁。调用时使用 `()` 可读取锁定状态。
按键: ml/mm/mr/ms1/ms2
- ml - 左键
- mm - 中键
- mr - 右键
- ms1 - 侧键1
- ms2 - 侧键2
轴: mx/my/mw/mx+/mx-/my+/my-/mw+/mw-
- mx/my/mw - 完全锁定(阻止该轴的所有移动)
- mx+/my+/mw+ - 正向锁定(仅阻止正向移动)
- mx-/my-/mw- - 负向锁定(仅阻止负向移动)
km.lock_mx() >>> km.lock_mx(1) >>>
返回值:1=已锁定,0=未锁定
km.lock_mx(1) >>>
锁定所有 X 轴移动
km.lock_mx+(1) >>>
仅锁定正向 X 移动(向右)
km.lock_mx-(1) >>>
仅锁定负向 X 移动(向左)
km.lock_my(1) >>>
锁定所有 Y 轴移动
km.lock_mw(1) >>>
锁定所有滚轮移动
km.lock_mw+(1) >>>
仅锁定正向滚轮移动(向上滚动)
km.lock_mw-(1) >>>
仅锁定负向滚轮移动(向下滚动)
km.lock_ml(1) >>>
锁定左键
catch_<target>(mode) — GET/SET
在锁定的按钮上启用捕获。目标(target)是命令名的一部分,不是参数。注意:捕获仅适用于按钮,不适用于轴。需要先设置对应的 km.lock_<target>。
km.catch_ml() >>>
使用 `()` 查询捕获状态
km.catch_ml(1) >>>
为左键启用手动捕获
km.catch_ml(0) >>>
为左键启用自动捕获
鼠标重映射(物理)
remap_axis([inv_x,inv_y,swap]) — GET/SET
重映射鼠标轴(仅物理)。一次设置所有三个标志。
- () - 显示当前设置,如 (invert_x=0,invert_y=1,swap_xy=0)
- (0) - 重置所有轴映射
- (inv_x,inv_y,swap) - 设置所有三个标志(0 或 1)
km.remap_axis() >>>
km.remap_axis(0,1,0) >>>
km.remap_axis(0) >>>
invert_x([state]) — GET/SET
km.invert_x(1) >>>
invert_y([state]) — GET/SET
km.invert_y(1) >>>
swap_xy([state]) — GET/SET
km.swap_xy(1) >>>
键盘命令
down(key) — SET
km.down('shift')
>>> up(key) — SET
km.up("ctrl")
>>> press(key[,hold_ms[,rand_ms]]) — SET
- key: HID码(0-255)或引用的按键名称
- hold_ms: 按住时间(可选)。如果省略,使用随机 35-75ms(值会被记录日志)
- rand_ms: 可选随机范围,添加到 hold_ms(0 = 无随机化)
- 注意:持续时间会自动舍入到键盘的 bInterval 以进行 USB 同步
km.press('a')
>>> 使用随机 35-75ms 按住时间(已记录)
km.press('d', 50)
>>> 精确按住 50ms
km.press('d', 50, 10)
>>> 50ms 基础 + 随机 0-10ms
string(text) — SET
使用自动计时的队列按键输入输入 ASCII 字符串。自动处理大写字母和符号的 Shift。使用定时队列系统(无定时器插槽限制)。
- text: 要输入的 ASCII 字符串(最多 256 个字符)
- 每个字符使用随机 35-75ms 按住时间(内部计时,不记录日志)
- 字符间延迟:字符之间 10ms
km.string("Hello")
>>> km.string("Test123!")
>>> km.string("hello")
>>> init() — SET
km.init() >>>
isdown(key) — GET
km.isdown("ctrl")
>>> km.isdown(1)
>>> 如果按键按下返回 1,释放返回 0。
disable([key1,key2,...] | [key,mode]) — GET/SET
禁用/启用键盘按键以阻止它们被发送到主机。
- () - 列出所有当前禁用的按键,格式为 (a,c,f,)(显示按键名称(如果可用),否则显示 HID 码)
- (key1,key2,...) - 一次禁用多个按键。按键可以是 HID 码或引用的按键名称(例如,'a'、'f1'、'ctrl')
- (key,mode) - 启用或禁用单个按键。mode:1=禁用,0=启用
km.disable() >>> km.disable(a,c,f,) >>>
km.disable('a','c','f')
>>> km.disable('f1','alt','win')
>>> km.disable('a', 0)
>>> km.disable('a', 1)
>>> km.disable(4,6,9) >>>
mask(key[,mode]) — GET/SET
km.mask('a',1)
>>> remap(source,target) — GET/SET
km.remap('a','b')
>>> km.remap('a',0)
>>> 完整键盘按键参考
键盘按键参考表。所有按键支持 HID 码或字符串名称。单字符字母区分大小写(小写输入小写,大写自动使用 Shift 输入大写)。多字符特殊键不区分大小写。
| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'a' | 4 | a | A |
| 'b' | 5 | b | B |
| 'c' | 6 | c | C |
| 'd' | 7 | d | D |
| 'e' | 8 | e | E |
| 'f' | 9 | f | F |
| 'g' | 10 | g | G |
| 'h' | 11 | h | H |
| 'i' | 12 | i | I |
| 'j' | 13 | j | J |
| 'k' | 14 | k | K |
| 'l' | 15 | l | L |
| 'm' | 16 | m | M |
| 'n' | 17 | n | N |
| 'o' | 18 | o | O |
| 'p' | 19 | p | P |
| 'q' | 20 | q | Q |
| 'r' | 21 | r | R |
| 's' | 22 | s | S |
| 't' | 23 | t | T |
| 'u' | 24 | u | U |
| 'v' | 25 | v | V |
| 'w' | 26 | w | W |
| 'x' | 27 | x | X |
| 'y' | 28 | y | Y |
| 'z' | 29 | z | Z |
km.press('a') # types "a" (HID 4)
km.press('A') # types "A" (HID 4 + Shift)| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| '1' | 30 | 1 | ! |
| '2' | 31 | 2 | @ |
| '3' | 32 | 3 | # |
| '4' | 33 | 4 | $ |
| '5' | 34 | 5 | % |
| '6' | 35 | 6 | ^ |
| '7' | 36 | 7 | & |
| '8' | 37 | 8 | * |
| '9' | 38 | 9 | ( |
| '0' | 39 | 0 | ) |
km.press('1') # types "1" (HID 30)
km.down('shift')
km.press('1') # types "!" (HID 30 + Shift)
km.up('shift')| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'enter', 'return' | 40 | Enter | - |
| 'escape', 'esc' | 41 | Escape | - |
| 'backspace', 'back' | 42 | Backspace | - |
| 'tab' | 43 | Tab | - |
| 'space', 'spacebar' | 44 | - |
km.press('enter') # Enter key (HID 40)| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'minus', 'dash', 'hyphen' | 45 | - | _ |
| 'equals', 'equal' | 46 | = | + |
| 'leftbracket', 'lbracket', 'openbracket' | 47 | [ | { |
| 'rightbracket', 'rbracket', 'closebracket' | 48 | ] | } |
| 'backslash', 'bslash' | 49 | \ | | |
| 'nonus_hash' | 50 | # | - |
| 'semicolon', 'semi' | 51 | ; | : |
| 'quote', 'apostrophe', 'singlequote' | 52 | ' | " |
| 'grave', 'backtick', 'tilde' | 53 | ` | ~ |
| 'comma' | 54 | , | < |
| 'period', 'dot' | 55 | . | > |
| 'slash', 'forwardslash', 'fslash' | 56 | / | ? |
| 'capslock', 'caps' | 57 | Caps Lock | - |
km.press('minus') # types "-" (HID 45)
km.down('shift')
km.press('minus') # types "_" (HID 45 + Shift)
km.up('shift')| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'f1' | 58 | F1 | - |
| 'f2' | 59 | F2 | - |
| 'f3' | 60 | F3 | - |
| 'f4' | 61 | F4 | - |
| 'f5' | 62 | F5 | - |
| 'f6' | 63 | F6 | - |
| 'f7' | 64 | F7 | - |
| 'f8' | 65 | F8 | - |
| 'f9' | 66 | F9 | - |
| 'f10' | 67 | F10 | - |
| 'f11' | 68 | F11 | - |
| 'f12' | 69 | F12 | - |
km.press('f1') # F1 key (HID 58)| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'printscreen', 'prtsc', 'print' | 70 | Print Screen | - |
| 'scrolllock', 'scroll' | 71 | Scroll Lock | - |
| 'pause', 'break' | 72 | Pause/Break | - |
| 'insert', 'ins' | 73 | Insert | - |
| 'home' | 74 | Home | - |
| 'pageup', 'pgup' | 75 | Page Up | - |
| 'delete', 'del' | 76 | Delete | - |
| 'end' | 77 | End | - |
| 'pagedown', 'pgdown', 'pgdn' | 78 | Page Down | - |
| 'right', 'rightarrow' | 79 | Right Arrow | - |
| 'left', 'leftarrow' | 80 | Left Arrow | - |
| 'down', 'downarrow' | 81 | Down Arrow | - |
| 'up', 'uparrow' | 82 | Up Arrow | - |
| 'numlock', 'num' | 83 | Num Lock | - |
km.press('home') # Home key (HID 74)| 按键名称 | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'kpdivide', 'npdivide' | 84 | / | - |
| 'kpmultiply', 'npmultiply' | 85 | * | - |
| 'kpminus', 'npminus' | 86 | - | - |
| 'kpplus', 'npplus' | 87 | + | - |
| 'kpenter', 'npenter' | 88 | Enter | - |
| 'kp1', 'np1' | 89 | 1 | - |
| 'kp2', 'np2' | 90 | 2 | - |
| 'kp3', 'np3' | 91 | 3 | - |
| 'kp4', 'np4' | 92 | 4 | - |
| 'kp5', 'np5' | 93 | 5 | - |
| 'kp6', 'np6' | 94 | 6 | - |
| 'kp7', 'np7' | 95 | 7 | - |
| 'kp8', 'np8' | 96 | 8 | - |
| 'kp9', 'np9' | 97 | 9 | - |
| 'kp0', 'np0' | 98 | 0 | - |
| 'kpperiod', 'kpdot', 'npperiod', 'npdot' | 99 | . | - |
km.press('kp1') # Numpad 1 (HID 89)| 按键名称(别名) | HID | 正常输出 | Shift 输出 |
|---|---|---|---|
| 'leftctrl', 'lctrl', 'leftcontrol', 'lcontrol', 'ctrl', 'control' | 224 | Left Ctrl | - |
| 'leftshift', 'lshift', 'shift' | 225 | Left Shift | - |
| 'leftalt', 'lalt', 'alt' | 226 | Left Alt | - |
| 'leftgui', 'lgui', 'leftwin', 'lwin', 'gui', 'win', 'windows', 'super', 'meta', 'cmd', 'command' | 227 | Left GUI | - |
| 'rightctrl', 'rctrl', 'rightcontrol', 'rcontrol' | 228 | Right Ctrl | - |
| 'rightshift', 'rshift' | 229 | Right Shift | - |
| 'rightalt', 'ralt' | 230 | Right Alt | - |
| 'rightgui', 'rgui', 'rightwin', 'rwin', 'rightwindows' | 231 | Right GUI | - |
注意:通用名称('ctrl'、'shift'、'alt'、'gui')默认为左侧变体
km.down('ctrl') # Left Ctrl (HID 224)
km.up('ctrl')流式
keyboard([mode[,period]]) — GET/SET
流式传输键盘按键,使用人类可读的名称。模式 1=raw(物理输入),2=constructed frame(重映射/屏蔽后);周期限制在 1-1000 帧。
输出格式:keyboard(raw,shift,'h') 或 keyboard(constructed,ctrl,shift,'a') - 修饰键和按键显示为名称(如 'shift', 'ctrl', 'h', 'a')而不是 HID 数字。
km.keyboard(2,50) >>>
km.keyboard(1,100) >>>
axis([mode[,period_ms]]) — GET/SET
输出格式:raw(x,y,w) 或 mut(x,y,w),其中 w 是滚轮增量。
km.axis(1,25) >>>
km.axis(2,10) >>>
mouse([mode[,period_ms]]) — GET/SET
km.mouse(2,25) >>>
km.mouse(1,10) >>>
设备发送 8 字节二进制帧(x,y 为 int16):
km.mouse<8 bytes> >>>
其他
help() — GET
km.help() >>>
info() — GET
km.info() >>>
version() — GET
km.version() >>>
device() — GET
km.device() >>>
fault() — GET
返回存储的解析故障信息,包括 ESP32 MAC 地址、失败的端点地址、接口编号、失败原因和原始 HID 描述符字节。用于调试解析失败的设备。
km.fault() >>>
reboot() — SET
km.reboot() >>>
serial([text]) — GET/SET
用于更改连接到 MAKCU 的鼠标或键盘的序列号。此更改是持久的,即使在未来的固件更新后也会保留。注意:MAKCU 不允许为不包含序列号的设备更改序列号。
km.serial()
>>> km.serial("MAKCU001")
>>> 返回当前序列号。
km.serial("MAKCU001")
>>> km.serial(0) >>>
回显 ACK。更改在固件更新后仍然保留。
log([level]) — GET/SET
km.log(3) >>>
echo([enable]) — GET/SET
km.echo(1) >>>
baud([rate]) — GET/SET
km.baud(115200) >>>
km.baud(921600) >>>
立即生效;主机需以新波特率重新打开串口。
bypass([mode]) — GET/SET
阻止鼠标端点发送到 USB 1,所有其他端点将正常通过。可在未连接 USB 设备的情况下工作。
- () - 查询当前状态
- (0) - 关闭(恢复 USB 写入,禁用遥测)
- (1) - 鼠标绕过(启用 km.mouse(1,1) 并禁用 USB 写入)
- (2) - 键盘绕过(启用 km.keyboard(1,1) 并禁用 USB 写入)
km.bypass() >>> km.bypass(0) >>>
如果未检测到设备,会警告 (no mouse) 或 (no keyboard)
km.bypass(1) >>>
km.bypass(2) >>>
km.bypass(0) >>>
hs([enable]) — GET/SET
km.hs(1) >>>
led([target[,mode[,times,delay_ms]]]) — GET/SET
控制设备和主机两侧的 LED 和 RGB 状态。支持查询、控制和闪烁功能。
- led() - 查询设备 LED 状态(向后兼容)
- led(1) - 查询设备 LED 状态
- led(2) - 查询主机 LED 状态(通过 UART)
- 返回:(device,off)、(device,on)、(device,slow_blink)、(device,fast_blink)、(host,off)、(host,on) 等
- led(0) - 关闭设备 LED(向后兼容)
- led(1) - 打开设备 LED(向后兼容,但与查询冲突 - 使用 led(1,1) 进行显式控制)
- led(1, 0) - 关闭设备 LED
- led(1, 1) - 打开设备 LED
- led(2, 0) - 关闭主机 LED(通过 UART)
- led(2, 1) - 打开主机 LED(通过 UART)
- Target: 1 = 设备 LED,2 = 主机 LED(USB 主机侧,通过 UART 控制)
- Mode: 0 = 关闭,1 = 打开
- led(1, times, delay_ms) - 闪烁设备 LED(例如,led(1, 3, 200) = 3 次闪烁,每次 200ms)
- led(2, times, delay_ms) - 闪烁主机 LED(例如,led(2, 5, 100) = 5 次闪烁,每次 100ms)
- Flash parameters: times = 闪烁次数(默认 1),delay_ms = 闪烁之间的延迟(毫秒)(默认 100ms,最大 5000ms)
km.led() >>> km.led(device,on) >>>
km.led(2) >>> km.led(host,off) >>>
km.led(1, 0) >>>
km.led(2, 1) >>>
km.led(1, 3, 200) >>>
km.led(2, 5, 100) >>>
release([timer_ms]) — GET/SET
自动释放监控系统。持续监控独立的锁定、按键和键状态。当计时器到期时,仅释放仍处于活动状态的相应值(不是全部)。该设置会持久保存到存储中,并在启动/引导时自动启用。`()` 获取状态(0=禁用,否则为时间 ms);`(timer_ms)` 设置计时器 500-300000ms(5 分钟),(0) 禁用。
km.release() >>>
km.release(5000) >>>
km.release(0) >>>
screen([W,H]) — GET/SET
km.screen(1920,1080) >>>
km.screen(2560,1440) >>>
波特率变更(传统)
DE AD 05 00 A5 00 C2 01 00
解析:DE AD | 05 00(长度=5)| A5(命令)|00 C2 01 00(115200 小端)
V2 API (二进制)
- 帧格式:[0x50] [CMD] [LEN_LO] [LEN_HI] [PAYLOAD...]
- 0x50 - 帧起始字节(固定)
- CMD - 命令字节(0x01-0xFF)
- LEN_LO / LEN_HI - 负载长度(小端序,16位)
- PAYLOAD - 命令特定数据(可变长度)
- 设置命令 (SET):返回 [0x50] [CMD] [LEN_LO] [LEN_HI] [status:u8],其中 0x00 表示成功 (OK),0x01 表示错误 (ERR)
- 查询命令 (GET):返回 [0x50] [CMD] [LEN_LO] [LEN_HI] [PAYLOAD...],包含原始值字节或结构化数据
- 流式命令:返回原始 HID 帧字节(无文本格式),格式为 [0x50] [CMD] [LEN_LO] [LEN_HI] [PAYLOAD...]
- 数据格式:多字节值使用小端序(little-endian)。示例:查询波特率(命令 0xB1,无负载)返回 [0x50] [0xB1] [0x04] [0x00] [0x00] [0xC2] [0x01] [0x00],其中 0x00C20100 = 115200(小端序)
- 在后续命令示例中,我们仅显示:[CMD] [PAYLOAD...]
鼠标
点击调度 (SET)
[0x04] [button:u8] [count:u8] [delay_ms:u8] Response: [0x04] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
turbo() (GET/SET)
[0x17] Response: [0x17] [btn1-5_delay:u16×5]
返回 10 字节:按键 1-5 的 5 个延迟(每个 u16)。
[0x17] [button:u8] [delay_ms:u16] Response: [0x17] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
鼠标移动
move(dx,dy[,segments[,cx1,cy1]]) — SET (0x0D)
[0x0D] [x:i16] [y:i16] [segments:u8] [cx1:i8] [cy1:i8] Response: [0x0D] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
moveto(x,y[,segments[,cx1,cy1[,cx2,cy2]]]) — SET (0x0E)
[0x0E] [x:i16] [y:i16] [segments:u8] [cx1:i16] [cy1:i16] [cx2:i16] [cy2:i16] Response: [0x0E] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
wheel(delta) — SET (0x18)
[0x18] [delta:i8] Response: [0x18] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
pan([steps]) — GET/SET (0x0F)
[0x0F] Response: [0x0F] [pending:i8]
[0x0F] [steps:i8] Response: [0x0F] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
swap_xy([enable]) — GET/SET (0x15)
[0x15] Response: [0x15] [enabled:u8]
返回 0=禁用,1=启用。
[0x15] [enable:u8] Response: [0x15] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
tilt([steps]) — GET/SET (0x16)
[0x16] Response: [0x16] [pending:i8]
[0x16] [steps:i8] Response: [0x16] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
silent(x,y) — SET (0x14)
[0x14] [x:i16] [y:i16] Response: [0x14] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
鼠标高级
catch_<target>([mode]) — GET/SET (0x03)
[0x03] Response: [0x03] [mode:u8]
[0x03] [mode:u8] Response: [0x03] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
getpos() — GET (0x05)
[0x05] Response: [0x05] [x:i16] [y:i16]
返回当前指针位置(int16 坐标)。
invert_x([enable]) — GET/SET (0x06)
[0x06] Response: [0x06] [enabled:u8]
返回 0=禁用,1=启用。
[0x06] [enable:u8] Response: [0x06] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
invert_y([enable]) — GET/SET (0x07)
[0x07] Response: [0x07] [enabled:u8]
返回 0=禁用,1=启用。
[0x07] [enable:u8] Response: [0x07] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
lock_<target>([state]) — GET/SET (0x09)
[0x09] Response: [0x09] [locked:u8]
返回 1=锁定,0=解锁。
[0x09] [state:u8] Response: [0x09] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
mo(buttons,x,y,wheel,pan,tilt) — SET (0x0B)
[0x0B] [buttons:u8] [x:i16] [y:i16] [wheel:i8] [pan:i8] [tilt:i8] Response: [0x0B] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
remap_axis([inv_x,inv_y,swap]) — GET/SET (0x19)
- () - 查询当前设置
- (0) - 重置所有轴映射
- (inv_x,inv_y,swap) - 设置所有三个标志(每个 0 或 1)
[0x19] Response: [0x19] [inv_x:u8] [inv_y:u8] [swap:u8]
返回 3 字节:inv_x, inv_y, swap(每个 0=禁用,1=启用)。
[0x19] [inv_x:u8] [inv_y:u8] [swap:u8] Response: [0x19] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。原子性设置所有三个标志。
[0x19] [0x00] Response: [0x19] [status:u8]
重置所有轴映射(将所有标志设为 0)。
键盘
disable([key1,key2,...] | [key,mode]) — GET/SET (0xA1)
[0xA1] Response: [0xA1] [disabled_keys:u8×N]
返回禁用的 HID 码列表。
[0xA1] [key1:u8]...[keyN:u8] Response: [0xA1] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
down(key) — SET (0xA2)
[0xA2] [key:u8] Response: [0xA2] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
init() — SET (0xA3)
[0xA3] Response: [0xA3] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
isdown(key) — GET (0xA4)
[0xA4] [key:u8] Response: [0xA4] [is_down:u8]
返回 0=释放,1=按下。
mask(key[,mode]) — SET (0xA6)
[0xA6] [key:u8] [mode:u8] Response: [0xA6] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
press(key[,hold_ms[,rand_ms]]) — SET (0xA7)
[0xA7] [key:u8] [hold_ms:u8] [rand_ms:u8] Response: [0xA7] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
remap(source,target) — SET (0xA8)
[0xA8] [source:u8] [target:u8] Response: [0xA8] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
string(text) — SET (0xA9)
[0xA9] [text:u8×N] Response: [0xA9] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
up(key) — SET (0xAA)
[0xAA] [key:u8] Response: [0xAA] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
流式
axis([mode[,period_ms]]) — GET/SET (0x01)
[0x01] Response: [0x01] [mode:u8] [period:u8]
[0x01] [mode:u8] [period:u8] Response: [0x01] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
设备在轴变化时发送 6 字节二进制帧:
[0x01] [dx:i16] [dy:i16] [wheel:i8]
mouse([mode[,period_ms]]) — GET/SET (0x0C)
[0x0C] Response: [0x0C] [mode:u8] [period:u8]
[0x0C] [mode:u8] [period:u8] Response: [0x0C] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
设备在鼠标数据变化时发送 8 字节二进制帧:
[0x0C] [buttons:u8] [dx:i16] [dy:i16] [wheel:i8] [pan:i8] [tilt:i8]
keyboard([mode[,period_ms]]) — GET/SET (0xA5)
[0xA5] Response: [0xA5] [mode:u8] [period:u8]
[0xA5] [mode:u8] [period:u8] Response: [0xA5] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
设备在键盘数据变化时发送 15 字节二进制帧:
[0xA5] [modifiers:u8] [keys:u8×14]
修饰符字节:ctrl、shift、alt、gui 等的位标志。按键数组:最多 14 个 HID 码。
其他
baud([rate]) — GET/SET (0xB1)
[0xB1] Response: [0xB1] [rate:u32]
返回当前波特率(uint32,小端序)。
[0xB1] [rate:u32] Response: [0xB1] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。更改是持久的。
bypass([mode]) — GET/SET (0xB2)
[0xB2] Response: [0xB2] [mode:u8]
[0xB2] [mode:u8] Response: [0xB2] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
echo([enable]) — GET/SET (0xB4)
[0xB4] Response: [0xB4] [enabled:u8]
[0xB4] [enable:u8] Response: [0xB4] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。当回显禁用时,大多数设置命令不会回显其输入。
hs([enable]) — GET/SET (0xB7)
[0xB7] Response: [0xB7] [enabled:u8]
[0xB7] [enable:u8] Response: [0xB7] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。设置在重启后仍然保留。
led([...]) — GET/SET (0xB9)
Query device: [0xB9] Query host: [0xB9] [0x02] Response: [0xB9] [target:u8] [state:u8]
状态:0=关闭,1=开启,2=慢闪,3=快闪
Set: [0xB9] [target:u8] [mode:u8] Response: [0xB9] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
Flash: [0xB9] [target:u8] [times:u32] [delay_ms:u32] Response: [0xB9] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。控制 LED 和 RGB。次数:1-255,延迟:100-5000ms
log([level]) — GET/SET (0xBA)
[0xBA] Response: [0xBA] [level:u8]
[0xBA] [level:u8] Response: [0xBA] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
release([timer_ms]) — GET/SET (0xBC)
[0xBC] Response: [0xBC] [timer_ms:u32]
如果禁用返回 0,否则返回时间(毫秒)。
[0xBC] [timer_ms:u32] Response: [0xBC] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
screen([W,H]) — GET/SET (0xBD)
[0xBD] Response: [0xBD] [width:i16] [height:i16]
[0xBD] [width:i16] [height:i16] Response: [0xBD] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。
serial([text]) — GET/SET (0xBE)
[0xBE] Response: [0xBE] [serial:u8×N]
返回当前序列号(ASCII 字节)。
[0xBE] [text:u8×N] Response: [0xBE] [status:u8]
成功返回 0x00 (OK),错误返回 0x01 (ERR)。更改在固件更新后仍然保留。
device() — GET (0xB3)
[0xB3] Response: [0xB3] [type:u8]
类型:0=无,1=键盘,2=鼠标
fault() — GET (0xB5)
[0xB5] Response: [0xB5] [parse_fault_t struct]
返回包含 MAC、端点、原因和原始描述符字节的 parse_fault_t 结构。
info() — GET (0xB8)
[0xB8] Response: [0xB8] [field_count:u8] [fields...]
返回包含系统/设备信息键值对的结构化二进制数据。设备信息在首次获取后缓存。
reboot() — SET (0xBB)
[0xBB] Response: [0xBB] [status:u8]
始终返回 0x00(成功)。设备在发送响应后重启。
version() — GET (0xBF)
[0xBF] Response: [0xBF] [version:u8×N]
返回固件版本(ASCII 字节)。