Windows远程桌面实现之十四:实现AirPlay接收端,让苹果设备(iOS,iPad等)屏幕镜像到PC端

by fanxiushu 2024-05-04 转载或引用请注明原始作者。

这个课题已经持续了好几年,已经可以说是很长时间了。
实现的程序是 xdisp_virt, 可以去github下载使用:
GitHub - fanxiushu/xdisp_virt: xfsredir file system

一开始是基于测试镜像驱动的目的随便开发的xdisp_virt,到后来只想实现windows远程桌面,
而且是打算自己实现客户端,结果是浏览器的Web客户端代替了自己实现客户端的打算,
再后来移植到各种平台(macOS,linux,iOS),以及各种功能出现,比如直播,推流保存,onvif等等。
反正是整个 xdisp_virt 代码重构了好几遍,越搞越复杂。
实现的功能也与最初只想实现远程控制的目标越来越远。
赤果果的朝着前方的康庄大道奔跑,只是道路越奔越歪了。

这次是在xdisp_virt中实现AirPlay接收端,
之所以有这个打算,起源于上面三篇文章所说的开发模拟鼠标键盘的蓝牙驱动。
开发把电脑模拟成蓝牙鼠标键盘的蓝牙驱动,目的就是为了控制我的iPhone手机,
在开发蓝牙驱动和测试过程中,我需要把iphone手机屏幕投射到电脑上,
然而Windows与Apple天然的隔绝,
windows的AirPlay投屏软件太稀缺了,难找难用;
于是在开发完成bluetooth驱动之后,打算在xdisp_virt集成 AirPlay功能,
并且把模拟蓝牙鼠标键盘的驱动也一起集成进去,真正达到控制各种苹果设备的目的。

首先,我们先大致了解一下什么是 AirPlay。
AirPlay说普通点就是一群通讯协议,把视频和音频在网络中传输的协议。
我们有大量的比如RTSP,RTMP,HTTP, WebRTC,等等公用协议可以用来传输音视频,为何还需要AirPlay。
没办法,这是苹果公司为自家产品(iOS,iPad,macOS)定制的专门的协议。
当然它其实是个协议族,是多个协议混合一起组成了AirPlay, 这点和WebRTC很有像,都是多个协议拼凑在一起的。
AirPlay用来干嘛?
既然是传输音视频的协议,可以在苹果设备上播放的视频镜像出去,或者只把音频镜像出去。
其中一个很重要的用处就是用来把苹果设备的屏幕镜像到网络中的其他地方去。
这就很像我们开发的远程桌面了,只不过不同的是,
AirPlay是苹果系统集成的,苹果设备不需要额外安装程序,
当然没法鼠标键盘控制,也只能在同一个局域网内镜像。而且必须是苹果设备主动连接AirPlay接收端。

与AirPlay同类型的协议比如 Miracast,它可以应用于windows和Android 。
不同的是AirPlay是封闭的,而 Miracast协议是开放的。

不少人经过这么多年对AirPlay协议的努力破解,绝大部分的AirPlay通讯协议细节都已经揭露出来,
而且还有对于的AirPlay实现的开源实现代码,
其中基于linux平台开发的UxPlay的开源代码比较好, xdisp_virt的AirPlay使用了此源码。

实现AirPlay,其实主要说的是实现AirPlay的接收端,
因为发送端已经被苹果公司集成到他们自己的系统中了,包括iOS,macOS等系统。
比如当我们打开iPhone手机的控制中心(右上角向下滑),然后点 ”屏幕镜像“ 的图标,
如下图所示,会看的一堆的AirPlay接收端:



