news 2026/8/29 15:24:19

Linux桌面投屏实战:用Doubletake实现AirPlay屏幕镜像发送

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux桌面投屏实战:用Doubletake实现AirPlay屏幕镜像发送

之前在做 Linux 桌面投屏方案选型时,我一直被一个问题困扰:手机、平板上的 AirPlay 投屏资料一抓一大把,但 Linux 作为发送端往 Apple TV 或支持 AirPlay 的电视上推流的方案却少得可怜。传统思路要么绕道 DLNA,要么借助 HDMI 采集卡走硬接线,体验都谈不上优雅。直到我接触到 Doubletake 这个工具,才发现 Linux 下做 AirPlay/TV 屏幕镜像发送并不是一件遥不可及的事,而且它对 X11 和 Wayland 双显示服务器协议都有对应的处理思路。

这篇文章会围绕 Doubletake 展开,先讲清楚它在整个投屏链路中的位置,再带你从零开始完成环境准备、编译构建、运行配置和实际投屏。如果你是 Linux 桌面用户、嵌入式开发工程师,或者正在折腾家庭影音方案的开发者,这篇文章应该能帮你省下不少查资料的功夫。

1. 背景与核心概念

1.1 什么是 Doubletake

Doubletake 是一个运行在 Linux 平台上的 AirPlay / TV 屏幕镜像发送工具。简单来说,它让 Linux 电脑变成“发送端”,把当前桌面屏幕内容实时编码并通过网络推送到支持 AirPlay 的接收设备上,比如 Apple TV、部分智能电视、HomePod 等。

这里要区分两个容易混淆的角色:

角色方向常见实现
接收端(Receiver)被动接收流并显示RPiPlay、UxPlay、AirServer
发送端(Sender)主动采集屏幕并推送Doubletake、AirPlay 官方生态中的 macOS/iOS 设备

大多数开源项目聚焦在接收端,也就是把树莓派或旧电脑变成“AirPlay 接收器”。但如果你想把 Linux 桌面投到客厅的大电视上,接收端方案帮不了你,这时候需要的是发送端工具,Doubletake 正好填补了这个空缺。

1.2 AirPlay 投屏链路的基本组成

一次完整的 AirPlay 镜像投屏,大致包含下面几个环节:

  1. 屏幕画面采集:从系统获取当前帧缓冲(framebuffer)或窗口画面。
  2. 视频编码:将原始画面用 H.264 等编码格式压缩。
  3. 音频采集与编码:需要同步采集系统音频并编码,通常使用 AAC。
  4. 会话协商:通过 HTTP/JSON 与接收端完成能力协商、密钥交换。
  5. 流媒体传输:通过 RTSP 建立会话,使用 RTP 传输音视频数据。
  6. 控制指令交互:处理暂停、停止、音量调整等控制消息。

Doubletake 的定位就是把这整个链路在 Linux 桌面上打通。

1.3 X11 与 Wayland:屏幕采集方式完全不同

屏幕镜像发送的第一步是采集屏幕画面,而这恰恰是 Linux 平台最容易出问题的地方。Linux 图形栈目前处于 X11 与 Wayland 并存的状态,两者在屏幕采集 API 上差异非常大:

显示服务器采集方式特点
X11XGetImage、XShmGetImage、Xfixes 扩展成熟稳定,任何窗口/整个屏幕都能采集,权限宽松
Waylandwlr-screencopy 协议、PipeWire 门户(xdg-desktop-portal)安全模型严格,应用默认无法采集其他窗口,需要用户授权或专用协议支持

在 X11 环境下,Doubletake 可以直接通过 XCB/XShm 抓取屏幕内容;在 Wayland 环境下,则需要借助 wlr-screencopy 或 PipeWire 门户机制。这也是为什么文章中会反复强调 X11 和 Wayland 这两个关键词——它们不只是显示服务器,还直接决定了 Doubletake 的编译选项和运行行为。

1.4 为什么需要掌握这个工具

从实际应用场景来看,Doubletake 至少能解决下面几类需求:

  • 用 Linux 电脑替代 Apple TV 生态中的投屏发送端,把开发演示、代码讲解、视频画面投到电视上。
  • 在嵌入式 Linux 设备中集成 AirPlay 发送能力,实现类似“无线投屏盒子”的产品功能。
  • 在家庭媒体中心场景中,把 Linux 主机上的播放内容推送到客厅电视。
  • 研究 AirPlay 镜像协议本身,作为学习 RTSP/RTP/H.264 的活教材。

