古生代科技——USB 2.0 手机用 WiFi 6-7 直连电脑的高速文件传输

A@NAZOrip
A@NAZOrip 6月21日
  • 在其它设备中阅读本文章

手机行业已经成熟,然而即使是 2024 年最新的手机产品,也充满了 USB 2.0 的陷阱。不慎被先进的屏幕、处理器、大内存、大电池忽悠,下单后发现出了大问题。但是,本文所提供的简单方案将会带来一些转机。因此,这套方案的要求是尽可能简单,不需要预装运行环境,同时操作逻辑无限接近插数据线文件传输(MTP)。

教程难度:中高

  • 需要亿点 CMD 和 PowerShell 使用经验

注:本教程处于发布初期,如果有问题则请留言

传输速度预期

广告说,WiFi 6 802.11ax 6Ghz 的传输速度是 10 Gbps / 1250 MBps。但实际情况是 5GHz 频率的信号宽度下,WiFi 6 的基准速度只有 1.2 Gbps / 1200 Mbps / 150MBps。PCHardware 测试了多款路由器后得到的情况是 5 Ghz 下最多只有 839 Mbps / 104.9 MBps。可以断定,这个速度数据虽远低于广告宣传,且远低于 USB 3.0 受 MTP 拖累后所剩的 250 MBps,但也远比 USB 2.0 的 42 MBps 要快。

  • 图:对比多款 WiFi 6 路由器的速度,来源:PCHardware
    • PCHardware_WiFi6.png
  • 因此,的传输预期是 100 MBps / 800 Mbps 左右,最大 150 MBps / 1200 Mbps。同时也反映了没有 USB 3.0 的手机具体残废到了何种程度。

使用场景

  • α:下载视频与字幕到电脑,在电脑上批量修改字幕的文件名(和对应的视频集数一致)后,一并传输到手机上观看。产生每月从电脑传输几次 16~90 GB 文件到手机的高顺序读写需求
  • β:将整部手机的内容导出到电脑,或从电脑导入到手机以备份,代表 100~400 GB 的高顺序读写,高随机读写需求
  • γ:将手机作为录制采集设备,将录像,摄影,动补和其它数据采集完后传输到电脑

——所以前提是

  • 电脑使用固态硬盘
  • 至少支持传输 UTF-8 文件名
  • 必须支持一次传输超过一个文件
  • 手机最低需要 UFS 3.0 存储颗粒
  • 传输协议需要高稳定性,至少要比 MTP 稳定
  • 电脑至少应该支持 WiFi 6,最好支持 WiFi 6E 或更高
  • 传输过程需要保证手机端的散热,以保证传输的速度和稳定性

步骤

为了减少长篇大论,本文的分析部分会后置,教程部分提前。

配置 WiFi 6-7 的步骤概览

  1. 检查手机最高支持的 WiFi 规格
  2. 检查电脑主板最高支持的 WiFi 规格,并确保无线网卡的驱动已经更新到最新
  3. 手机安装 Servers Ultimate 并简单配置一个 FTP 服务器
  4. 手机端设置热点到支持的最高规格
  5. 手机关闭 WiFi 和移动数据,并创建 WiFi 6 / 802.11ax 热点
  6. 电脑连接手机的热点
  7. Windows 端将脚本保存为批处理并运行

注:Windows 端的防火墙不用额外设置,其 允许的应用FTP 服务器 的栏目是将 Windows 作为 FTP 服务器的用途,不是连接 FTP 服务器
注:Windows 端不建立 FTP 服务器是因为操作过程会变成手机进入电脑找文件下载,而不是电脑上传到手机的特定文件夹,与 MTP 传输文件的操作逻辑不符

检查手机与电脑最高支持的 WiFi 规格

浏览器中搜索自己拥有手机的型号,然后在 技术规格 Technical Specification / Specs 页面查找:“802.11”或“WiFi”;如果有“ax”,WiFi 6 等字样就代表手机支持。

  • 如果标注了“160 MHz”,则代表支持速度更快的 WiFi 6E
  • 如果有“be”,WiFi 7 字样则代表支持速度快于 WiFi 6E 的 WiFi 7
  • 图:一加 Ace 3 的 WiFi 规格
    • check-WiFi-Specs-at-manufacturer.png
  • 图:一加 8 的 WiFi 规格
    • check-WiFi-Specs-at-manufacturer-2.png
  • 图:小米 12 的 WiFi 规格
    • check-WiFi-Specs-at-manufacturer-2.png
    • 注:这里小米官网把 Ghz 写错成 G 了,是比较常见的过度缩写

