#!/bin/bash # 端到端外呼验证: agent 进房 -> CreateSIPParticipant 呼出 -> mock 运营商应答 -> 双向 RTP 统计 # 用法: ./call.sh [房间名] [被叫号码] [时长秒] set -euo pipefail cd "$(dirname "$0")/.." ROOM="${1:-call-$(date +%s)}" NUMBER="${2:-+15105550123}" DURATION="${3:-15}" SECRET="f4f6c1a9e2b74d5893a0c8e17d2b6a45b7c93f1d6e284a05c9b3d7f2e6a81c04" LK="docker run --rm --network host -e LIVEKIT_URL=http://127.0.0.1:7880 \ -e LIVEKIT_API_KEY=devkey -e LIVEKIT_API_SECRET=$SECRET livekit/livekit-cli:latest" echo "== 1. 确保 outbound trunk 存在 (mock-provider)" TRUNK_ID=$($LK sip outbound list --json 2>/dev/null | python3 -c ' import json,sys for t in json.load(sys.stdin).get("items", []): if t.get("name") == "mock-provider": print(t.get("sipTrunkId","")); break') if [ -z "$TRUNK_ID" ]; then TRUNK_ID=$($LK sip outbound create mock/trunk.json 2>/dev/null | awk '/^SIPTrunkID:/ {print $2}') echo " created trunk: $TRUNK_ID" else echo " reuse trunk: $TRUNK_ID" fi echo "== 2. Mock agent 加入房间 $ROOM (发布TTS音, 订阅被叫音频)" /opt/lk-venv/bin/python mock/mock-agent.py --room "$ROOM" --duration "$DURATION" & AGENT_PID=$! sleep 2 echo "== 3. 发起 SIP 外呼 -> $NUMBER" $LK sip participant create --room "$ROOM" --identity "callee-$RANDOM" \ --trunk "$TRUNK_ID" --number "$NUMBER" --call "$NUMBER" \ --name "MockCallee" --wait --timeout 60s || true echo "== 4. 等待 agent 结束并输出双向统计" wait $AGENT_PID