上图就是多台电脑上的xdisp_virt展现出来的AirPlay接收端,
iPhone手机中没有安装任何第三方App,但是却能找到一堆的AirPlay接收端信息,
这看起来很神秘,其实搞清楚了来龙去脉,也没啥神秘的,
在AirPlay接收端的实现中,利用mDNS协议来把自己的信息发布出去,
同样到了iPhone手机端,因为是iOS系统自己集成了AirPlay,
它同样使用mDNS协议查询这些信息,从而查询到了这些AirPlay接收端。
具体其实就是大家都注册到一个组播地址中,组播地址固定为224.0.0.251,固定的端口是 5353,一般使用UDP 协议;
而DNS的端口是53,mDNS端口是5353,这不是巧合,实际上,mDNS协议的格式基本与DNS一样,
所以如果理解了DNS协议,对mDNS的理解就不会差太多,只不过mDNS一般用于局域网的信息发布,发现搜索等。
举个简单例子,A设备进入局域网,加入 mDNS 服务,并向mDNS服务注册一些自己的信息:我是谁,我在干嘛。
B设备同样进入了局域网,也加入了mDNS服务,并且向mDNS服务请求查询在线所有满足一定条件的设备,
于是mDNS服务开始在局域网内查询,最终把查询到的结果告诉B设备。

题外话:组播这玩意不一定都十分靠谱,在理想的局域网环境到没啥问题,
在有些复杂的网络环境就比较难说了,有可能会偶尔出现一些问题。
比如我这网络环境,多个交换机组合,
多个vmware虚拟出来的IP地址,以及VPN软件模拟出来的IP地址,
以及三个多网段组合在一起,至少两个无线路由器凑合在一起。。。
如果突然出现iOS设备搜索不到AirPlay接收端也算正常,
多试几次,把AirPlay功能打开关闭多试几次,
或者把AirPlay的侦听地址固定到某个IP地址,反正我是多次尝试了之后才发现这些。

对于airplay接收端来说,需要向mDNS注册两类服务,
一类airtunes,标记为 _raop._tcp 用于协商音频和视频的传输,
一类airplay,标记为 _airplay._tcp 用于处理传统的流服务。
至于这两类服务的的具体协议格式,可以通过抓包软件来分析。

当iOS,macOS等系统发现了AirPlay接收端,并且主动连上
(比如上图中,iOS手机连上了名为 “xdisp_virt [ mini-PC ]” 的AirPlay接收端)
它使用TCP连接到Airplay接收端,并且使用RTSP协议进行交互,
但是这个RTSP协议,经过苹果公司多次的升级修改,虽然表面上还是RTSP协议格式,
但是实际内容却是改变了很多,因此并不符合RTSP协议标准规范。
但他的协议格式还是尽量保持着RTSP的协议格式,这对于破解分析AirPlay的协议带来了十分的便利。
传输音频采用的基于UDP的RTP协议,编码方式是 AAC-ELD或ALAC,
而传输视频的则是基于TCP,并且固定H264编码。

本文并不打算研究这些协议格式,
因为网上文章有阐述,如果还不明白,
可以使用网络抓包软件分析它的协议格式,或者可以进一步去阅读源码,
比如其中UxPlay的开源代码,等等。

前面说了,xdisp_virt程序集成了UxPlay开源代码,但是还缺少mDNS的实现,
因此xdisp_virt同时也集成了 苹果的 mDNSResponder 开源代码。
当然也有其他mDNS开源可选,比如linux下的avahi 。

这俩货都不是省油的灯,因为我要把他们编译进xdisp_virt程序中,需要做成静态lib库(或者a库)
而 mDNSResponder 项目给出的目录结构确实头大,里边有生成多个项目,
而我却只需要里边的dnssd接口和mDNS服务端,
于是干脆直接另起一个项目工程,把需要的源文件直接加进去,重新生成一个新的静态lib工程,
这是在windows的VS下的做法,到了linux平台,则是自己重新制作Makefile文件,
这个Makefile看起来像下面这样:
## by fanxiushu 2024-04-18

vpath %.c ./mDNSCore
vpath %.h ./mDNSCore
vpath %.c ./mDNSShared
vpath %.h ./mDNSShared
vpath %.c ./mDNSPosix
vpath %.h ./mDNSPosix
vpath %.c ./mDNSMacOSX
vpath %.h ./mDNSMacOSX

C=gcc
CC=g++

LIB_AR = ar cr