对开发者来说,掌握 Doubletake 不只是会跑一个工具,更是理解了整个 AirPlay 发送链路的工程实现方法。

2. 环境准备与版本说明

2.1 系统与显示服务器要求

Doubletake 本质上是一个较新的开源项目,对系统环境有一定要求。以我实测的常见环境为例:

操作系统:Ubuntu 22.04 LTS / Debian 12 / Arch Linux 显示服务器:X11 或 Wayland(需支持 wlr-screencopy 或 PipeWire portal) 桌面环境:GNOME / KDE Plasma / Sway / Hyprland 等

如果你使用的是国产 Linux 发行版(如统信 UOS、麒麟等),只要内核和图形栈版本不太旧,理论上也可以编译运行,但可能需要手动解决依赖包版本问题。

2.2 核心依赖清单

在开始编译之前,需要先确认下面这些依赖已经安装。不同发行版的包名略有差异,这里以 Ubuntu/Debian 为例:

sudo apt update sudo apt install -y \ build-essential \ cmake \ pkg-config \ libavcodec-dev \ libavformat-dev \ libavutil-dev \ libswscale-dev \ libavdevice-dev \ libao-dev \ libssl-dev \ libx11-dev \ libxext-dev \ libxfixes-dev \ libwayland-dev \ libpipewire-0.3-dev \ libepoxy-dev \ libdrm-dev \ libasound2-dev \ ninja-build

如果你的系统是 Arch Linux,可以使用 pacman 安装等价包:

sudo pacman -S --needed base-devel cmake pkg-config \ ffmpeg libao openssl libx11 libxext libxfixes \ wayland pipewire libepoxy libdrm alsa-lib ninja

这里需要说明的是,版本需要根据你的项目实际情况调整,上述命令是基于常见环境给出的示例,重点演示配置思路。如果某些包在你的发行版中不存在,可以用包管理器搜索等效包名。

2.3 支持库说明

Doubletake 的核心依赖可以分成三组:

依赖组功能关键库
多媒体编解码H.264/AAC 编码、格式封装FFmpeg(libavcodec、libavformat)
音频输出/采集音频播放与回环采集libao、ALSA
图形/显示X11/Wayland 屏幕捕获XCB、XShm、Xfixes、PipeWire

其中 FFmpeg 是最重要的一组,它承担了视频编码和封装工作。编译时需要注意 FFmpeg 必须启用 libx264 编码器支持,否则 Doubletake 可能无法完成 H.264 编码。你可以用下面的命令检查:

ffmpeg -encoders 2>/dev/null | grep libx264

如果输出为空,说明系统中 FFmpeg 缺少 libx264 支持,需要安装libx264-dev或重新编译 FFmpeg。

3. 核心原理拆解

3.1 屏幕采集层

屏幕采集是 Doubletake 的输入源头。在 X11 环境下,程序通过 XCB 连接 X Server,再使用 XShm 扩展申请一块共享内存作为帧缓冲,每次抓屏实际上是一次共享内存拷贝,效率比传统的 XGetImage 高很多。

伪代码思路如下:

// 核心思路示例:X11 下通过 XShm 抓取屏幕 xcb_connection_t *conn = xcb_connect(NULL, NULL); xcb_screen_t *screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data; // 创建共享内存段 int shmid = shmget(IPC_PRIVATE, width * height * 4, IPC_CREAT | 0777); xcb_shm_segment_info_t shm_info = { .shmid = shmid, .shmseg = xcb_generate_id(conn), }; xcb_shm_attach(conn, shm_info.shmseg, shmid, 0); // 捕获屏幕并保存为 xcb_image xcb_image_t *image = xcb_image_create_native(conn, width, height, XCB_IMAGE_FORMAT_Z_PIXMAP, screen->root_depth, NULL, width * height * 4, (uint8_t *)shmat(shmid, NULL, 0)); xcb_shm_get_image(conn, screen->root, 0, 0, width, height, 0xFFFFFFFF, XCB_IMAGE_FORMAT_Z_PIXMAP, shm_info.shmseg, 0); xcb_flush(conn);