其它支持 WiFi 6 的手机列表:

目前较新的英特尔平台独占了 BE200NGW,Killer BE1750x 等 WiFi 7 网卡。而 AMD 最新的 x670/b650 平台没有任何支持 WiFi 7 的方案。无线网卡的最新驱动可以在主板或笔记本厂商官网上查找和下载。

手机端配置 WiFi 热点

  1. 设置一个熟悉的热点名称
  2. 关闭移动数据网络共享(必选),蓝牙网络共享(必选),USB 网络共享(必选),和 WiFi 网络共享(可选)
  3. 设置信号频段为 5.0 Ghz,或手机和电脑同时支持的最高频段
    • 此处的使用场景是手机可以直接放在电脑的 WLAN 天线上,所以只要电脑支持,就可以设置为 6 Ghz,尽管支持的手机和电脑可能很少
  4. 设置为使用 WiFi 6 标准热点,或手机和电脑同时支持的最高标准

图:一加 8 的 WiFi 热点设置。
Android-Hotspot-conf.png

注:经调查,结论是只要手机支持 WiFi 6,安卓系统就会开放指定 WiFi 6 热点的选项,若不支持则更可能是手机厂商的限制
注:Windows 系统目前最高支持创建 WiFi 5 / 802.11ac 热点

手机端配置 FTP 服务器

FTP 服务器中,安卓手机的选择是 Servers UltimateServers Ultimate Pro。它搭载的 FTP 服务器不是一般的 FTP 服务器——而(很可能)是全安卓唯一支持传输 UTF-8 文件名的 FTP 服务器。配置过程很简单:

servers-ultimate-ftp-client.png

  1. 打开 Servers Ultimate,进入 Servers 菜单
  2. 点击右上角的 +
  3. 在打开的界面下滑并点击 FTP Server
  4. 点击新添加的服务器以进入配置菜单
  5. 设置端口号 Port 为 9999,或为了与别的服务器区分而起个名字
    • 右划进入 Specific 菜单,可以看到 Encoding 栏目设置为 Automatic

      • 如果需要配置专门的用户账户登录,则右划到 Users 栏目配置
      • 其中 Passive ports range 代表被动端口,也就是客户端不直接连接刚才设置的主动端口号的补救措施,无需设置
  6. 点击右上角的保存完成配置,并回到主菜单,点击 Exit(⏻)以退出 Servers Ultimate

Servers-ultimate-ftp-config.png

Windows 配置 WiFi 文件共享权限

由于 Windows 会将 IP 地址不同的热点视为新的公用网络,而公用网络不可以传输文件或打印,所以每次连接都要设定连接种类为专用网络。解决方法是将以下 PowerShell 脚本储存为任意后缀为 .ps1 的文件,建议命名为 Windows-NetworkProfileToPrivate.ps1,并与下面的批处理置于同一文件夹目录下,否则记得在下面的批处理中更改打开这个 PowerShell 脚本的文件名和路径

