AIGC标识 山shui点歌机的adb连接探索

山shui点歌机 md129p:为了不被"到期续费"卡住,我把它的 adb 挖了出来

只是我自己这台机器的折腾记录,请只在你自己的设备上动手。

品牌名做了模糊处理(下文一律用"山shui"代称),板号、固件号、内置软件的包名同理隐去 —— 别问,问就是不想收律师函。


起因

上个月,这台点歌机弹了个窗:会员到期,续费才能继续用。

我盯着它看了三秒,然后有点不爽 —— 机器是我买的,硬盘是我买的,音箱是我买的,凭什么软件一到期,我这套东西就成了摆设?

所以我决定先干一件事:把它的 adb 拿到手。有了底层权限,我就能把它换成一个自己维护、不会过期、也不偷偷联网的点歌软件。

这台机器叫山shui点歌机 md129p,下面就叫它 md129p。

我原以为这是顺手就能收工的小事,结果全卡在"连不上 adb"这一件事上。

拿到它的过程,下面全记录。


这台机器

型号 山shui点歌机 md129p
系统 Android 4.4.2(API 19)
平台 全志(Allwinner)方案(板号/固件号略)
输出 1366×768,HDMI
网络 只有 Wi-Fi,没有网口(这点后面很关键)

一、先在机器上把「USB 调试」打开

点歌机默认是"桌面就是那一个 App"的形态,普通界面里压根看不到系统设置。

这一步只能用遥控器 / 触摸在机器上手动点 —— 这会儿还没有 adb 可用(有 adb 就不用写这篇了):

  1. 进「设置」,左侧菜单拉到底,点 关于点歌机
  2. 在"版本号"上连点 7 次,会提示"您现在处于开发者模式"
  3. 返回设置,左侧菜单里就多出 开发者选项
  4. 进去把 「USB 调试」 勾上

dev-options

图 1:「USB 调试」已勾选。

等后面拿到 adb 了,想再回这个页面就不用点 7 次了:
adb shell am start -a android.settings.APPLICATION_DEVELOPMENT_SETTINGS


二、有线:两个口都插了,一点反应都没有

电脑这边先装好 platform-tools(adb)。下面所有命令都是在电脑上跑的。

想法很朴素:有线的总比无线靠谱吧。

面板上能接电脑的口有两个:一个 OTG,一个 USB-A。两个我都插过。

panel

图 2:能接电脑的就是这两个 —— 左边标着 OTG、旁边还印着"数据"的小口(USB-C 造型),和中间的 USB-A 口。右边还有 TF 卡座(SD 卡)和 高清输出(HDMI),那两个接不了电脑。

注意看丝印:左边那个小口上印着 OTG 和"数据"四个字 —— 也就是说它本来就是留给"接电脑传数据"的。右边那个 USB-A 是给你插 U 盘的(Host)。

所以我重点试左边那个 OTG:拿 USB-C 线接到电脑上,adb devices 一点动静都没有。

结果:

  • adb devices —— 空的。
  • 设备管理器 —— 连个"未知设备"都不冒。电脑压根不知道有东西插进来了。
  • 换线、换电脑、两个口对调 —— 一样。

说真的,那会儿我对着空荡荡的设备管理器有点凉。好歹给个报错啊。

后来连上 adb 之后我又回头查了一次,发现事情有点意思:

$ adb shell getprop sys.usb.config
mtp,adb                                  # adb 这个 gadget 是开着的
$ adb shell ls /sys/class/android_usb/
android0  f_accessory  f_acm  f_adb ...  # f_adb:adb function 存在
$ adb shell ls /sys/class/udc/
1c13000.udc-controller                   # UDC 在,设备模式硬件是有的
$ adb shell cat /sys/class/android_usb/android0/state
DISCONNECTED

固件那边明明是准备好的。 那插上去为什么毫无反应?八成不是固件的事,而是线或者口:

  • USB-C 的线分两种,很多线只能充电、根本不带数据线序 —— 而我那个口正好是 USB-C 造型的。这个嫌疑最大。
  • OTG 的 ID 脚没被拉低,所以没切成设备模式。
  • 或者这个口在硬件上被锁死成 Host 了。

所以这儿给评论区留个具体问题:

左边那个印着 OTG / 数据 的 USB-C 口,用 USB-C 线接电脑毫无反应:/sys/class/udc/ 里 UDC 在、sys.usb.config 也是 mtp,adb,但 /sys/class/android_usb/android0/state 一直是 DISCONNECTED,设备管理器也不出东西。有人在这类全志点歌机上把 USB 设备模式跑通过吗? 是不是非得专门的 OTG 数据线、要短接 ID,还是得从主板上的隐藏 USB 口 / UART 进去?求指路。


三、转无线:把 1~65535 个端口扫一遍,找出 adbd