这段代码说明了一个核心思路:屏幕像素可以先被映射到共享内存,然后 FFmpeg 可以直接从这个内存区域读取原始帧数据,避免多余拷贝。

而在 Wayland 环境下,情况完全不同。普通 Wayland 客户端无法直接读取其他客户端的窗口内容。Doubletake 需要走两条路径:

  • 如果合成器支持wlr-screencopy协议(如 Sway、Hyprland),可以直接请求抓取输出画面。
  • 如果是 GNOME 等桌面,则需要通过xdg-desktop-portal的 PipeWire 流,从 PipeWire 节点获取屏幕视频流。

这也意味着,Wayland 下投屏的延迟和帧率表现,很大程度上取决于你的合成器实现。

3.2 编码与封装层

采集到的原始帧需要交给 FFmpeg 编码。为了保证低延迟,Doubletake 通常使用libx264编码器,并开启实时调优参数。核心设置思路如下:

AVCodecContext *ctx = avcodec_alloc_context3(codec); ctx->width = screen_width; ctx->height = screen_height; ctx->time_base = (AVRational){1, 30}; ctx->framerate = (AVRational){30, 1}; ctx->pix_fmt = AV_PIX_FMT_YUV420P; ctx->codec_type = AVMEDIA_TYPE_VIDEO; ctx->bit_rate = 4000000; // 4 Mbps ctx->gop_size = 30; ctx->max_b_frames = 0; ctx->flags |= AV_CODEC_FLAG_LOW_DELAY;

关键点在于AV_CODEC_FLAG_LOW_DELAY,这个标志告诉编码器尽可能减少编码缓冲,以换取更低的端到端延迟。由于 AirPlay 镜像场景对实时性要求很高,B 帧和过大的 GOP 都会引入可感知的延迟。

封装层方面,AirPlay 镜像使用的容器格式是 MPEG-TS 或 MOV,具体取决于协商参数。FFmpeg 的AVFormatContext可以直接完成封装,通过avformat_write_headerav_write_frame输出 RTP 负载。

3.3 会话协商与 RTSP 控制

在真正的音视频数据流开始之前,Doubletake 需要与接收端完成一次 AirPlay 会话协商。这个过程大致分为:

  1. 发现设备:通过 mDNS(Bonjour)在局域网内发现支持 AirPlay 的设备。
  2. 建立 HTTP 连接:向接收端发送POST /pair-pin-start等配对请求。
  3. 密钥交换:通过 SRP 等协议完成设备配对。
  4. RTSP 握手:发送ANNOUNCESETUPRECORD等 RTSP 方法,建立音视频通道。
  5. 开始推送:使用 RTP 发送编码后的音视频流。

RTSP 握手的关键请求示意见如下:

ANNOUNCE rtsp://192.168.1.100/airplay RTSP/1.0 Content-Type: application/x-apple-please-tune CSeq: 1 ...

这个环节是 AirPlay 生态中比较敏感的部分,涉及协议细节和密钥配对。如果你是个人学习用途,只需要知道整个流程的大致结构即可,不需要完整复刻官方实现。

3.4 音视频同步机制

投屏体验好不好,音视频同步是决定性因素之一。AirPlay 使用 RTP 时间戳来完成同步,音频和视频流各自维护独立的 RTP 时间戳,接收端根据时间戳映射关系将两者对齐。

Doubletake 的做法是:音频使用系统的单调时钟(monotonic clock)打时间戳,视频以编码器输出的帧率为基础生成时间戳,两者通过一个起始偏移对齐。

// 视频时间戳生成 int64_t video_pts = av_gettime_relative(); // 音频时间戳生成(以采样率为基准) int64_t audio_pts = samples_count * 1000000 / sample_rate;

由于 AirPlay 接收端会做缓冲和抖动消除,发送端不需要过度补偿延迟,保证时间戳单调递增即可。实际中如果出现音画不同步,通常是音频采集和视频采集参考时钟不一致导致的。

4. 完整实战案例:编译并运行 Doubletake 投屏

接下来我们用一个完整流程,演示如何把 Doubletake 跑起来,并把 Linux 桌面投到 Apple TV 或支持 AirPlay 的电视上。

