| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- #!/usr/bin/env node
- const { spawnSync } = require('child_process')
- const path = require('path')
- const config = require(path.join(__dirname, '..', '..', 'configs', 'config.js'))
- const projectRoot = path.resolve(__dirname, '..', '..')
- /** 从 config 解析并返回 adb 可执行文件路径 */
- function getAdbPath() {
- return config.adbPath?.path
- ? path.resolve(projectRoot, config.adbPath.path)
- : path.join(projectRoot, 'lib', 'scrcpy-adb', 'adb.exe')
- }
- /** 判断 adb connect 输出是否表示连接成功 */
- function isConnectSuccess(output) {
- const s = (output || '').trim()
- return s.includes('connected') || s.includes('already connected')
- }
- /** 对单个 IP 执行 adb connect,返回是否成功(不抛错,失败返回 false) */
- function tryConnectOne(adbPath, ip, port) {
- const quotedAdb = adbPath.includes(' ') ? `"${adbPath}"` : adbPath
- const cmd = `${quotedAdb} connect ${ip}:${port}`
- const shell = process.platform === 'win32' ? 'cmd' : 'sh'
- const shellArg = process.platform === 'win32' ? '/c' : '-c'
- const r = spawnSync(shell, [shellArg, cmd], { encoding: 'utf-8', timeout: 500 })
- return r.status === 0 && isConnectSuccess(r.stdout)
- }
- /** 扫描网段 basePrefix.1~.255,返回连接成功的 IP 列表 */
- function scanSubnet(adbPath, basePrefix, port) {
- const connected = []
- for (let i = 1; i <= 255; i++) {
- const ip = `${basePrefix}.${i}`
- if (tryConnectOne(adbPath, ip, port)) {
- connected.push(ip)
- }
- }
- return connected
- }
- const basePrefix = process.argv[2]
- const port = process.argv[3] || '5555'
- if (!basePrefix || !/^\d+\.\d+\.\d+$/.test(basePrefix)) {
- process.exit(1)
- }
- const adbPath = getAdbPath()
- const connected = scanSubnet(adbPath, basePrefix, port)
- process.stdout.write(connected.join('\n') + (connected.length ? '\n' : ''))
- process.exit(0)
|