objs = \
    DebugServices.o dnssd_clientlib.o dnssd_clientstub.o \
    dnssd_ipc.o GenLinkedList.o \
    ClientRequests.o DNSCommon.o DNSDigest.o dnssd_ipc.o LegacyNATTraversal.o \
    mDNS.o mDNSDebug.o uDNS.o uds_daemon.o mDNSPosix.o PosixDaemon.o PlatformCommon.o mDNSUNP.o

CF = -std=c99 -I./mDNSCore -I./mDNSShared -I./mDNSShared/utilities -I./ -D_GNU_SOURCE \
    -DMDNS_DEBUGMSGS=0 -DNOT_HAVE_SA_LEN -DPEDANTIC -DUSES_NETLINK -DHAVE_LINUX -DTARGET_OS_LINUX \
    -DUSE_TCP_LOOPBACK -DNO_PID_FILE

LF =

############################################
###################################

dnssd:$(objs)
    $(LIB_AR) libdnssd.a  $(objs) $(LF)

%.o:%.c
    $(C)   $(CF) -c $< -o $@

clean:
    -rm *.o
    -rm libdnssd.a

当然还需要修改一些代码,同时增加几个导出函数,主要是mDNS服务端的导出函数。
经过一通折腾之后, mDNSResponder才能以静态库的方式编译进xdisp_virt程序中。

再接下来就是集成UxPlay的问题。
UxPlay 最终编译之后其实是一个程序,显然不能直接用。
UxPlay工程目录的render渲染图像部分,gstreamer解码部分都用不上,
只需要使用UxPlay工程里边的lib目录。
同时另外还需要 libplist 工程,
与mDNSResponder的做法类似,只需要他们的c,cpp等源文件,自己制作工程项目或者Makefile编译成静态库。
同时对UxPlay的代码改的也较多,主要是为了适合xdisp_virt以及兼容Windows,不过本质还是使用的UxPlay开源代码。

做好了AirPlay屏幕镜像,但是却无法使用鼠标键盘控制,感觉是很不爽的。
因此得把蓝牙驱动集成进去,通过蓝牙来控制苹果设备。
这是没办法的选择,因为目前来看,
iOS,iPad这些设备的系统(macOS除外)压根就找不到接口API来进行鼠标键盘的远程控制。
这也是前面三篇文章阐述的内容:把电脑模拟成蓝牙鼠标和蓝牙键盘。

xdisp_virt本身就支持鼠标键盘控制的,只需要把Web端传递来的鼠标键盘信息,
传递给蓝牙驱动,从而让他控制苹果设备。
同时xdisp_virt本身就是跨越局域网限制的,
只要保持苹果设备和xdisp_virt在同一个局域网,
然后运行xdisp_virt的电脑具有公网地址,或者xdisp_virt连接到具有公网地址的xdisp_server,
都可以把苹果设备的屏幕传输到任何地方。

其中macOS平台因为目前并不熟悉蓝牙的开发,所以没有实现电脑模拟蓝牙鼠标键盘的功能。

windows平台则是需要单独安装驱动,
而且正如以前文章阐述的,这个驱动需要做破解,这会造成一些未知的麻烦,
尤其有些windows系统版本可能直接蓝屏死机,虽然我目前测试64位的 win10, 11,win7都运行良好。
但无法百分之百的保证一定不出问题,
因此这次发布新版本的xdisp_virt的时候,并不会公布windows下的蓝牙驱动。

linux下的蓝牙鼠标键盘,则是直接集成到了xdisp_virt程序中,
但是需要自己去配置蓝牙服务,具体需要满足以下一些条件:
1,当然需要有蓝牙设备这个实物。
2,需要安装blueZ,linux系统默认都会安装的。
3,需要xdisp_virt以 root 超级用户方式运行。
4,bluetoothd 以带参数方式运行: bluetoothd -C -P input

下面是xdisp_virt的AirPlay的演示视频,有兴趣可以去github下载新版本自己尝试:
更多的关于xdisp_virt使用和演示,请去github查阅。