# 获取管理员权限 1
function Test-Admin {
    $currentUser = New-Object Security.Principal.WindowsPrincipal $([Security.Principal.WindowsIdentity]::GetCurrent())
    $currentUser.IsInRole([Security.Principal.WindowsBuiltinRole]::Administrator)
}
#获取管理员权限2
if ((Test-Admin) -eq $false)  {
    # Get the script's directory
    $scriptPath = $MyInvocation.MyCommand.Path
    $scriptDirectory = Split-Path $scriptPath -Parent

    # 在脚本位置打开具有管理员权限的 PowerShell
    # Start the elevated process in the script's directory
    Start-Process powershell.exe -Verb RunAs -ArgumentList ("-noprofile -noexit -file `"{0}`" -elevated" -f $scriptPath) -WorkingDirectory $scriptDirectory
}
echo $SelectedSSID
# 检查是否有符合条件的连接
# Check if there is valid connections
if ((Get-NetConnectionProfile -InterfaceAlias WLAN -IPv4Connectivity LocalNetwork -NetworkCategory Public -ErrorAction SilentlyContinue) -eq $null) {
    Write-Warning "× 没有可供更改的网络连接,或之前已经修改公用连接为专用,按 Enter 退出"; pause; exit
}

# 获取批处理导出的 WLAN SSID
$ssidFile = Join-Path (Get-Location) "temp_wlan_ssid.txt"
$SelectedSSID = Get-Content $ssidFile

# 根据 $SelectedSSID 参数获取待修改的网络
# Get the network to modify connection, specified by parameter $SelectedSSID
$network = Get-NetConnectionProfile -InterfaceAlias WLAN -IPv4Connectivity LocalNetwork -NetworkCategory Public `
| Where-Object { $_.Name -match $SelectedSSID }

Write-Host "`n无线网络的 SSID 为:"$network.Name
# The SSID of specified WLAN is: " + $network.Name

# 检查并纠正多个匹配的链接到一个
if ($network.GetType().BaseType.Name -eq "Array") {
    Write-Warning "`n?:同一个无线网络 SSID 匹配了多个连接的无线网络,将选择其中的第一个"
    $network = $network[0]
}

# 将无线网络连接配置从公用改为专用
# Change public connection to private
Set-NetConnectionProfile -InputObject $network -NetworkCategory Private

# 将无线网络连接配置从专用改为公用
# Change private connection to public
# Set-NetConnectionProfile -InputObject $network -NetworkCategory Public

# 展示更改结果
# Show result
Write-Host "`n更改结果:"
Get-NetConnectionProfile -InterfaceAlias WLAN -IPv4Connectivity LocalNetwork | Select-Object Name,InterfaceAlias,NetworkCategory,IPv4Connectivity,DomainAuthenticationKind

Write-Host "`n完成,4 秒后将自动退出..."
Start-Sleep -Seconds 4
exit
Windows-NetworkProfileToPrivate.ps1

配置批处理脚本

安卓系统底层会生成不可更改的,随机生成移动热点 IP 地址的类 DHCP 机制,也就是说每次打开热点,IP 地址都会改变(真的...唉)。因此需要一套批处理脚本来选择正确的 IP 地址,传输协议,以及端口号,再调用 explorer.exe 才能打开正确的 FTP IP。

解决方法是将如下的命令储存为批处理脚本,如 Windows-Explorer-FTP-Connect.bat


chcp 65001
@echo off

REM 设定 SSID 到你设置的移动端 FTP/HTTP 服务器端口号,如2121,2221
set port=9999
set http_port=8080

REM 待设置的网关变量
set store=""

echo:
echo 1. 检查是否已连接到热点网络。未连接时什么都不会显示,可输入 Ctrl+C 以退出
echo:

@echo off
netsh wlan show interface | findstr /C:"Description" /C:"SSID" /C:"Radio" /C:"Transmit" /C:"Receive" /C:"Signal" /C:"State"
echo:

setlocal enabledelayedexpansion
REM 查找 IPv4 地址中,所有的 Default Gateway 行,通过": " 实现分离
REM 目标是得到如 "Default Gateway . . . . . . . . . : 192.168.43.129" 中的 IP 地址
for /f "tokens=2 delims=:" %%a in ('ipconfig ^| findstr /i "Default Gateway"') do (
    REM 提取 Default Gateway 地址
    set ip=%%a

    REM 去除可能存在的前导空格
    set ip=!ip:~1!

    REM 将 Default Gateway 地址分割成四个 octet
    for /f "tokens=1-4 delims=." %%b in ("!ip!") do (
        set _o1=%%b
        set _o2=%%c
        set _o3=%%d
        set _o4=%%e
    )

    REM 用户确认是否将该 IP 地址储存到变量中
    set /p "store=?. FTP 服务器的地址是否为 !_o1!.!_o2!.!_o3!.!_o4! (y/n): "
    if /i "!store!"=="y" (
        REM 将 IP 地址存储到变量中
        set "stored_ips=!_o1!.!_o2!.!_o3!.!_o4!"
        REM 离开循环
        goto :EndLoopI
    )
)
:EndLoopI

REM 没有 FTP/HTTP 地址可用时退出
if "%stored_ips%"=="" (
    echo:
    echo 没有 FTP 地址可用,或没有在正确的地址上输入 y 以确认,按任意键退出
    pause
    goto :End
)

echo:
echo 2. 获取无线热点网络的名称(SSID),从而将网络类型从公用改成专用
echo:

REM 2. 网络类型必须为专用,否则不能传输文件
REM 用于储存 WLAN SSID 的变量
set "wlan_ssid="

REM 列举所有已连接的无线网络,用户选择正确的 SSID
for /f "tokens=1,* delims=:" %%A in ('netsh wlan show interfaces ^| findstr "\<SSID\>"') do (
    REM 提取 SSID 名称
    set wlan_ssid=%%B

    REM 去除可能存在的前导空格
    set wlan_ssid=!wlan_ssid:~1!

    set /p "store=?. 无线热点的 SSID 是否为 !wlan_ssid! (y/n): "
    if /i "!store!"=="y" (
        REM 离开循环
        goto :EndLoopII
    )
)
:EndLoopII

REM 没有 FTP/HTTP 地址可用时退出
if "%wlan_ssid%"=="" (
    echo:
    echo 没有 SSID 可用,或没有在正确的地址上输入 y 以确认,按任意键退出
    pause
    goto :End
)

REM 导出 SSID 到当前路径
echo %wlan_ssid% > %~dp0\temp_wlan_ssid.txt

REM 将 SSID 发送到 PowerShell 脚本中,以更改网络类型到专用
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%~dp0\Windows-NetworkProfileToPrivate.ps1"
echo ?. 该脚本会显示一个 Get-Content 错误,请无视
timeout /t 1
%~dp0\temp_wlan_ssid.txt

REM 3. 用户选择传输协议类型。FTP 速度最快也最不安全,SFTP/FTPes 的速度受到 openSSL 限制

echo:
echo 当前的 FTP 服务器端口号配置为 %port%,HTTP 服务器端口号配置为 %http_port%
set /p "pr=文件服务器使用哪种传输协议 [1: FTP/FTPes | 2: SFTP | 3: HTTP]?: "


REM 4. 根据用户选择的协议得到完整的地址
if %pr%==1 set "proto=ftp://"
if %pr%==2 set "proto=sftp://" 
if %pr%==3 set "proto=http://"
if %pr%==3 set "port=%http_port%"
echo:

set /p "store=确认打开 FTP/HTTP 服务器地址: %proto%%stored_ips%:%port% (y/n): "
if /i %store%==y (
    echo 正在打开: %proto%%stored_ips%:%port%
    start %SystemRoot%\explorer.exe "%proto%%stored_ips%:%port%"
    echo:
    echo 4. 如果要传输的文件名有特殊字符,则传输到 FTP 服务器会导致错误 501
    echo    可将含特殊字符文件名的文件放置于文件夹中,或将其所在的文件夹传输到 FTP 服务器
    echo:
    echo 5. 传输完成后记得关闭 FTP 服务器,WiFi 热点
    echo    如果电脑端无法上网,则关闭电脑端的 WLAN
    echo    Windows 下点击右下角的"网络"即可更改 WLAN 开关
    timeout /t 12
)

:End
Windows-Explorer-FTP-Client.bat

这个批处理脚本会临时生成一个文本文件,以便前面的 PowerShell 脚本导入(直接作为参数导入时,会与 PowerShell 脚本获取管理员权限的功能冲突),并且自动在过程中打开前面的 PowerShell 脚本,同时。利用 Windows 系统中自带的 explorer.exe 完成 FTP 的访问读写操作,从而尽可能接近 MTP 的使用体验。

进一步提高操作效率

  • 如图。
    • Improvement-settings.png

开始传输

注意:请按顺序操作

  1. 手机关闭无线网络
    • 如果之前配置 WiFi 热点时,未选择不共享移动数据,则此处还要关闭移动数据
  2. 手机打开热点
    • 图:此时手机的 IP 地址会变成热点的 IP 地址,而不是无线网络下的 IP 地址

      • WiFi-hotspot-on-off-refer.png
  3. 电脑连接手机的移动热点
    • Windows-connect-Hotspot.png
  4. 手机打开 Servers Ultimate
  5. 进入 Servers 菜单
  6. 点击(之前创建的 FTP 服务器图标右侧的) 运行
  7. 运行上述 Windows-Explorer-FTP-Connect.bat 脚本
    • 进行每一步都读一下说明,不要狂按回车
    • 在第二步中会打开一个 PowerShell 窗口以获取管理员权限
    • 看到 explorer.exe 正常打开了 FTP 传输,就完成了

方案分析

可以看到,这套方案无论是配置还是使用,都足够方便和快速。同时:

  • 在不买 WiFi 6 路由器的情况下,做到了比电脑到手机之间中继一个 WiFi 6 路由器要更快的传输速度
  • 传输的功能本身不与 WiFi 规格绑定,因此也会支持未来的 WiFi 7,8,9,从而变得更快
  • 传输大文件的时候将手机放在距离电脑 WiFi 天线 0.1 毫米左右的距离还可以变得更快
  • 可以按 Ctrl+Shift+Esc 打开任务管理器来观察连接的协议和传输速度。如:
    • inspect-speed-at-taskmanager.png
  • 此处峰值 890 Mbps / 111.25 MBps,比前文 PCHardware 测试路由器得到的 839 Mbps / 104.875 MBps 快了 51 Mbps / 6.375 MBps
  • 考虑到一加 8 是较早支持 WiFi 6 的机型,在散热和技术限制下无法传输的更快了,但新的手机可以期待跑满峰值的 1.2Gbps / 150 MBps
  • 一加 Ace 3 可以跑满 WiFi 6E 的极限速度,峰值大约在 980Mbps(下图 1),但可能是因为协议的关系,每隔一小段时间网速就会跌到 890Mbps(下图 2)
    • inspect-speed-at-taskmanager-3.png
    • inspect-speed-at-taskmanager-2.png

缺陷

  • 如果一开始使用机械硬盘,那么 WiFi 5、6 和 USB 3.0 MTP 传输的速度都会遇到瓶颈
  • Servers Ultimate 是试用软件,如果没有经常传输大文件(如摄影和录制)的需求,则可能不适合解除试用
  • 支持 UTF-8 文件名,也就是不支持 UTF-16(NTFS)的文件名,因此特殊情况下仍然需要重命名删改繁体,异体汉字
    • 除非有人开发出支持 UTF-16 文件名的 FTP 服务器,并且做一个移动端界面才有希望支持

传输速度列表

虽然实际情况有快有慢,但此处只使用了实际速度来判断瓶颈大小。

手机端存储协议(MTP 限制下)

“协议”代表与实际速度无关的标准最大带宽。NAND 闪存决定了实际速度,但使用比闪存速度更慢的协议也会限制最大速度。

“受限”代表手机和电脑间使用了 Media Transfer Protocol (MTP) 传输文件。这对传输速度的影响极大,一般会使传输速率减半,因此通过乘以 0.5 来受限的传输速度。
另外,MTP 的稳定性也很差,有时连旗舰手机的使用体验都不好:

存储协议UFS 2.2 MTPUFS 3.0 MTPUFS 3.1 MTPUFS 4.0 MTP
受限顺序读/写500/130 MBps1050/205 MBps1050/600 MBps2100/900 MBps
换算一4000/1040 Mbps8400/1640 Mbps8400/4800 Mbps16800/7200 Mbps
换算二4/1 Gbps8.4/1.64 Gbps8.4/4.8 Gbps16.8/7.2 Gbps

电脑端的存储(平均)

存储协议SATA 3.0 HDDSATA 3.0 SSDPCIE 3.0 SSDPCIE 4.0 SSD
标称顺序读/写× 150/130 MBps× 550/550 MBps× 3500/3500 MBps× 5000/5000 MBps
换算一1200/1040 Mbps4400/4400 Mbps28000/28000 Mbps40000/40000 Mbps
换算二1.2/1.04 Gbps4.4/4.4 Gbps28/28 Gbps40/40 Gbps

USB 的传输速度

下表的“真实速度”代表去掉了传输开销条件,包括数据包的结构,校验,编码数据宽度等保证数据正常传输的措施数据后,留给数据的传输速度。一般会占用 25%~35% 的传输带宽。此处通过将标称速度乘以 0.7 得到:

传输技术USB 2.0USB 3.2 Gen 1 / 3.0USB 3.2 Gen 2 / 3.2USB 3.2 Gen 2x2
标称速度× 480 Mbps× 5000 Mbps× 10000 Mbps× 20000 Mbps
真实速度336 Mbps3500 Mbps7000 Mbps14000 Mbps
换算一0.336 Gbps3.5 Gbps7 Gbps14 Gbps
换算二42 MBps437.5 MBps875 MBps1750 MBps

可以看到,从电脑往手机上传输的理论最大速度是 205 MBps 或 1.64 Gbps,而实测 PCIE 3.0 SSD 通过 USB 3.0 传输一份 1GB 的文件到手机,平均速度稳定在 250 MBps,或 2 Gbps。

也可以看到,USB 2.0 真实的传输速度有多么糟糕。那么就这样。

更新信息

  • 增加了 PowerShell 更改网络连接为专用的脚本,解决了 PC 重启后 FTP 权限失效问题

打赏信息

bmc_qr.png
pp_tip_qr.png
——Buy me a coffee 链接
——PayPal 链接

——新纪录!这玩意现在年收入 20 人民币