ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

在局域网里找到电视并用 ADB 无线连接:端口扫描、ADB 授权原理和 macOS 上的两个坑

在局域网里找到电视并用 ADB 无线连接:端口扫描、ADB 授权原理和 macOS 上的两个坑 说明本文由 Claude 协助整理成文过程中的脚本也是和 Claude 一起写的。前言客厅的 Sony 电视是 Android TV打开开发者模式之后就能用电脑通过 ADB 管理它装应用、截图、查看系统信息、用命令代替遥控器。第一步是知道电视的 IP。本来想让 Claude 直接扫一遍局域网但它的命令行跑在沙盒里碰不到家里的网络于是换了个办法Claude 写好脚本我在 Mac 上双击运行结果写进文件它再去读。前后两个脚本一个扫描一个连接中间踩了两个挺有意思的坑。这篇按顺序讲怎么在局域网里找到电视、ADB 无线调试的原理以及这两个坑。一、在局域网里找到电视1.1 思路扫调试端口而不是扫设备家里联网的设备很多手机、平板、路由器、各种智能家居光看 IP 分不出哪台是电视。更直接的办法是扫开发者模式会打开的那个端口谁开着谁就是目标端口对应的系统作用5555Android TV / Google TV小米、海信、TCL、索尼等ADB 网络调试9922LG webOS 开发者模式SSH开发工具通过它安装应用26101三星 TizensdbTizen 版的 ADB1.2 扫描脚本核心就几行IP$(ipconfig getifaddr en0||ipconfig getifaddr en1)# 有线或 Wi-Fi 网卡的 IPSUB${IP%.*}# 192.168.0.133 → 192.168.0foriin$(seq1254);do(nc-vz-G1-w1$SUB.$i555599222610121|grepsucceeded)donewaitarp-an|grep-vincomplete# 顺便列出所有在线设备${IP%.*}去掉最后一段假定家里是常见的 /24 网段255.255.255.0。nc -z只建立连接、不收发数据-G 1是 macOS 版 nc 的连接超时1 秒-v让它把succeeded打印出来方便 grep。254 个地址各开一个后台子进程并行扫wait等它们全部结束整个过程几秒钟。1.3 原理TCP 连接探测对某个地址的某个端口发起 TCP 连接会有三种结果收到SYN-ACK端口开着连接成功nc 打印 succeeded收到RST设备在但端口没开立即失败什么都没收到这个地址上没有设备等到超时。最后一行arp -an是个顺手的收获。在局域网里发 TCP 连接之前系统要先用 ARP 问这个 IP 的 MAC 地址是多少所以扫完一遍之后所有在线设备都留在了 ARP 缓存里哪怕它们一个端口都没开。1.4 结果包括路由器和这台 Mac 在内一共 33 个地址有回应但开着调试端口的只有一个Connection to 192.168.0.120 port 5555 [tcp/personal-agent] succeeded!personal-agent是 macOS 的/etc/services里给 5555 端口登记的名字和 ADB 没关系不用管。5555 开着就是 Android TV 的 ADB 端口电视的 IP 是 192.168.0.120。1.5 为什么用 .command 文件macOS 上扩展名是.command的 shell 脚本双击就会在终端里运行不用打开终端敲命令。脚本开头用cd $(dirname $0)切到脚本所在的文件夹结果用tee同时显示在窗口里、写进同目录下的 txt 文件这样 AI 不用碰终端也能读到结果。二、坑一一个全角逗号吃掉了变量第一次扫描的结果文件里第二行长这样本机 IP扫描 192.168.0.1 ~ 192.168.0.254本机 IP 没显示出来还多了两个乱码。对应的那行脚本是echo本机 IP$IP扫描$SUB.1 ~$SUB.254问题出在$IP后面紧跟的全角逗号。它的 UTF-8 编码是三个字节EF BC 8C。bash 遇到$时会一直往后读能作为变量名的字符直到读到不合法的字符为止。macOS 自带的 bash 是很老的 3.2 版它按单个字节判断是不是字母而 macOS 的 C 库在 UTF-8 环境下会把 0x80–0xFF 的单字节按 Latin-1 解释0xEF正好是 Latin-1 里的ï被当成了字母。于是 bash 读到的变量名是IP\xEF这个变量不存在展开成空字符串剩下的BC 8C两个字节组不成完整字符就成了那两个乱码。修复很简单加上花括号明确变量名的边界echo本机 IP${IP}扫描${SUB}.1 ~${SUB}.254经验shell 脚本里只要变量后面紧跟中文或其他非 ASCII 字符一律写成${VAR}。同一行里的$SUB.1没出问题是因为.不是字母变量名在它前面就结束了。三、ADB 无线调试是怎么工作的3.1 三个角色TCP 5037TCP 5555adb 客户端你敲的命令adb 服务端电脑上的后台进程adbd电视上的守护进程adb 客户端每次在终端里敲adb xxx启动的就是它。它自己不连设备只把命令交给本机的服务端。adb 服务端第一次运行 adb 时自动在后台启动监听本机 5037 端口负责维护和所有设备的连接。之后的每条命令都复用它。adbd跑在电视手机上的守护进程。走数据线时通过 USB 通信打开网络调试后它监听 TCP 5555。记住真正去连设备的是后台服务端不是你敲的那条命令后面第二个坑就是这么来的。3.2 第一次连接时的授权RSA 密钥电视上弹出的允许 USB 调试吗背后是一次 RSA 密钥认证电视adbd电脑adb 服务端电视adbd电脑adb 服务端不认识这把公钥弹窗允许 USB 调试吗显示公钥指纹CNXN 请求连接AUTH TOKEN一段随机数AUTH SIGNATURE用私钥签名AUTH RSAPUBLICKEY把公钥发过去用户点了允许 → CNXN连接建立电脑的密钥对在~/.android/adbkey私钥和adbkey.pub公钥第一次运行 adb 时自动生成。勾选一律允许后电视会把这把公钥存进自己的授权列表以后同一台电脑再连签名一验就过不再弹窗。换了电脑、或者删了~/.android/adbkey就得重新授权一次。3.3 老式 5555 和 Android 11 的无线调试Android 上其实有两套网络 ADB老式网络 ADBadb tcpip 5555Android 11 无线调试怎么打开先插数据线执行adb tcpip 5555或者设备自带网络调试开关开发者选项里打开无线调试端口固定 5555随机端口发现方式自己知道 IPmDNS 广播_adb-tls-connect._tcp第一次认证RSA 授权弹窗先用 6 位配对码或二维码配对adb pair传输加密无明文TLS 加密这台电视走的是老式 5555在开发者选项里打开调试开关后adbd 就直接在 5555 端口上监听不需要先插数据线。老式方式的认证只防没授权的电脑连上来连上之后数据是明文传输的所以只适合在自己家里的网络用。四、坑二端口明明是通的adb connect 却报 No route to host扫描已经证明 5555 是开的可执行连接时却报错failed to connect to 192.168.0.120:5555: No route to hostNo route to host一般是网络不通可同一台 Mac 上 nc 明明连得上。原因就在 3.1 节那张图里真正发起连接的是 adb 后台服务端而这个服务端进程是更早之前由别的程序启动的一直在后台跑着。macOS 15 起访问局域网地址需要本地网络权限权限是按负责的 App算的那个老的服务端进程没有拿到这个权限它向局域网发出的连接就被系统直接拒绝表现出来正是 No route to host。nc 是从终端直接运行的终端有权限所以能连上。解决办法是把老的服务端杀掉从有权限的终端里重新连adb 会自动拉起一个新的服务端adb kill-server adb connect192.168.0.120:5555第二次连接电视上弹出授权框用遥控器点允许连接成功。经验排查网络问题时先搞清楚到底是哪个进程在发起连接。adb、docker 这类客户端 后台服务结构的工具命令行能不能连通不代表服务端能连通。五、连上之后这台电视的真实配置用adb shell getprop、wm size、wm density等命令读出来的信息项值型号Sony BRAVIA 4K VH21系统Android TV 12API 31CPU 架构armeabi-v7a32 位屏幕面板 3840×2160系统界面按 1920×1080 渲染density 320内存约 3 GB存储/data 47 GB已用 2.8 GB第三方应用16 个有两点值得说一下4K 电视界面却是 1080p。电视的系统界面按 1920×1080、density 320 渲染再放大到 4K 面板上视频走的是单独的硬件图层按 4K 原生解码和显示。这样界面渲染的开销小很多看视频又不损失清晰度。所以给电视做应用时界面按 960×540 dp 设计就行。32 位系统。不少电视的芯片是 64 位的但出厂系统跑的是 32 位用户空间因为 32 位程序占用的内存更少对内存只有 23 GB 的电视更划算。往电视上装 APK 时要确认里面有 armeabi-v7a 的库只有 arm64-v8a 的应用装不上。几个常用命令adb shell getprop ro.product.model# 型号adb shell pm list packages-3# 第三方应用adbinstallxxx.apk# 安装应用adb exec-out screencap-pscreen.png# 截屏adb shell input keyevent KEYCODE_HOME# 相当于按遥控器的主页键六、安全提醒ADB 等于拿到了设备的完全控制权装应用、读文件、模拟按键都可以。所以只在自己家里的网络打开网络调试用完记得关不要在路由器上把 5555 端口映射到公网。2018 年就出现过专门扫描公网上开着 5555 端口的安卓设备、自动植入挖矿程序的蠕虫授权弹窗里没见过的电脑一律点拒绝。结语整件事技术上不复杂扫端口找到电视ADB 连上去。但两个坑都挺典型一个是 shell 变量遇上中文一个是谁在发起连接。前者记住${VAR}后者记住 adb 有个后台服务端。下次再给家里的设备做调试这两点能省不少时间。
返回列表