# Autojs_自定义TCP通信协议 **Repository Path**: xaek/Autojs_TCP_protocol ## Basic Information - **Project Name**: Autojs_自定义TCP通信协议 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-06-20 - **Last Updated**: 2025-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Auto.js 6 PC客户端通信协议 ## 1. 协议概述 本项目所用协议是直接基于 TCP 套接字自定义设计的,通信方式和 WebSocket 一样支持全双工(即双方可以同时收发消息),但其握手和数据格式与 WebSocket 标准不同,因此不能与标准 WebSocket 客户端或服务器直接通信。 * **服务端**: PC客户端作为服务端,默认监听端口为 `6347`。 * **客户端**: Auto.js App 作为客户端连接到 PC客户端。 ## 2. 数据帧结构 所有消息都遵循一个自定义的数据帧格式。每个数据帧由一个 8 字节的头部和随后的载荷(Payload)组成。 `[4 字节: 载荷长度][4 字节: 载荷类型][载荷内容]` * **载荷长度**: 一个 32 位大端序整数,表示后续载荷的字节数。 * **载荷类型**: 一个 32 位大端序整数,表示载荷内容的类型。 ### 载荷类型 | 类型值 | 常量名 | 描述 | | :----- | :--------------- | :----------------------------- | | `1` | `TYPE_TEXT` | UTF-8 编码的 JSON 字符串 | | `2` | `TYPE_BINARY` | 二进制数据 (例如文件) | | `3` | `TYPE_GZIP_TEXT` | Gzip 压缩后的 UTF-8 JSON 字符串 | | `4` | `TYPE_GZIP_BINARY` | Gzip 压缩后的二进制数据 | ## 3. JSON 消息结构 当载荷类型为 `TYPE_TEXT` 或 `TYPE_GZIP_TEXT` 时,其内容是一个 JSON 字符串。该 JSON 对象遵循以下基本结构: ```json { "id": "number", "type": "string", "data": "object" } ``` * **`id`**: 消息的唯一标识符,由发送方生成,递增。 * **`type`**: 消息的类型,用于区分不同的操作和事件。 * **`data`**: 一个包含具体数据的对象。 ## 4. 通信流程 ### 4.1. 握手 (Handshake) 连接建立后,客户端(Auto.js App)必须首先发送一个 `hello` 消息来完成握手。 **Auto.js App -> PC客户端** ```json { "type": "hello", "data": { "device_name": "string", "app_version": "string", "app_version_code": "number", "server_version": "number", "device_id": "string" } } ``` **PC客户端 -> Auto.js App** PC客户端收到 `hello` 消息后,会回复一个 `hello` 消息,表示握手成功。 ```json { "type": "hello", "data": { "client_version": "number" } } ``` ### 4.2. PC客户端 -> Auto.js App 消息 PC客户端向 Auto.js App 发送的命令。 #### `command`: 运行脚本 * **type**: `command` * **data.command**: `run` * **data**: ```json { "command": "run", "id": "string", // 脚本的唯一标识,通常是完整文件路径 "name": "string", // 脚本名称,通常是文件名 "script": "string" // 要执行的脚本源代码 } ``` #### `command`: 停止单个脚本 * **type**: `command` * **data.command**: `stop` * **data**: ```json { "command": "stop", "script": "string" // 要停止的脚本的唯一标识,通常是完整文件路径 } ``` #### `command`: 停止所有脚本 * **type**: `command` * **data.command**: `stopAll` * **data**: `{}` #### `command`: 保存脚本 * **type**: `command` * **data.command**: `save` * **data**: ```json { "command": "save", "script": "string", // 在设备上保存的文件路径 "text": "string" // 要保存的脚本源代码 } ``` #### `bytes_command`: 运行项目 / 保存项目 运行或保存项目是一个复合操作,由一个 `bytes_command` 消息和随后的二进制数据流组成。 1. **发送 `bytes_command` 消息** * **type**: `bytes_command` * **md5**: "string" // 整个项目压缩包的 MD5 哈希值 * **data**: ```json { "command": "string", // "run_project" 或 "save_project" "path": "string" // 项目文件夹的名称 } ``` 2. **发送项目数据** 紧接着 `bytes_command` 消息之后,PC客户端会将整个项目文件夹打包成 zip,再经过 Gzip 压缩,然后作为二进制数据流 (`TYPE_GZIP_BINARY`) 发送。 ### 4.3. Auto.js App -> PC客户端消息 Auto.js App 向 PC客户端发送的事件和数据。 #### `log`: 日志信息 * **type**: `log` * **data**: ```json { "log": "string" // 来自设备的日志信息 } ``` #### `error`: 错误信息 * **type**: `error` * **data**: ```json { "log": "string" // 来自设备的错误信息 } ``` #### `build_info`: 构建信息 * **type**: `build_info` * **data**: ```json { "message": "string" // 构建信息,例如 "项目已保存" } ```