From 337fb928600d4975206c3f44c41afa6439dc703e Mon Sep 17 00:00:00 2001 From: WXL <1785969728@qq.com> Date: 星期五, 08 八月 2025 17:57:49 +0800 Subject: [PATCH] 测试完成 --- src/utils/sipService.js | 91 ++++++++++++++++++++++----------------------- 1 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/utils/sipService.js b/src/utils/sipService.js index b93e184..9088bad 100644 --- a/src/utils/sipService.js +++ b/src/utils/sipService.js @@ -11,41 +11,38 @@ init(config) { try { - this.updateStatus("connecting", "杩炴帴涓�..."); + this.updateStatus("connecting", "杩炴帴涓�;..."); this.ua = new JsSIP.UA({ sockets: [new JsSIP.WebSocketInterface(config.wsUrl)], uri: config.sipUri, password: config.password, display_name: config.displayName, - iceServers: [{ urls: "stun:stun.l.google.com:19302" }], + iceServers: [], register: true, - session_expires: 900, - sessionTimersExpires: 600, - extraHeaders: ["Min-SE: 120"], + sessionExpires: 1800, + minSessionExpires: 90, register_expires: 300, - connection_recovery_min_interval: 2, - connection_recovery_max_interval: 30, - pcConfig: { - iceTransportPolicy: "all", - rtcpMuxPolicy: "require", - bundlePolicy: "max-bundle" - } }); this.ua.start(); // 浜嬩欢鐩戝惉 - this.ua.on("registered", () => this.updateStatus("registered", "宸叉敞鍐�")); + this.ua.on("registered", () => + this.updateStatus("registered", "宸叉敞鍐�56") + ); this.ua.on("registrationFailed", (e) => - this.updateStatus("failed", `娉ㄥ唽澶辫触: ${e.cause}`)); + this.updateStatus("failed", `娉ㄥ唽澶辫触11: ${e.cause}`) + ); this.ua.on("disconnected", () => - this.updateStatus("disconnected", "杩炴帴鏂紑")); + this.updateStatus("disconnected", "杩炴帴鏂紑") + ); this.ua.on("connected", () => - this.updateStatus("connecting", "閲嶆柊杩炴帴涓�...")); + this.updateStatus("connecting", "閲嶆柊杩炴帴涓�...") + ); this.ua.on("newRTCSession", (data) => - this.handleIncomingCall(data.session)); - + this.handleIncomingCall(data.session) + ); } catch (error) { this.updateStatus("failed", `鍒濆鍖栧け璐�: ${error.message}`); console.error("SIP鍒濆鍖栧け璐�:", error); @@ -65,16 +62,13 @@ } const options = { - sessionTimers: false, // 鏆傛椂绂佺敤浠ュ噺灏戝吋瀹规�ч棶棰� - extraHeaders: [ - "Min-SE: 120", - "Accept: application/sdp", - "Supported: outbound" - ], + sessionTimers: true, // 鍚敤浼氳瘽璁℃椂鍣� + sessionTimersExpires: 90, + extraHeaders: ["Accept: application/sdp"], mediaConstraints: { audio: true, video: false }, rtcOfferConstraints: { offerToReceiveAudio: true, - offerToReceiveVideo: false + offerToReceiveVideo: false, }, eventHandlers: { progress: () => this.updateCallStatus("calling", "鍛煎彨涓�..."), @@ -85,8 +79,8 @@ confirmed: () => { this.updateCallStatus("connected", "閫氳瘽宸叉帴閫�"); resolve(); - } - } + }, + }, }; this.currentSession = this.ua.call( @@ -96,9 +90,8 @@ this.setupPeerConnection(this.currentSession); this.setupAudio(this.currentSession); - } catch (error) { - this.updateCallStatus("failed", `鍛煎彨澶辫触1: ${error.message}`); + this.updateCallStatus("failed", `鍛煎彨澶辫触22: ${error.message}`); reject(error); } }); @@ -123,41 +116,44 @@ normalizeSDP(offer) { let sdp = offer.sdp; - // 1. 鏍囧噯鍖栬繛鎺ヨ + // 鏍囧噯鍖朣DP sdp = sdp.replace(/c=IN IP4.*\r\n/, "c=IN IP4 0.0.0.0\r\n"); + sdp = sdp.replace( + /m=audio \d+.*\r\n/, + "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n" + ); - // 2. 鏍囧噯鍖栭煶棰戝獟浣撹 - sdp = sdp.replace(/m=audio \d+.*\r\n/, - "m=audio 9 UDP/TLS/RTP/SAVPF 0 8\r\n"); + // 纭繚鍖呭惈鍩烘湰缂栬В鐮佸櫒 + if (!sdp.includes("PCMU/8000")) sdp += "a=rtpmap:0 PCMU/8000\r\n"; + if (!sdp.includes("PCMA/8000")) sdp += "a=rtpmap:8 PCMA/8000\r\n"; - // 3. 纭繚鍖呭惈鍩烘湰缂栬В鐮佸櫒 - if (!sdp.includes("PCMU/8000")) { - sdp += "a=rtpmap:0 PCMU/8000\r\n"; - } - if (!sdp.includes("PCMA/8000")) { - sdp += "a=rtpmap:8 PCMA/8000\r\n"; - } - - // 4. 娣诲姞蹇呰灞炴�� + // 娣诲姞蹇呰灞炴�� sdp += "a=rtcp-mux\r\n"; sdp += "a=sendrecv\r\n"; console.log("鏍囧噯鍖栧悗鐨凷DP:", sdp); return new RTCSessionDescription({ type: offer.type, - sdp: sdp + sdp: sdp, }); } handleCallFailure(e, reject) { + if (e.response?.status_code === 422) { + const serverMinSE = e.response.headers["Min-SE"]?.[0]?.raw || "鏈煡"; + console.error(`鏈嶅姟鍣ㄨ姹� Min-SE 鈮� ${serverMinSE}锛屽綋鍓嶈缃�: 120`); + } console.error("鍛煎彨澶辫触璇︽儏:", { cause: e.cause, message: e.message, - response: e.response && e.response.status_code + response: e.response && { + status: e.response.status_code, + reason: e.response.reason_phrase, + }, }); let errorMessage = "鍛煎彨澶辫触"; - switch(e.cause) { + switch (e.cause) { case "Incompatible SDP": errorMessage = "濯掍綋鍗忓晢澶辫触锛岃妫�鏌ョ紪瑙g爜鍣ㄩ厤缃�"; break; @@ -165,11 +161,14 @@ case "606": errorMessage = "瀵规柟璁惧涓嶆敮鎸佸綋鍓嶅獟浣撻厤缃�"; break; + case "422": + errorMessage = "浼氳瘽鍙傛暟涓嶆弧瓒虫湇鍔″櫒瑕佹眰"; + break; default: errorMessage = `鍛煎彨澶辫触: ${e.cause || e.message}`; } - this.updateCallStatus("failed2", errorMessage); + this.updateCallStatus("failed55", errorMessage); reject(new Error(errorMessage)); } -- Gitblit v1.9.3