NexTap机械手
NexTap 是通过龙门机械手直接操作手机屏幕的真实触控方案,适用于需要绕过软件触控限制、执行实体屏幕操作的自动化场景。
模块
from ascript.ios import nextap
- 首次使用时,请在 AScript App 中手动连接 NexTap,并完成设备回零和对应手机工位的校准;后续调用 Python API 会自动连接。
- 坐标使用当前手机屏幕的物理像素坐标,原点为左上角,X 向右增加,Y 向下增加。
- 调用运动 API 前,当前手机必须完成对应方向的 XY 校准;调用 Z 轴点击 API 还需要完成该手机独立的 Z 校准。
- 运动和状态 API 返回 Python
dict,调用方应检查返回值中的ok字段。事务锁 API 的返回值不同:acquire_lock()返回 token,lock()返回上下文管理器。
成功或失败的设备响应通常包含以下字段:
{
"ok": True,
"action": "move",
"message": "...",
"connected": True,
"name": "...",
"data": {},
}
底层返回 JSON 字符串时,模块会自动解析;无法解析时返回:
{"ok": False, "message": "invalid nextap response: ..."}
状态查询
读取连接、初始化、校准、当前位置、限位、回零和方向状态。
nextap.status()
status() 是推荐写法,statue() 是兼容旧代码的别名:
nextap.status()
nextap.statue()
XY 移动
移动到屏幕坐标
移动到当前手机屏幕的绝对像素坐标 (x, y)。
nextap.move(x, y, duration_ms=0)
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
x | int | 是 | 目标屏幕 X 坐标。 |
y | int | 是 | 目标屏幕 Y 坐标。 |
duration_ms | int | 否 | 请求移动时长,默认 0,允许范围 0..30000ms。为 0 时使用 ESP32 当前全局 XY 基础速度。 |
- 坐标必须在当前校准方向的有效屏幕范围内,否则返回
RANGE。 duration_ms > 0时,App 会根据目标距离和请求时长计算显式移动速度。- 运动由 ESP32 步进规划执行,包含加速、匀速、减速和目标停稳。
- 该方法是同步 API,返回时本次运动命令已经结束或失败。
示例:
from ascript.ios import nextap
# 使用当前基础速度移动
nextap.move(947, 2079)
# 请求在 800 毫秒内完成移动
nextap.move(947, 2079, duration_ms=800)
nextap.move(0, 0) 表示移动到屏幕左上角,不是执行机械 HOME。
点击
原子点击动作。固件会在一个运动任务中完成 XY 定位、Z 下压、保持和抬起,不会让多个 Python 调用交叉执行。
nextap.click(x, y, dur=20, count=1, interval=150)
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
x | int | 是 | 点击屏幕 X 坐标。 |
y | int | 是 | 点击屏幕 Y 坐标。 |
dur | int | 否 | Z 轴接触保持时间,默认 20ms,允许范围 1..3000ms。 |
count | int | 否 | 点击次数,默认 1;大于等于 2 时在同一坐标执行多击。 |
interval | int | 否 | 多击之间的目标开始时间间隔,允许范围 40..300ms。 |
多击总请求时间不能超过 10000ms。动作流程为:
XY 加速移动 -> 减速 -> 回差补偿和低速精定位 -> 停稳
-> 使用当前手机独立 Z 接触位置下压约 2mm
-> 保持 dur 毫秒 -> 自动抬起
示例:
from ascript.ios import nextap
# 单击
nextap.click(661, 1398)
# 点击并保持 20 毫秒
nextap.click(661, 1398, dur=20)
# 双击
nextap.click(661, 1398, count=2, interval=150)
双击
双击快捷方法,等价于在同一个坐标调用一次 click() 并设置 count=2。
nextap.double_click(x, y, dur=20, interval=150)
等价写法:
nextap.click(x, y, dur=dur, count=2, interval=interval)
同一个坐标只执行一次 XY 定位。
贝塞尔滑动
滑动
从 (x, y) 滑动到 (x1, y1)。参数顺序与 action.slide 保持一致;默认时长为 300ms。
nextap.slide(
x, y, x1, y1,
dur=300,
interpolator=None,
control_points=None,
)
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
x、y | int | 是 | 滑动起点坐标。 |
x1、y1 | int | 是 | 滑动终点坐标。 |
dur | int | 否 | 滑动时长,默认 300ms,允许范围 50..5000ms。 |
interpolator | str、tuple、list 或 None | 否 | 速度曲线,默认 None,表示线性速度。 |
control_points | list、int 或 None | 否 | 贝塞尔控制点。None 或空列表表示直线。 |
滑动规则:
- 显式控制点格式为
[c1x, c1y, c2x, c2y, ...]。 [c1x, c1y]表示一个控制点的二次贝塞尔曲线。[c1x, c1y, c2x, c2y]表示两个控制点的三次贝塞尔曲线。- 当前固件和 BLE 协议最多支持 8 组控制点,即数组最多 16 个数字。
- 控制点也必须落在当前校准屏幕范围内,否则返回
RANGE。 - 滑动由 ESP32 按贝塞尔采样点执行,每段仍使用步进器加减速,不会瞬间启动或急停。
示例:
from ascript.ios import nextap
# 直线滑动
nextap.slide(100, 300, 800, 1200)
# 二次贝塞尔曲线:一个控制点
nextap.slide(100, 300, 800, 1200, control_points=[400, 600])
# 三次贝塞尔曲线:两个控制点
nextap.slide(100, 300, 800, 1200,
control_points=[300, 400, 600, 900])
# 使用加速曲线
nextap.slide(100, 300, 800, 1200,
dur=600,
interpolator=("accelerate", 1.5))
支持的插值器名称:
linear
accelerate
decelerate
accelerate_decelerate
也可以写成带因子的字符串,例如:
nextap.slide(100, 300, 800, 1200,
interpolator="accelerate:1.5")
因子范围是 0.1..5.0。iOS 端支持字符串、(name, factor) 元组或 [name, factor] 列表。
整数控制点
为了模拟人手抖动,control_points 也可以传入整数,由 Python 层生成随机控制点:
# 根据距离自动生成至少 1 组随机控制点
nextap.slide(100, 300, 800, 1200, control_points=0)
# 请求生成 3 组随机控制点
nextap.slide(100, 300, 800, 1200, control_points=3)
整数 <= 0 会根据距离自动决定至少 1 组;正整数表示请求的随机控制点组数。当前上限是 8 组,因此 control_points=100 会报参数错误。
Z 轴
下压
使用当前手机独立的 Z 校准数据下压,包含约 2mm 的接触后过行程,保持指定时间后自动抬起。
nextap.down(duration_ms=20)
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
duration_ms | int | 否 | 接触保持时间,默认 20ms,允许范围 1..3000ms。 |
该方法只控制 Z 轴,不移动 XY,也不经过 XY 龙门的路径规划。
抬起
抬起触控头并释放当前设备锁,只控制 Z 轴,不移动 XY。
nextap.up()