有线走不通,只剩无线。这一节是全文的核心:连 IP 都不知道的一台机器,怎么把它的 adb 端口挖出来。

3.1 让两边进同一个 Wi-Fi

把点歌机和电脑连到同一个路由器上(同一个网段)。这一步错了,后面全是连接超时。

3.2 从机器的设置里读出 IP

设置 → WLAN → 点一下已连接的那个网络,弹窗里就有:

image

图 3:IP 地址 192.168.31.83。邻居家的 Wi-Fi 名字我打了马赛克。

记下来:192.168.31.83。

设置进不去也行:路由器后台的 DHCP 客户端列表能看,arp -a 按 MAC 认设备也行。认 MAC 比记 IP 稳,DHCP 是会换 IP 的。

3.3 先按常规端口连,全不通

adb connect 192.168.31.83:5555
# cannot connect to ...: 由于目标计算机积极拒绝,无法连接。 (10061)

"积极拒绝"是好消息:设备活着,只是那个端口上没人在听。

那就按经验挨个试:

端口 用途 结果
5555 adb over TCP 默认端口 拒绝
5556 / 5557 5555 被占用后顺延 拒绝
5554 模拟器控制台 拒绝
5037 adb server(这是 PC 端的端口) 拒绝
8888 某些定制固件 拒绝

全不通。到这里基本可以判定:厂商把 adbd 的端口改成了非标值。

3.4 猜不出来就别猜:把 65535 个端口全扫一遍

思路很直接 —— 挨个端口握手一次,看哪个在听。脚本核心就四步:

  1. 用 Socket.ConnectAsync 并发握手,一批 256 个端口一起试;
  2. 每批只等一次超时(Task.WaitAll),不是逐个等 —— 否则一次超时会被并发数放大 256 倍;
  3. 每批结束时,把握上手的端口拿去 adb connect 试一下是不是 adbd;
  4. 一旦连上就立刻停止扫描,剩下的端口不用再扫。

这是个 PowerShell 脚本(Windows 自带的 5.1 就能跑,装个 PowerShell 7 更省心)。把下面整段复制走、存成 scan-adb-port.ps1 就能直接跑,不需要装任何东西 —— 它只用 .NET 自带的 socket 加上你机器上的 adb:

param([Parameter(Mandatory)][string]$Target, [string]$Adb = 'adb', [int]$Timeout = 150, [int]$Batch = 256)
# 扫 $Target 的 1~65535 端口,找到 adbd 立刻停止。
# 用法:pwsh -File scan-adb-port.ps1 -Target 192.168.31.83
# adb 不在 PATH 里时:-Adb C:\Apps\platform-tools\adb.exe
$sw = [Diagnostics.Stopwatch]::StartNew()
for ($p = 1; $p -le 65535; $p += $Batch) {
    $jobs = foreach ($port in $p..([Math]::Min($p + $Batch - 1, 65535))) {
        $tcp = [Net.Sockets.TcpClient]::new()
        [pscustomobject]@{ Port = $port; Tcp = $tcp; Task = $tcp.ConnectAsync($Target, $port) }
    }
    try { [void][Threading.Tasks.Task]::WaitAll(@($jobs.Task), $Timeout) } catch {}   # 整批等一次,别逐个等
    foreach ($j in $jobs) {
        if ($j.Task.Status -eq 'RanToCompletion') {
            $addr = "$Target`:$($j.Port)"
            Write-Host "端口 $($j.Port) 开着,试 adb ..."
            $out = & $Adb connect $addr 2>&1 | Out-String
            if ($out -match 'failed|cannot|refused|unable|无法|不是') {   # adb 有时第一次握手会失败,缓一下再试
                Start-Sleep -Milliseconds 800
                $out = & $Adb connect $addr 2>&1 | Out-String
            }
            if ($out -notmatch 'failed|cannot|refused|unable|无法|不是') {
                Write-Host "`n>>> adbd 在这里:$addr(耗时 $([Math]::Round($sw.Elapsed.TotalSeconds, 1)) 秒)" -ForegroundColor Green
                Write-Host "    adb connect $addr`n" -ForegroundColor Green
                exit
            }
        }
        $j.Tcp.Dispose()
    }
}
Write-Host "1~65535 全扫完,没找到 adbd。放慢再来:-Batch 32 -Timeout 400" -ForegroundColor Yellow

跑起来就一行:

pwsh -File .\scan-adb-port.ps1 -Target 192.168.31.83

实际输出:

  端口 6789 开着,试 adb ...

>>> adbd 在这里:192.168.31.83:6789(耗时 6.4 秒)
    adb connect 192.168.31.83:6789

答案:6789。

adb connect 192.168.31.83:6789
# connected to 192.168.31.83:6789

adb shell id
# uid=0(root)

root。 从这一秒起,这台机器才算是我的。


通了之后干什么

