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