演示xdisp_virt的AirPlay功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/832245.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue前端环境准备

vue-cli Vue-cli是Vue官方提供的脚手架&#xff0c;用于快速生成一个Vue项目模板 提供功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs&#xff08;已经安装就不用了&#xff09; node-…

linux文本三剑客之grep

目录 1、三剑客特点和应用场景 2、三件客之grep 1) -v 参数使用示例&#xff1a; 1、三剑客特点和应用场景 命令特点场景grep过滤grep命令过滤速度最快sed替换&#xff0c;修改文件内容&#xff0c;取行 如果要进替换/修改文件内容 取出某个范围的内容&#xff08;从中午12.到…

【stomp 实战】spring websocket用户消息发送源码分析

这一节&#xff0c;我们学习用户消息是如何发送的。 消息的分类 spring websocket将消息分为两种&#xff0c;一种是给指定的用户发送&#xff08;用户消息&#xff09;&#xff0c;一种是广播消息&#xff0c;即给所有用户发送消息。那怎么区分这两种消息呢?那就是用前缀了…

我们说的数据分析,到底要分析些什么?

作者 Gam 本文为CDA志愿者投稿作品 “我们说数据分析&#xff0c;到底要分析些什么&#xff1f;” 数据分析这个话题自从进入人们的视线以来&#xff0c;这个话题就成为人们茶余饭后的谈资&#xff0c;但是一千个人眼中就有一千个哈姆雷特&#xff0c;就意味着每个人对数据分…

使用Photoshop压缩图片大小的4种方法

使用Photoshop压缩图片大小&#xff0c;一般可采用下面4种方法&#xff1a; 1.调整图片分辨率&#xff1a; 打开需要压缩的图片文件。 依次点击菜单栏中的“图像”>“图像大小”。 在弹出的对话框中&#xff0c;通过调整分辨率参数来减小文件大小。 2.降低图片品质&#…

什么是水经微图注册码?

水经微图&#xff08;以下简称“微图”&#xff09;注册码&#xff0c;是微图的一种授权方式。 什么是微图注册码&#xff1f; 注册码仅可授权一台电脑&#xff0c;绑定CPU和网卡&#xff0c;激活后不可更换电脑使用。 如果CPU或网卡被更换&#xff0c;以及电脑损坏无法开机…

数据库中索引的底层原理和SQL优化

文章目录 关于索引B 树的特点MySQL 为什么使用 B 树&#xff1f; 索引分类聚簇索引 和 非聚簇索引覆盖索引索引的最左匹配原则索引与NULL索引的代价大表结构修改 SQL优化EXPLAIN命令选择索引列其它细节 关于索引 索引是一种用来加快查找效率的数据结构&#xff0c;可以简单粗暴…

卸载、安装、配置快捷mysql

卸载mysql 1、筛选过滤出mysql相关组件 rpm -qa | grep mysql2、关闭MySQL服务 systemctl stop mysql.service 3、卸载对应组件命令如下&#xff1a; rpm -ev --nodeps [显示的组件名称] 4、查找MySQL对应的所有文件夹 find / -name mysql rm -rf [显示的文件夹路径] 检查…

基于若依框架搭建网站的开发日志(一):若依框架搭建、启动、部署

RuoYi&#xff08;基于SpringBoot开发的轻量级Java快速开发框架&#xff09; 链接&#xff1a;开源地址 若依是一款开源的基于VueSpringCloud的微服务后台管理系统&#xff08;也有SpringBoot版本&#xff09;&#xff0c;集成了用户管理、权限管理、定时任务、前端表单生成等…

linux的基础入门(2)

环境变量 在Shell中&#xff0c;正确的赋值语法是没有空格的&#xff0c;即变量名数值。所以&#xff0c;正确的方式是&#xff1a; tmpshy 这样就将变量tmp赋值为"shy"了。 注意&#xff1a;并不是任何形式的变量名都是可用的&#xff0c;变量名只能是英文字母、…