4.1 获取源代码

首先从代码仓库获取 Doubletake 源码:

git clone https://github.com/DoubletakeApp/doubletake.git cd doubletake git submodule update --init --recursive

如果git clone速度不理想,可以考虑使用镜像源或代理加速。仓库体积不大,一般几秒到几十秒即可完成。

4.2 创建构建目录并编译

推荐使用 CMake + Ninja 进行构建:

mkdir build cd build cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Release ninja -j$(nproc)

如果编译过程中报找不到某个头文件,通常是缺少对应开发包。常见的几个错误和解决思路会在第 5 节统一说明。

编译完成后,可执行文件位于build/doubletake或类似路径:

ls -lh build/doubletake

4.3 检查显示服务器环境

在运行之前,先确认你当前的图形会话类型。运行下面命令:

echo $XDG_SESSION_TYPE

输出通常是x11wayland

  • 如果是x11,Doubletake 可以直接使用 XCB/XShm 采集屏幕。
  • 如果是wayland,需要确认合成器是否支持wlr-screencopy协议,或者系统是否已经运行xdg-desktop-portal

可以从系统日志中检查 portal 服务状态:

systemctl --user status xdg-desktop-portal systemctl --user status xdg-desktop-portal-gnome

如果服务没有启动,Wayland 下的屏幕采集可能失败。

4.4 基本运行方式

假设你的接收端(Apple TV)IP 为192.168.1.100,可以这样启动投屏:

./doubletake --server 192.168.1.100

或者使用设备名称自动发现:

./doubletake --name "Living Room TV"

为了让投屏画面更流畅,可以指定分辨率和帧率。例如,输出 1080p、30fps:

./doubletake --server 192.168.1.100 --resolution 1920x1080 --fps 30

关于命令行参数,不同版本的 Doubletake 可能存在差异,运行./doubletake --help查看当前版本支持的参数列表:

./doubletake --help

4.5 音频输出与回环采集

很多用户投屏时希望电视同时播放电脑的声音。这需要把 Linux 的系统音频也采集并编码到 AirPlay 流中。常见做法是借助 ALSA loopback 或 PipeWire 的虚拟输出设备。

在使用 PipeWire 的系统中,可以安装pavucontrol来管理音频输出设备:

sudo apt install pavucontrol pavucontrol

在“播放”标签页中,找到 Doubletake 的音频输出,并手动重定向到对应的 AirPlay 虚拟设备即可。

如果使用 ALSA loopback 方式,可以通过以下命令加载模块:

sudo modprobe snd-aloop

之后会用到一个hw:Loopback,1,0之类的设备,具体取决于系统加载顺序。

4.6 运行验证

投屏启动后,正常情况下电视上应该出现你的 Linux 桌面画面。如果没有出现,先确认接收端设备与电脑在同一个局域网,并且没有防火墙拦截 7000、7100、5000 等常用端口。

运行过程中可以用ffprobetcpdump查看网络流量,确认是不是已经有 RTP 数据包在持续传输:

# 查看是否有到接收端的 RTP 流量(需要选择正确的网卡) sudo tcpdump -i eth0 -n port 7000 or port 7100

如果能持续看到 UDP 数据包,说明投屏流已经建立;如果完全无流量,问题大概率出在会话协商阶段。

4.7 结果说明

一次成功的投屏流程,在终端上通常会看到类似下面的输出(不同版本可能差异较大,仅作为预期形态参考):

[mDNS] Device discovered: LivingRoomTV (192.168.1.100) [RTSP] ANNOUNCE -> 200 OK [RTSP] SETUP video -> 200 OK [RTSP] SETUP audio -> 200 OK [RTSP] RECORD -> 200 OK [Streaming] Video encoder: libx264 1920x1080 @ 30fps [Streaming] Audio encoder: AAC 44100Hz stereo [Streaming] Sending RTP packets...

从发现设备到正式推流,整个过程通常只有几秒钟。如果在中途出现断流,常见的触发因素是 Wi-Fi 信号不稳定、带宽不足、或者接收端进入了节能模式。

5. 常见问题与排查思路

在使用 Doubletake 的过程中,遇到的报错类型相对集中。我整理了一张排查表,可以帮你按图索骥:

问题现象常见原因解决思路
编译时报找不到libavcodecFFmpeg 开发包未安装或版本过旧安装libavcodec-dev,并确认 FFmpeg 为 4.x 以上版本
编译时报libx264 not foundFFmpeg 缺少 H.264 编码器支持安装libx264-dev,必要时重新编译 FFmpeg
运行时提示Failed to connect to X server当前环境是 Wayland,未走 Wayland 采集路径改用 X11 会话,或检查 wlr-screencopy 协议支持
电视上没画面但进程在跑接收端协商失败,或分辨率/编码参数不受支持抓取日志,尝试降低分辨率和帧率
画面卡顿严重带宽不足或编码码率过高降低 bitrate,使用有线网络或 5GHz Wi-Fi
只有画面没有声音音频输出设备未正确配置或未重定向使用 pavucontrol 将音频输出指向 AirPlay 设备
设备无法被 mDNS 发现防火墙拦截了 5353 端口,或局域网隔离放行 mDNS 流量,确认设备在同一 VLAN
投屏开始后几秒就断开接收端鉴权失败,或配对状态失效重新配对,确认 PIN 码输入正确

5.1 排查思路案例一:X11 下闪退

如果你在 X11 会话下运行 Doubletake,程序立刻闪退,优先检查共享内存是否允许你的用户访问。可以查看系统日志:

dmesg | tail -20 journalctl --user -n 50

常见原因是 XShm 共享内存权限异常,或者屏幕分辨率读取失败。尝试以普通用户身份在桌面终端中运行,避免使用 sudo。

5.2 排查思路案例二:Wayland 下无画面

Wayland 环境下无画面,首先确认合成器是否为 wlroots 系(如 Sway、Hyprland)。GNOME 需要确认 portal 服务在运行:

systemctl --user status xdg-desktop-portal-gnome

另外,Wayland 投屏首次会弹出屏幕共享授权窗口,需要手动点击“选择要共享的屏幕”。如果你运行的环境没有弹出授权窗口,说明 xdg-desktop-portal 异常。

5.3 排查思路案例三:编码器创建失败

启动时如果看到类似Cannot open video encoder的日志,通常意味着 FFmpeg 中没有找到可用的 H.264 编码器。执行以下命令检查编码器支持:

ffmpeg -hide_banner -encoders | grep 264

如果只有h264_v4l2m2mh264_omx而没有libx264,Doubletake 可能无法正常使用。解决方案是安装libx264-dev,然后重新构建 FFmpeg 或重新编译 Doubletake。

6. 最佳实践与工程建议

6.1 优先使用有线网络或 5GHz Wi-Fi

AirPlay 是实时的音视频流传输,对网络抖动非常敏感。2.4GHz Wi-Fi 在家庭环境中干扰较多,容易出现画面卡顿或花屏。建议优先选择有线网络;如果只能用无线,确保设备支持 5GHz,且接收端与发送端距离不要过远。

6.2 合理设置编码参数

在 Wi-Fi 环境下,过高的码率并不会带来视觉提升,反而会引入卡顿。实际工程中可参考以下经验值:

分辨率建议码率建议帧率
1280x7202-3 Mbps30fps
1920x10804-6 Mbps30fps
2560x14408-10 Mbps30fps

对于演示文稿、代码讲解这类静态内容较多的场景,可以适当降低帧率到 24fps,节省带宽并减少发热。

6.3 Wayland 环境建议使用 wlr-screencopy 协议

如果你在设计产品时对帧延迟有较高要求,建议优先选择支持wlr-screencopy协议的合成器。相比通过 xdg-desktop-portal 的 PipeWire 链路的通用方案,专用的 screencopy 协议减少了数据拷贝环节,延迟更低。

6.4 日志与监控

生产环境或长期运行时,务必开启日志并保存到文件:

./doubletake --server 192.168.1.100 --log-file /var/log/doubletake.log

定期检查日志中的丢包、延迟和断流记录,可以帮助提前发现网络质量问题。如果你在开发基于 Doubletake 的投屏产品,建议在日志中额外记录 RTP 包时间戳和编码器参数变化。

