quick-rtsp-test.sh 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266
  1. #!/bin/bash
  2. # 快速RTSP连接测试脚本
  3. # 专门针对Docker环境中的RTSP连接问题
  4. set -e
  5. # 颜色定义
  6. RED='\033[0;31m'
  7. GREEN='\033[0;32m'
  8. YELLOW='\033[1;33m'
  9. BLUE='\033[0;34m'
  10. NC='\033[0m'
  11. print_info() {
  12. echo -e "${GREEN}[INFO]${NC} $1"
  13. }
  14. print_warn() {
  15. echo -e "${YELLOW}[WARN]${NC} $1"
  16. }
  17. print_error() {
  18. echo -e "${RED}[ERROR]${NC} $1"
  19. }
  20. print_debug() {
  21. echo -e "${BLUE}[DEBUG]${NC} $1"
  22. }
  23. # 从配置文件读取RTSP URLs
  24. get_rtsp_urls() {
  25. if [[ -f "config.json" ]]; then
  26. grep -o '"rtsp://[^"]*"' config.json | sed 's/"//g'
  27. else
  28. echo "rtsp://218.94.57.146:40007/rtp/44010200492000000074_34020000001320000001"
  29. echo "rtsp://218.94.57.146:40007/rtp/44010200492000000164_34020000001320000001"
  30. fi
  31. }
  32. # 快速测试单个RTSP地址
  33. quick_test_rtsp() {
  34. local url=$1
  35. local host=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\1|p')
  36. local port=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\2|p')
  37. echo ""
  38. print_info "🔍 快速测试: $url"
  39. print_debug "主机: $host, 端口: $port"
  40. # 检查是否为IP地址
  41. local is_ip=false
  42. if [[ $host =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  43. is_ip=true
  44. print_debug "检测到IP地址,跳过DNS解析"
  45. fi
  46. # 1. ping测试
  47. echo -n " Ping测试: "
  48. if ping -c 1 -W 3 $host >/dev/null 2>&1; then
  49. echo -e "${GREEN}✅ 成功${NC}"
  50. else
  51. echo -e "${RED}❌ 失败${NC}"
  52. fi
  53. # 2. DNS解析(仅对域名进行)
  54. if [[ "$is_ip" == "false" ]]; then
  55. echo -n " DNS解析: "
  56. local ip=$(nslookup $host 2>/dev/null | grep -A 1 "Name:" | grep "Address:" | awk '{print $2}' | head -1)
  57. if [[ -z "$ip" ]]; then
  58. ip=$(dig +short $host 2>/dev/null | head -1)
  59. fi
  60. if [[ -n "$ip" ]]; then
  61. echo -e "${GREEN}✅ $ip${NC}"
  62. else
  63. echo -e "${RED}❌ 失败${NC}"
  64. return 1
  65. fi
  66. else
  67. echo -e " IP地址: ${GREEN}✅ $host(无需DNS解析)${NC}"
  68. fi
  69. # 3. 端口连通性 (多种方法)
  70. echo -n " 端口连通: "
  71. local port_ok=false
  72. # 方法1: nc
  73. if command -v nc >/dev/null 2>&1 && timeout 5 nc -z $host $port 2>/dev/null; then
  74. port_ok=true
  75. # 方法2: telnet
  76. elif command -v telnet >/dev/null 2>&1 && timeout 5 bash -c "echo '' | telnet $host $port" 2>/dev/null | grep -q "Connected"; then
  77. port_ok=true
  78. # 方法3: bash内置
  79. elif timeout 5 bash -c "exec 3<>/dev/tcp/$host/$port && exec 3<&-" 2>/dev/null; then
  80. port_ok=true
  81. fi
  82. if [[ "$port_ok" == "true" ]]; then
  83. echo -e "${GREEN}✅ 端口$port可达${NC}"
  84. else
  85. echo -e "${RED}❌ 端口$port不可达${NC}"
  86. return 1
  87. fi
  88. # 4. RTSP协议测试
  89. echo -n " RTSP协议: "
  90. if command -v nc >/dev/null 2>&1; then
  91. local rtsp_response=$(timeout 3 bash -c "echo -e 'OPTIONS $url RTSP/1.0\r\nCSeq: 1\r\nUser-Agent: QuickTest\r\n\r\n' | nc $host $port 2>/dev/null" || echo "")
  92. if [[ "$rtsp_response" == *"RTSP/1.0"* ]]; then
  93. echo -e "${GREEN}✅ RTSP服务正常${NC}"
  94. local status=$(echo "$rtsp_response" | head -1 | awk '{print $2}')
  95. print_debug " 响应状态: $status"
  96. elif [[ -n "$rtsp_response" ]]; then
  97. echo -e "${YELLOW}⚠️ 非标准响应${NC}"
  98. print_debug " 响应内容: $(echo "$rtsp_response" | head -1 | tr -d '\r\n')"
  99. else
  100. echo -e "${YELLOW}⚠️ 无响应(可能需要认证)${NC}"
  101. fi
  102. else
  103. echo -e "${BLUE}ℹ️ 跳过(缺少nc工具)${NC}"
  104. fi
  105. return 0
  106. }
  107. # 测试Docker容器内的连接
  108. test_in_docker() {
  109. print_info "🐳 测试Docker容器内连接..."
  110. if ! docker ps | grep -q jtjai_media; then
  111. print_warn "jtjai_media容器未运行"
  112. return 1
  113. fi
  114. local urls=($(get_rtsp_urls))
  115. for url in "${urls[@]}"; do
  116. local host=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\1|p')
  117. local port=$(echo $url | sed -n 's|rtsp://\([^:]*\):\([0-9]*\)/.*|\2|p')
  118. echo ""
  119. print_info "容器内测试: $url"
  120. # 检查是否为IP地址
  121. local is_ip=false
  122. if [[ $host =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  123. is_ip=true
  124. fi
  125. # 容器内DNS测试(仅对域名)
  126. if [[ "$is_ip" == "false" ]]; then
  127. echo -n " 容器DNS: "
  128. if docker exec jtjai_media nslookup $host >/dev/null 2>&1; then
  129. local container_ip=$(docker exec jtjai_media nslookup $host 2>/dev/null | grep -A 1 "Name:" | grep "Address:" | awk '{print $2}' | head -1)
  130. echo -e "${GREEN}✅ $container_ip${NC}"
  131. else
  132. echo -e "${RED}❌ 失败${NC}"
  133. fi
  134. else
  135. echo -e " IP地址: ${GREEN}✅ $host(无需DNS解析)${NC}"
  136. fi
  137. # 容器内端口测试
  138. echo -n " 容器端口: "
  139. if docker exec jtjai_media timeout 5 nc -z $host $port 2>/dev/null; then
  140. echo -e "${GREEN}✅ 可达${NC}"
  141. else
  142. echo -e "${RED}❌ 不可达${NC}"
  143. fi
  144. done
  145. }
  146. # 主函数
  147. main() {
  148. clear
  149. echo ""
  150. print_info "================================================"
  151. print_info "🚀 RTSP连接快速诊断工具"
  152. print_info "================================================"
  153. # 显示系统信息
  154. echo ""
  155. print_info "📋 系统信息:"
  156. echo " 主机名: $(hostname)"
  157. echo " 操作系统: $(uname -s) $(uname -r)"
  158. echo " 当前用户: $(whoami)"
  159. echo " 工作目录: $(pwd)"
  160. # 显示网络信息
  161. echo ""
  162. print_info "🌐 网络信息:"
  163. echo " 外网IP: $(timeout 3 curl -s ifconfig.me 2>/dev/null || echo '获取失败')"
  164. echo " 默认网关: $(ip route | grep default | awk '{print $3}' | head -1)"
  165. echo " DNS服务器: $(cat /etc/resolv.conf | grep nameserver | awk '{print $2}' | head -3 | tr '\n' ' ')"
  166. # 获取RTSP URLs
  167. local urls=($(get_rtsp_urls))
  168. print_info "📡 发现 ${#urls[@]} 个RTSP流地址"
  169. # 测试宿主机连接
  170. echo ""
  171. print_info "🖥️ 宿主机连接测试:"
  172. local success_count=0
  173. for url in "${urls[@]}"; do
  174. if quick_test_rtsp "$url"; then
  175. ((success_count++))
  176. fi
  177. done
  178. echo ""
  179. print_info "📊 测试结果: ${success_count}/${#urls[@]} 成功"
  180. # 根据结果给出建议
  181. if [[ $success_count -gt 0 ]]; then
  182. print_info "🎉 基本连接正常!现在可以启动Docker服务了"
  183. echo ""
  184. read -p "是否立即启动Docker服务? (y/n) " -n 1 -r
  185. echo ""
  186. if [[ $REPLY =~ ^[Yy]$ ]]; then
  187. print_info "启动Docker服务..."
  188. exec ./docker-start.sh
  189. fi
  190. fi
  191. # 测试Docker容器连接
  192. echo ""
  193. test_in_docker
  194. # 显示建议
  195. echo ""
  196. print_info "💡 IP直连优化建议:"
  197. if [[ $success_count -gt 0 ]]; then
  198. echo " ✅ 宿主机连接正常"
  199. echo " 🔧 Docker环境优化:"
  200. echo " 1. 使用host网络模式 (--network host)"
  201. echo " 2. 增加连接超时设置 (connection_timeout_seconds: 15)"
  202. echo " 3. 启用IP直连模式 (-e USE_IP_DIRECT=1)"
  203. echo " 4. 启用调试模式 (-e RTSP_DEBUG=1)"
  204. else
  205. echo " ❌ 宿主机连接存在问题"
  206. echo " 🔧 建议检查:"
  207. echo " 1. 网络连接状态"
  208. echo " 2. 防火墙设置 (端口40007)"
  209. echo " 3. RTSP服务器状态"
  210. echo " 4. 本地路由配置"
  211. fi
  212. echo ""
  213. print_info "🛠️ IP直连优化命令:"
  214. echo " 启动优化的Docker服务: ./docker-start.sh"
  215. echo " 手动运行容器:"
  216. echo " docker run -d --name jtjai_media --network host \\"
  217. echo " -e RTSP_DEBUG=1 -e USE_IP_DIRECT=1 \\"
  218. echo " -v \"\$(pwd)/output:/app/output\" \\"
  219. echo " -v \"\$(pwd)/config.json:/app/config.json:ro\" jtjai_media:latest"
  220. echo " 查看容器日志: docker logs -f jtjai_media"
  221. echo " 停止容器: docker stop jtjai_media"
  222. echo ""
  223. print_info "✅ 诊断完成!"
  224. }
  225. # 执行主函数
  226. main