【neteq】tgcall的调用、neteq的创建及接收侧ReceiveStatisticsImpl统计

G:\CDN\P2P-DEV\Libraries\tg_owt\src\call\call.cc基本是按照原生webrtc的来的:G:\CDN\P2P-DEV\tdesktop-offical\Telegram\ThirdParty\tgcalls\tgcalls\group\GroupInstanceCustomImpl.cpptg对neteq的使用 worker 线程创建call Call的config需要neteqfactory Call::CreateAu…

Java中使用RediSearch进行高效数据检索

RediSearch是一款构建在Redis上的搜索引擎&#xff0c;它为Redis数据库提供了全文搜索、排序、过滤和聚合等高级查询功能。通过RediSearch&#xff0c;开发者能够在Redis中实现复杂的数据搜索需求&#xff0c;而无需依赖外部搜索引擎。本文将介绍如何在Java应用中集成并使用Red…

300V直流充电桩测试有哪些实验项目

300V直流充电桩测试的实验项目主要包括以下几个方面&#xff1a; 1. 电气性能测试&#xff1a; - 输入电压范围测试&#xff1a;检查充电桩在不同输入电压下的正常工作情况。 - 输出电压范围测试&#xff1a;检查充电桩在不同输出电压下的正常工作情况。 - 输出电流范围测试…

MySQL#MySql数据库的操作

目录 一、创建数据库 二、字符集和校验规则 1.查看系统默认字符集以及校验规则 2.查看数据库支持的字符集 3.查看数据库支持的字符集校验规则 4.校验规则对数据库的影响 1.以UTF-8格式创建数据库 2.不区分大小写 3.区分大小写 4 大小写对数据库的影响 三、操纵数据…

流程:采集1688店铺内有成交的商品列表||1688商品订单列表+订单详情API接口

此API目前支持以下基本接口&#xff1a; item_get 获得1688商品详情item_search 按关键字搜索商品item_search_img 按图搜索1688商品&#xff08;拍立淘&#xff09;item_search_suggest 获得搜索词推荐item_fee 获得商品快递费用seller_info 获得店铺详情item_search_shop 获得…

沃伦·巴菲特将AI比做原子弹:“瓶中精灵”使诈骗成为最快增长产业|TodayAI

在伯克希尔哈撒韦公司的年度股东大会上&#xff0c;投资大师沃伦巴菲特对人工智能的未来提出了严重警告。巴菲特对这项可以模拟现实并产生误导性内容的技术表示担忧&#xff0c;他认为这将成为史上增长最快的行业之一。 巴菲特在会上说&#xff1a;“当你思考诈骗人们的潜力时…

NCBI GEO王炸:GEO2R直接分析RNA-seq数据,几家欢喜几家愁?

GEO2R是NCBI GEO团队针对上传到GEO的芯片数据开发的一款在线差异分析、可视化作图工具&#xff0c;是广大数据分析人员的福音。然而&#xff0c;一直以来GEO2R仅针对芯片数据&#xff0c;对于越来越多的测序数据&#xff0c;只能下载所上传的matrix矩阵&#xff0c;进行分析&am…

ENZO:Insulin(胰岛素)ELISA kit

胰岛素是一种由胰岛β细胞合成分泌的肽类激素。它促进葡萄糖从血液中吸收到组织中&#xff0c;并以糖原和脂肪的形式储存起来&#xff1b;此外胰岛素还抑制肝脏产生葡萄糖。通过控制葡萄糖水平&#xff0c;胰岛素成为脂肪和碳水化合物代谢的调节器。当由于缺乏胰岛素分泌而失去…

成都最大视听产业园更新数字影像创作空间,影像技术打造沉浸式体验

国际数字影像产业园&#xff0c;位于成都金牛区的心脏地带&#xff0c;借助数字影视制作技术的力量&#xff0c;努力“破墙而出”&#xff0c;耕耘数字影像技术研发和创新创作的热土。 随着科技的飞速发展&#xff0c;数字影像已经成为成都文创产业的重要组成部分。为了满足国际…