adb 通了之后就是常规操作了。挑几条跟点歌机最相关的:

装自己的应用

adb install -r my-ktv.apk
adb shell pm list packages -3                      # 看装了哪些第三方应用
adb shell pm disable-user --user 0 <包名>           # 停用内置应用(pm enable 能救回来)

这台是 Android 4.4(API 19),现在很多 APK 最低要 API 21+,直接装可能装不上或一开就崩 —— 得找对应老版本,或者自己编一份。

把机器里的东西导出来

adb shell /sbin/busybox df -h                                      # 先看盘
adb shell ls /mnt/sata/MaidongKTV/songs | /sbin/busybox wc -l       # 数一下有多少
adb pull /sdcard/some_small_file .                                  # 小文件随便拉

大文件千万别用 adb pull。 实测这台只有 0.4 MB/s,82 MB 要 57 小时。

换成"设备端先压缩,再用 nc 走裸 TCP 推给电脑",同一个文件 30 秒(2.31 MiB/s):

# 设备端:压缩,然后起一个一次性监听把文件推出去
adb shell '/system/bin/gzip -1 -c /path/Songs.txt > /data/local/tmp/x.gz'
adb shell '/system/xbin/nc -l 8899 < /data/local/tmp/x.gz'
# 电脑端:PowerShell 直连 8899 收流,不用装任何东西
$c = [System.Net.Sockets.TcpClient]::new('192.168.31.83', 8899)
$s = $c.GetStream(); $fs = [System.IO.File]::Create("$env:USERPROFILE\Downloads\x.gz")
$buf = [byte[]]::new(1MB)
while (($n = $s.Read($buf, 0, $buf.Length)) -gt 0) { $fs.Write($buf, 0, $n) }
$fs.Close(); $c.Close()

收完对个 md5 确认没坏:adb shell /sbin/busybox md5sum /path/Songs.txt。

摸清硬件底细

adb shell cat /proc/cpuinfo                             # 几核
adb shell cat /proc/meminfo | /sbin/busybox head -3      # 内存
adb shell /sbin/busybox df -h                            # 各分区空间
adb shell ls /sys/class/udc/                             # 有没有 USB Device Controller
adb shell ls /sys/bus/usb/devices/*/speed                # 每个 USB 设备跑在 480 还是 12 Mbit/s

抓日志、截图、遥控界面

adb shell screencap -p /data/local/tmp/s.png     # 先存到设备,再 pull 下来
adb shell logcat -d -s MyTag                     # 只看自己打的日志
adb shell input keyevent 4                       # 返回;Kiosk 机器上 D-pad 比鼠标靠谱
adb shell input keyevent 23                      # 确认
adb shell am start -a android.settings.WIFI_SETTINGS

本文的图 1、图 3 就是 am start 打开设置页 + screencap 拍出来的。

⚠️ Android 4.4 的小坑:这类老机器的 toybox 是阉割版,没有 head/tail/wc/find,df -h 也不认 -h,统统要写成 /sbin/busybox xxx。这台上有 BusyBox v1.18.3,上面这些命令我都验过能跑。


两个坑,记一下

① 端口不持久。

adb shell getprop | grep adb
# [service.adb.tcp.port]: [6789]     <- 运行时属性
# 注意:没有 persist.adb.tcp.port

service.adb.tcp.port 重启就没了。所以哪天突然又连不上,先怀疑这个(我就又遇到一次)。想让它开机自动开(需 root):

adb shell setprop persist.adb.tcp.port 6789

另外电脑侧的 adb server 也会掉,网络设备它也不记 —— 每次都得重新 adb connect。

② 别用 adb pull 搬大文件。 见上面那张表,差 5~6 倍。


后记

写这篇的初衷特别实在:会员到期要续费,可机器是我自己的。

我不想在这件事上被动。现在路通了 —— 换软件、导曲库、以后想怎么折腾都行。

整个过程里真正值钱的不是"6789"这个数字,是那个思路转弯:

猜不出来的时候,别接着猜,把范围一次性铺开。
而铺开的时候记得,超时是要花钱的 —— 一批端口只等一次,别逐个等。

还有两句掏心窝的:

  • 别用 adb pull 搬大文件。 同样一个 82 MB 的文件,换条路子从 57 小时变成 30 秒。
  • 连上之后先去 /proc 和 /sys 把硬件看明白。 先把"这机器是什么"搞清楚,再谈怎么改。

最后 —— USB 那条路我到现在也没走通。 UDC 和 mtp,adb 都查到了是配好的,说明硬件上有戏;那个口又是 USB-C 造型,我强烈怀疑是那根线只能充电、不能传数据。有在这类全志点歌机上把 USB 设备模式打通的朋友,评论区教教我,我是真想知道。

posted @ 2026-10-11 20:30  .NetDomainer  阅读(9)  评论(0)    收藏  举报