#!/usr/bin/env bash # 局域网无线主控:本机局网 IP ↔ 手机同 WiFi ↔ Termux Agent / 无线 ADB # 用法: # bash sdk/scripts/lan_connect_setup.sh # PHONE_IP=192.168.110.40 bash sdk/scripts/lan_connect_setup.sh # bash sdk/scripts/lan_connect_setup.sh --connect # 尝试 adb connect 后 oneclick set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" SDK_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" SDK_PORT="${WORKPHONE_SDK_PORT:-8899}" DEVICE_ID="${DEVICE_ID:-xgfe65eimrrofyws}" PHONE_IP="${PHONE_IP:-}" ADB_PORT="${ANDROID_ADB_SERVER_PORT:-5038}" ADB=(adb -P "${ADB_PORT}") export ANDROID_ADB_SERVER_PORT="${ADB_PORT}" LAN_ENV="${SDK_ROOT}/config/lan.env" DO_CONNECT=0 [[ "${1:-}" == "--connect" ]] && DO_CONNECT=1 pick_lan_ip() { local ip for ip in $(ifconfig | awk '/inet /{print $2}' | grep -v '^127\.'); do [[ "$ip" == 198.18.* ]] && continue [[ "$ip" == 192.168.110.* ]] && { echo "$ip"; return; } done for ip in $(ifconfig | awk '/inet /{print $2}' | grep -v '^127\.'); do [[ "$ip" == 198.18.* ]] && continue [[ "$ip" == 192.168.* ]] && { echo "$ip"; return; } done ipconfig getifaddr en0 2>/dev/null || ipconfig getifaddr en1 2>/dev/null || echo "127.0.0.1" } LAN_IP="$(pick_lan_ip)" WS_URL="ws://${LAN_IP}:${SDK_PORT}/ws/device/${DEVICE_ID}" API_URL="http://${LAN_IP}:${SDK_PORT}" log() { echo "[lan] $*"; } log "本机局网 IP: ${LAN_IP}" log "SDK API: ${API_URL}" log "Agent WS: ${WS_URL}" mkdir -p "${SDK_ROOT}/config" cat >"${LAN_ENV}" </dev/null 2>&1 || true SDK_VIA="local" if docker ps --format '{{.Names}}' 2>/dev/null | grep -qx workphone-sdk; then SDK_VIA="docker" log "SDK 由 Docker workphone-sdk 提供 :${SDK_PORT}" if ! curl -sf --max-time 5 "http://127.0.0.1:${SDK_PORT}/health" >/dev/null 2>&1; then log "Docker SDK 未响应,尝试 adb 桥接后重启容器…" bash "${SCRIPT_DIR}/adb_host_server_listen_all.sh" --background || true (cd "${SDK_ROOT}" && ADB_SERVER_SOCKET="tcp:host.docker.internal:${ADB_PORT}" docker compose up -d workphone-sdk) || true sleep 4 fi elif curl -sf --max-time 3 "http://127.0.0.1:${SDK_PORT}/health" >/dev/null 2>&1; then log "SDK localhost:${SDK_PORT} ✅ (${SDK_VIA})" else log "SDK 未运行 → 启动 uvicorn 0.0.0.0:${SDK_PORT}" cd "${SDK_ROOT}/app" nohup env ANDROID_ADB_SERVER_PORT="${ADB_PORT}" python3 -m uvicorn main:app \ --host 0.0.0.0 --port "${SDK_PORT}" >>"${SDK_ROOT}/logs/sdk.log" 2>&1 & sleep 3 fi if [[ "$SDK_VIA" == "docker" ]]; then bash "${SCRIPT_DIR}/adb_host_server_listen_all.sh" --background || true fi if curl -sf --max-time 5 "${API_URL}/health" >/dev/null 2>&1; then log "SDK 局网 ${API_URL}/health ✅" else log "⚠️ 局网 ${API_URL} 不可达 — 检查 Mac 防火墙是否放行 ${SDK_PORT},或确认手机与 Mac 同网段" fi # ── 2) 探测手机(同网段 5555)── try_adb_connect() { local host="$1" port="${2:-5555}" local target="${host}:${port}" "${ADB[@]}" connect "${target}" >/dev/null 2>&1 || true sleep 2 if "${ADB[@]}" -s "${target}" get-state 2>/dev/null | grep -qx device; then printf '%s' "${target}" return 0 fi "${ADB[@]}" disconnect "${target}" >/dev/null 2>&1 || true return 1 } FOUND="" ADB_SERIAL="" if [[ -n "$PHONE_IP" ]]; then if try_adb_connect "$PHONE_IP" >/dev/null; then ADB_SERIAL="${PHONE_IP}:5555" FOUND="${ADB_SERIAL}" fi fi if [[ -z "$FOUND" ]]; then for ip in 192.168.110.40 192.168.110.80 192.168.110.236 192.168.1.12; do ping -c 1 -W 1 "$ip" >/dev/null 2>&1 || continue if try_adb_connect "$ip" >/dev/null; then ADB_SERIAL="${ip}:5555" FOUND="${ADB_SERIAL}" break fi done fi if [[ -n "$FOUND" ]]; then log "无线 ADB 已连接: ${FOUND} ✅" else log "暂未发现无线 ADB(手机需:开发者选项 → 无线调试 / 或 USB 执行一次 adb tcpip 5555)" fi # ── 3) Termux 手机端命令(手机连本机 IP)── FRIDA_PORT="$(python3 -c "import json; print(json.load(open('${SCRIPT_DIR}/anti_detect/phantom_frida_config.json'))['listen_port'])" 2>/dev/null || echo 17263)" echo "" echo "================================================================" echo " 手机 Termux 执行(与 Mac 同一 WiFi · 连 ${LAN_IP})" echo "================================================================" cat </dev/null | python3 -m json.tool 2>/dev/null | head -25 || true