6.5 安全与授权规范

  • 所有投屏操作应在合法授权范围内进行,不要对未授权的设备发起配对连接。
  • 涉及商业内容的屏幕共享,注意版权与隐私合规。
  • 生产环境禁止将配对密钥、调试日志直接暴露在公开日志系统中。
  • 如果做二次开发,建议补充设备白名单机制,防止局域网内未授权设备接入。

6.6 代码维护与二次开发建议

如果要在自己的项目中集成 Doubletake:

  • 使用 CMake 的选项控制 X11/Wayland 依赖,避免在一个平台上编译出无法运行的程序。
  • 将编码器参数、码率、帧率做成配置项,而不是硬编码。
  • 对音频设备变化做好监听,设备热插拔时自动重连。
  • 注意异常退出时释放共享内存句柄,避免内存泄漏。

7. 总结与学习路线

到这里,我们已经把 Doubletake 从概念到实战完整走了一遍。你可以回顾一下自己是否已经掌握了几个关键点:

  • AirPlay 发送端与接收端的区别。
  • X11 与 Wayland 在屏幕采集上的根本差异。
  • Doubletake 依赖的编译环境和关键系统库。
  • 从源码编译、运行到设备发现和投屏的完整路径。
  • 常见故障的定位方法和排查思路。

如果接下来想继续深入,可以按下面的路线学习:

学习阶段主题建议实践
第一阶段深入理解 AirPlay 的 RTSP/RTP 流程用 Wireshark 抓包分析完整握手过程
第二阶段学习 FFmpeg 编码与封装 API编写一个简单的屏幕录像 H.264 工具
第三阶段研究 Wayland 合成器协议尝试给 wlroots 合成器增加自定义 screencopy 扩展
第四阶段嵌入式平台移植在树莓派类设备上交叉编译并优化编码性能

最后给你一个实际经验:在 Linux 上做投屏发送工具,最大的坑往往不是编码,而是图形栈的碎片化。X11 环境逻辑简单,但 Wayland 的安全模型和合成器差异会让调试过程变得非常繁琐。建议初学阶段优先在 X11 环境下跑通全流程,再逐步迁移到 Wayland。

如果这篇文章对你有帮助,可以收藏备用。如果你在编译或运行中遇到了文中没有提到的报错,欢迎在评论区把日志贴出来,我们可以一起分析。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 15:21:01

在Windows服务器上部署Netdata监控,从零到看见第一张图要多久

在Windows服务器上部署Netdata监控,从零到看见第一张图要多久 【免费下载链接】netdata The fastest path to AI-powered full stack observability, even for lean teams. 项目地址: https://gitcode.com/GitHub_Trending/ne/netdata 周五下午,一…

作者头像 李华
网站建设 2026/8/29 15:20:43

10万亿参数大模型:被算力与显存关进笼子的工程现实

先说一个结论:10 万亿参数模型的“天花板”不在算法设计,也不在大厂勇气,而在最底层的显存容量、算力密度、通信带宽、能耗成本,以及围绕这些硬件约束展开的分布式系统工程。换句话说,它一定会被算力、显存和成本组成的…

作者头像 李华
网站建设 2026/8/29 15:18:35

猿辅导2023校招技术笔试拆解:算法、SQL与备考策略

年年校招季,技术岗的同学都会经历一波“笔试轰炸”。猿辅导2023校园招聘技术类笔试(一)出来之后,不少学弟学妹来找我聊,说这套题看起来不难,但真上手做,总在细节上翻车。作为一个连续两年参与校…

作者头像 李华
网站建设 2026/8/29 15:17:24

LocalSend 入门指南:3 分钟搞定局域网免网文件传输

LocalSend 入门指南:3 分钟搞定局域网免网文件传输 【免费下载链接】localsend An open-source cross-platform alternative to AirDrop 项目地址: https://gitcode.com/GitHub_Trending/lo/localsend 把一张照片从手机丢到桌上电脑,传统路径是数…

作者头像 李华
网站建设 2026/8/29 15:15:58

IAP15W413AS焊管机切割控制程序

/*********焊管机切割控制程序************/ /***L667 CODE3565 2026 8 29 IAP15W413AS*/ /*********位置 启动 自动 手动***********/ /*********电机 气缸 手动 自动***********/ #include <REG52.H> // cutting 切割#include …

作者头像 李华