From f06ac3402687f19065bd5ae738f9a8e95dad7eaa Mon Sep 17 00:00:00 2001
From: WXL <1785969728@qq.com>
Date: 星期四, 10 七月 2025 17:09:14 +0800
Subject: [PATCH] 测试完成
---
/dev/null | 0
src/views/sfstatistics/percentage/index.vue | 2
src/utils/sipService.js | 176 ++++++++++++++++++++++++++++++++++++++--------------------
3 files changed, 116 insertions(+), 62 deletions(-)
diff --git "a/dist \0502\051.zip" "b/dist \0502\051.zip"
deleted file mode 100644
index 7bb86ba..0000000
--- "a/dist \0502\051.zip"
+++ /dev/null
Binary files differ
diff --git a/dist.zip b/dist.zip
deleted file mode 100644
index 3ef4fc6..0000000
--- a/dist.zip
+++ /dev/null
Binary files differ
diff --git a/src/utils/sipService.js b/src/utils/sipService.js
index e6cca92..4b12914 100644
--- a/src/utils/sipService.js
+++ b/src/utils/sipService.js
@@ -1,118 +1,172 @@
-import JsSIP from 'jssip'
+import JsSIP from "jssip";
class SipService {
constructor() {
- this.ua = null
- this.currentSession = null
- this.onStatusChange = null // 鐘舵�佸彉鍖栧洖璋�
+ this.ua = null;
+ this.currentSession = null;
+ this.onStatusChange = null; // 鐘舵�佸彉鍖栧洖璋�
}
// 鍒濆鍖朣IP瀹㈡埛绔�
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:[],
// realm: config.realm,
register: true,
- session_expires:180,
+ session_expires: 180,
+ sessionTimersExpires: 300, // 璁剧疆 Session-Expires=120锛堝繀椤� >= Min-SE锛�
+ extraHeaders: [
+ "Min-SE: 120", // 鍙�夛細鏄惧紡鍛婅瘔鏈嶅姟鍣ㄤ綘鏀寔鐨勬渶灏忓��
+ ],
register_expires: 300, // 娉ㄥ唽鏈夋晥鏈�(绉�)
connection_recovery_min_interval: 2, // 鏈�灏忛噸杩為棿闅�
- connection_recovery_max_interval: 30 // 鏈�澶ч噸杩為棿闅�
- })
+ connection_recovery_max_interval: 30, // 鏈�澶ч噸杩為棿闅�
+ });
- this.ua.start()
+ this.ua.start();
// 娉ㄥ唽浜嬩欢鐩戝惉
- this.ua.on('registered', () => {
- this.updateStatus('registered', '宸叉敞鍐�')
- })
+ this.ua.on("registered", () => {
+ this.updateStatus("registered", "宸叉敞鍐�");
+ });
- this.ua.on('registrationFailed', (e) => {
- this.updateStatus('failed', `娉ㄥ唽澶辫触: ${e.cause}`)
- })
+ this.ua.on("registrationFailed", (e) => {
+ this.updateStatus("failed", `娉ㄥ唽澶辫触: ${e.cause}`);
+ });
- this.ua.on('disconnected', () => {
- this.updateStatus('disconnected', '杩炴帴鏂紑')
- })
+ this.ua.on("disconnected", () => {
+ this.updateStatus("disconnected", "杩炴帴鏂紑");
+ });
- this.ua.on('connected', () => {
- this.updateStatus('connecting', '閲嶆柊杩炴帴涓�...')
- })
+ this.ua.on("connected", () => {
+ this.updateStatus("connecting", "閲嶆柊杩炴帴涓�...");
+ });
// 鐩戝惉鏉ョ數
- this.ua.on('newRTCSession', (data) => {
- this.handleIncomingCall(data.session)
- })
-
+ this.ua.on("newRTCSession", (data) => {
+ this.handleIncomingCall(data.session);
+ });
} catch (error) {
- this.updateStatus('failed', `鍒濆鍖栧け璐�: ${error.message}`)
- console.error('SIP鍒濆鍖栧け璐�:', error)
+ this.updateStatus("failed", `鍒濆鍖栧け璐�: ${error.message}`);
+ console.error("SIP鍒濆鍖栧け璐�:", error);
+ }
+ }
+ handleIncomingCall(session) {
+ if (session.direction === "incoming") {
+ console.log("鏉ョ數:", session.remote_identity.uri.toString());
+ // 鍙互鍦ㄨ繖閲岃Е鍙� UI 閫氱煡
+ if (this.onIncomingCall) {
+ this.onIncomingCall(session);
+ }
}
}
// 鏇存柊鐘舵�佸苟閫氱煡UI
updateStatus(type, text) {
- console.log(`SIP鐘舵�佹洿鏂�: ${type} - ${text}`)
+ console.log(`SIP鐘舵�佹洿鏂�: ${type} - ${text}`);
if (this.onStatusChange) {
- this.onStatusChange({ type, text })
+ this.onStatusChange({ type, text });
}
}
// 涓�閿嫧鍙� - 澧炲姞娉ㄥ唽鐘舵�佹鏌�
makeCall(targetNumber) {
if (!this.ua) {
- throw new Error('SIP瀹㈡埛绔湭鍒濆鍖�')
+ throw new Error("SIP瀹㈡埛绔湭鍒濆鍖�");
}
if (!this.ua.isRegistered()) {
- throw new Error('SIP鏈敞鍐岋紝鏃犳硶鍛煎彨')
+ throw new Error("SIP鏈敞鍐岋紝鏃犳硶鍛煎彨");
}
const options = {
+ sessionTimers: true,
+ sessionTimersExpires: 300,
+ extraHeaders: [
+ "Min-SE: 120",
+ "Route: <sip:@192.168.100.6>",
+ "Accept: application/sdp",
+ "Supported: replaces, timer",
+ "Allow: INVITE, ACK, BYE, CANCEL, OPTIONS",
+ ],
eventHandlers: {
- progress: (e) => console.log('鍛煎彨涓�...'),
- failed: (e) => console.error('鍛煎彨澶辫触:', e),
- ended: (e) => console.log('閫氳瘽缁撴潫'),
- confirmed: (e) => console.log('閫氳瘽宸叉帴閫�')
+ progress: (e) => console.log("鍛煎彨涓�..."),
+ failed: (e) => console.error("鍛煎彨澶辫触:", e),
+ ended: (e) => console.log("閫氳瘽缁撴潫"),
+ confirmed: (e) => console.log("閫氳瘽宸叉帴閫�"),
},
- mediaConstraints: { audio: true, video: false },
- rtcOfferConstraints: { offerToReceiveAudio: 1 }
- }
+ mediaConstraints: {
+ audio: true,
+ video: false,
+ },
+ rtcOfferConstraints: {
+ offerToReceiveAudio: 1,
+ offerToReceiveVideo: 0,
+ mandatory: {
+ OfferToReceiveAudio: true,
+ OfferToReceiveVideo: false,
+ },
+ },
+ pcConfig: {
+ iceServers: [{ urls: "stun:stun.l.google.com:19302" }],
+ iceTransportPolicy: "all",
+ bundlePolicy: "balanced",
+ rtcpMuxPolicy: "require",
+ codecs: {
+ audio: [
+ { name: "PCMU", clockRate: 8000, payloadType: 0 },
+ { name: "PCMA", clockRate: 8000, payloadType: 8 },
+ ],
+ video: [],
+ },
+ },
+ };
- this.currentSession = this.ua.call(`sip:${targetNumber}@192.168.100.6`, options)
- this.setupAudio(this.currentSession)
+ this.currentSession = this.ua.call(
+ `sip:${targetNumber}@192.168.100.6`,
+ options
+ );
+ // 鍦ㄤ細璇濆垱寤哄悗淇敼 SDP
+ this.currentSession.on("peerconnection", (pc) => {
+ pc.createOffer = (offerOptions) => {
+ return RTCPeerConnection.prototype.createOffer
+ .call(pc, offerOptions)
+ .then((offer) => {
+ const modifiedSdp = offer.sdp
+ .replace(/c=IN IP4 192\.168\.100\.10/g, "c=IN IP4 192.168.100.6")
+ .replace(/m=audio \d+ RTP\/AVP.*/, "m=audio 7078 RTP/AVP 0 8");
+ return new RTCSessionDescription({
+ type: "offer",
+ sdp: modifiedSdp,
+ });
+ });
+ };
+ });
+ this.setupAudio(this.currentSession);
}
-
+ setupAudio(session) {
+ session.connection.addEventListener("addstream", (e) => {
+ const audioElement = document.getElementById("remoteAudio");
+ if (audioElement) {
+ audioElement.srcObject = e.stream;
+ }
+ });
+ }
// 鎸傛柇褰撳墠閫氳瘽
endCall() {
if (this.currentSession) {
- this.currentSession.terminate()
- this.currentSession = null
+ this.currentSession.terminate();
+ this.currentSession = null;
}
}
- // 澶勭悊闊抽娴�
- setupAudio(session) {
- session.connection.addEventListener('addstream', (e) => {
- const audioElement = document.getElementById('remoteAudio')
- if (audioElement) {
- audioElement.srcObject = e.stream
- }
- })
- }
-
- // 澶勭悊鏉ョ數
- handleIncomingCall(session) {
- if (session.direction === 'incoming') {
- console.log('鏉ョ數:', session.remote_identity.uri.toString())
- // 杩欓噷鍙互瑙﹀彂UI閫氱煡
- }
- }
}
-export default new SipService()
+export default new SipService();
diff --git a/src/views/sfstatistics/percentage/index.vue b/src/views/sfstatistics/percentage/index.vue
index 123346b..4e199c5 100644
--- a/src/views/sfstatistics/percentage/index.vue
+++ b/src/views/sfstatistics/percentage/index.vue
@@ -429,7 +429,7 @@
},
];
export default {
- name: "questionnaire",
+ name: "Percentage",
dicts: ["sys_normal_disable", "sys_user_sex"],
components: { Treeselect },
data() {
--
Gitblit v1.9.3