Pico 互联 等 跨网段/VPN 云VR串流 组网 广播包转发小帮手

发布于 2024-08-26  648 次阅读


唔,大概用了也一年半了,之前是给VD离线用的,后来互联功能也丰富了,改用互联了,给大家Share一下。

不会操作的可以留言或者群里找窝,比较忙,所以是面向有一定基础的用户写的说明,可能语言组织不一定完善😀有问题我这边会更新。

这个 Python 脚本将由头显客户端发的广播包,转为单播包发给指定的PC地址,从而达到PC发现头显的目的,目前支持

  1. Virtual Desktop
  2. Pico Connect (最新测试通过:10.2.77)

操作的端口列表:

  • 38850:Virtual Desktop用的默认端口,适用于官方在线或离线环境
  • 61375、61735:Pico互联用的默认端口

折腾心得先放前面,免得大家踩坑:

使用脚本的前提是Pico能Ping通PC,且PC能Ping通Pico,中间没有做任何NAT转换/防火墙等等,因为要将Pico的发现包转给PC,由PC向Pico建立TCP连接,要把两边双向路由写通!如果你没有搞定组网,那执行这个木有任何效果!

此外,由于VPN效率不同,目前测试下来串流最佳 远程 体验是使用 搭配 内核模块 版本的 Wireguard 使用。用户态的 Wireguard 虽然测速可能没有差很多,但是对突发和VR的体验影响很大,尤其是网不好的时候,各种阻塞。如果觉得卡,先用iperf(https://apkpure.com/cn/magic-iperf-including-iperf3/com.nextdoordeveloper.miperf.miperf)测tcp -w小窗口包,自己码率和帧率折算一下,网络跟不跟得上。

硬件这边测试了如下方案:😀

和 Pico4 Pro(非Ultra)搭配无线路由是 IPQ6000 等,有4核心,Wireguard能跑到1Gbps,很快很高效,无瓶颈。代表路由包括 GL.iNet AXT1800、京东云AX1800Pro等,刷大雕的QWRT。

5G CPE 这边测试了 鲲鹏NRadio 的 C8-660(主要是他目前也没出更好的处理器。。),基于MT7981+移远 RM520N-CN 模块(高通X62基带,支持N78、N79等,峰值能跑1.2Gbps),原生支持OP,选择这款CPE主要原因是他模块和硬AP之间是通过2.5G Phy连接的,这个独此一家。也就是模块转接了Realtek的PCIE 2.5G网卡,然后直接对接到MT7981拉出的2.5G口,流量全程走硬加速,不需要USB或者PCIE的拨号驱动,没有任何额外那种驱动咖喱开销。设备现在还配了每个月5000G的流量卡,更适合没有双不限卡的大流量用户串流尝鲜用了😀(由于OpenWRT路由存储比较小,不适合装Python,这边我已经改了个Golang的版本,但是得再搓一下)设备温度较高,建议向官方客服申请风扇。

另外比较方便的就是 ROOT 了,且支持 Wireguard 内核模块 的手机,可以在5G网络等下做串流,手机只要上了内核模块的Wireguard,效率还是很高的。目前使用的两个搭配是 红米K40Pro+(x55,利旧热点机,刷ANGi内核才有Wireguard模块,Scene4做CPU功耗优化不然会很高温,热到电池鼓包),还有 GT Neo5(x62,反正测下来没有说更好,ping一万个包,大概平均少1ms左右),只要5G信号好,给头显提供串流还是很丝滑稳定的。

2024-08-27 01:23:考虑到不是大家都有高上传的家庭宽带,我也试了一下走5G+5G,也就是PC通过5G网络做隧道接入,客户端也通过5G组网。这个方案延迟大概网络延迟49ms(指串流时性能统计里的显示)。这个我只拿电信N78测过,卡是上海电信,AMBR 4000Mbps/4000Mbps,实际上行跑280~320Mbps左右。PC端CPE锁定633984,头显端CPE锁定627264,两个使用不同的TDD频段,应该上下行比率2:8左右,隧道内测速能到200Mbps+。这个方案移动的可能不太好使用,因为移动N41上行不够,而且套餐速率也给的比较抠门,现在5G-A包送的臻享速率只给3000Mbps下/200Mbps上,而且绝大部分情况下上传都很难跑到100Mbps,N79的基站较少。

未来是准备测试一下 MT7988,WiFi 7 BE19000搭配新的Pico设备,但是目前开源对WiFi7的支持还不到位,MTK主线还没有提供MLO的SDK支持,引用裙友说法,目前WiFi7属于付费公测阶段,综上。

跨公网的串流,由于可能会遇到运营商,跨省,QoS,等等,可以自行测试一下不同端口(包括53),等等,IPv4 和 IPv6 走的路由、延迟、甚至限速(听说有的地方IPv6不限速!也有些地方IPv6绕一大圈)也可能完全不同,对组网的影响,找到适合自己的方式。

另外就是Windows现在支持BBR了!建议试试开启测试一下区别!有的网络有奇效(本地网络多半没有什么变化,公网会有效果),也有的网络是会阻塞。就是串流之后别忘记该回去,有些应用比如RDP对BBR支持有BUG,会出问题。

2024-08-27 01:12:另外再提一下,不能NAT,不能NAT,不能NAT。如果是用Android开热点的,推荐下一个 VPN热点https://play.google.com/store/apps/details?id=be.mygod.vpnhotspot) APP,并不是用他做NAT,而且他也不支持给Wireguard内核做支持*不影响我们使用,而是他可以设置手机热点的频段、频宽,可以设置启用WiFi 6热点(如果你的手机开出来是WiFi 5的话),并且可以设置ACS频段范围,比如32-64,等等,也可以确保自己开出的是至少80M频宽(而不是20、40),能够协商到1200Mbps的热点。

2024-08-27 01:34:补充,由于PICO使用TCP的,请注意设置TCP MSS钳制,clamp。在你所有路过的设备执行以下命令(反正无害),会根据接口的MTU。自动将TCP MSS计算降压好。

iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

另外关于Wireguard的MTU,如果你遇到问题,不会计算(计算的时候别忘记WG自己还有PPPoE等等的开销),也可以先设置小一点到1280,我这边配置是1330(由于之前电信CN2精品网有一些降低1442什么的,还有现在联通有时候会掉一下什么的,所以改小),两端都要设置!

下载(2024-08-26 23:57:00):

https://www.tutugreen.com/upload/2024/2024-08-26/pico-connect-helper/2024-08-26-23-57-00/pico-headset-forward-helper.py

使用方法:

用VSCode打开脚本,将头部的变量,根据提示修改一下目标地址*(也就是PC的IP地址,不是公网,是内网地址),修改一下上行接口(也就是发包的接口,通俗点你往那个接口连接PC就填那个,如果是Windows填中文的也可以。

Android:

使用Android从Github(https://github.com/termux/termux-app/releases)安装Termux终端(不要用Play市场的远古版本),

打开终端,执行

apt update
pkg install python-pip
pkg install vim
pkg install nano
pip install scapy

然后!重要!使用这个命令切换到root权限:

tsu

然后使用vi(中文不乱码)、或者nano文本(我这中文乱码)编辑,或者用外部文件管理器将脚本编辑好放进去。

然后检查一下,是否有到PC目标IP的路由:

ip route

因为环境各有差异,尤其VPN可能会有多个路由表,如果默认路由表没有到PC的路由,需要你手动添加一下,例如使用:

ip route add 192.168.2.0/16 via 192.168.5.1

(假设你的PC网段在 192.168.2.0/24,且你 Wireguard 的 VPN对端 是192.168.5.1)

(如果你手机是直接和PC做Wireguard直连的,没有走中间路由,那应该不用管)

然后用执行脚本:

python pico-headset-forward-helper.py

观察有没有什么报错,如果一切正常,PICO头显打开串流客户端,手机会打印收到的广播发现包,并做单播转发到你指定的PC地址。

Windows(不是说串流主机,是指和头显在一个内网,来辅助转发头显发现包的):

先安装一个 nmap 或者 Wireshark,这俩都会帮你装上兼容的 Npcap 或 WinPcap(用于构造原始数据包)

推荐懒得研究怎么配置Python环境的用户,直接安装Anaconda 3。(也许下次我打包成EXE给大家。。算了还是做成Go把)

从开始菜单找到 Anaconda Prompt(建议是右键,管理员身份运行),打开cmd环境。

pip install scapy

然后 cd 到脚本所在目录,执行

python pico-headset-forward-helper.py

如果你装 Npcap 的时候选了限制管理员身份,那么应该会弹出管理员UAC,记得确认。

以下是其他细节(之前写脚本注释里了,后来觉得不方便更新,所以又贴过来了):

推荐是在网关使用(例如,带VPN三层组网写好路由表非NAT的手机热点,或者软路由等)

如果在普通网络下使用,由于设备会伪装成头显的IP和MAC发包,根据不同模式,路由老化抢占规则等等可能分为:

不伪装MAC:可能导致路由网关的三层ARP表瞬变,原先路由ARP表,头显的IP是和头显的IP绑定的,但你用其他MAC发了头显的IP报文,可能瞬变。

Ether伪装MAC:可能会导致二层MAC表瞬变,也就是交换原先认为头显MAC接口在1口,但你从2口以头显MAC发包,MAC表将瞬时更新成2口,交换将原先发给头显MAC的数据发给你了,造成瞬间回复丢包。

但由于头显一直会有持续的流量,所以一般不用太担心,

注意有一些企业级AP做了 ARP-IP-MAC-端口 绑定,可能会阻止其他设备伪装MAC/IP,这个需要自己调整下哈。

如果走VPN,上行接口这里填VPN接口名,例如 wg0、tun0、tap0 等等

如果是纯跨网段,或者VPN由上层路由处理(尤其注意不能NAT!!!!),这边填物理网卡名称,

例如 "以太网 7" (Windows可以填中文,当然最好改名一下英文)、"wlan1"、"eth0"、"enp0s3"、"br-wan" 等等

Windows的物理网卡名称可以在网络适配器设置里查看,Linux、Android 可以用 ifconfig -a 或者 ip a 查看

Android,尤其使用termux的用户要注意了,终端环境可能没有 ip route 可见的路由,需要使用在执行本python前,只要ip route add 192.168.9.0/24 dev wg0 等等,向网卡添加一个路由。

VPN 推荐使用 Wireguard 内核模式,支持ARM NEON指令加速,效率高适合VR串流,不推荐使用用户态VPN,卡卡的)

由于脚本本身自用,写的比较挫,装什么termux、pip、又很麻烦又占空间,这边已经在拿Golang重写了,很通用轻量。


眼里有远方,心中有阳光,脚下有力量