Signal. Return to WebRTC service
1: package com.voipplus.mmsclient.WebRTC;
2:
3: import livekit.org.webrtc.IceCandidate;
4: import livekit.org.webrtc.SessionDescription;
5: import okhttp3.OkHttpClient;
6: import okhttp3.Request;
7: import okhttp3.Response;
8: import okhttp3.WebSocket;
9: import okhttp3.WebSocketListener;
10: import org.json.JSONException;
11: import org.json.JSONObject;
12:
13: public class SignalingManager {
14: private static final String TAG = "SignalingManager";
15: private String signalingServerUrl;
16: private WebSocket webSocket;
17: private boolean webSocketConnected = false;
18: private final WebRTCService webRTCService;
19:
20: public SignalingManager(WebRTCService webRTCService) {
21: this.webRTCService = webRTCService;
22: }
23:
24: // <editor-fold desc="Initialization and Configuration">
25: public void setSignalingServerUrl(String url) {
26: WebRTCUtils.debugInfo(TAG, "🔗 Setting WebSocket URL: " + url,
27: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
28: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
29: this.signalingServerUrl = url;
30: initWebSocket();
31: }
32: // </editor-fold>
33:
34: // <editor-fold desc="WebSocket Management">
35: public void initWebSocket() {
36: WebRTCUtils.debugInfo(TAG, "🌍 initWebSocket: Called. webSocketConnected=" + webSocketConnected,
37: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
38: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
39:
40: if (signalingServerUrl == null || signalingServerUrl.isEmpty()) {
41: WebRTCUtils.debugInfo(TAG, "❌ WebSocket URL is not set. Cannot initialize WebSocket.",
42: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
43: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
44: return;
45: }
46:
47: if (webSocketConnected) {
48: WebRTCUtils.debugInfo(TAG, "✅ WebSocket is already connected.",
49: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
50: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
51: return;
52: }
53:
54: webRTCService.updateWebRTCState(WebRTCState.CONNECTING_WEBSOCKET);
55:
56: OkHttpClient client = new OkHttpClient();
57: Request request = new Request.Builder().url(signalingServerUrl).build();
58: webSocket = client.newWebSocket(request, new WebSocketListener() {
59: @Override
60: public void onOpen(WebSocket webSocket, Response response) {
61: WebRTCUtils.debugInfo(TAG, "✅ WebSocket connected.",
62: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
63: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
64: webSocketConnected = true;
65: webRTCService.updateWebRTCState(WebRTCState.WEBSOCKET_CONNECTED);
66: }
67:
68: @Override
69: public void onMessage(WebSocket webSocket, String text) {
70: WebRTCUtils.debugInfo(TAG, "📩 Received WebSocket message: " + text,
71: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
72: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
73:
74: try {
75: JSONObject json = new JSONObject(text);
76: String type = json.getString("type");
77:
78: WebRTCUtils.debugInfo(TAG, "📡 Answer type" + type,
79: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
80: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
81:
82:
83:
84: if ("answer".equals(type)) {
85: String sdp = json.getString("sdp");
86: SessionDescription remoteSessionDescription = new SessionDescription(SessionDescription.Type.ANSWER, sdp);
87:
88: WebRTCUtils.debugInfo(TAG, "📡 Received SDP Answer: Applying...",
89: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
90: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
91:
92: // 🔴 Ensure we call handleRemoteAnswer properly
93: webRTCService.handleRemoteAnswer(remoteSessionDescription);
94: }
95: else if ("candidate".equals(type)) {
96: IceCandidate candidate = new IceCandidate(
97: json.getString("sdpMid"),
98: json.getInt("sdpMLineIndex"),
99: json.getString("candidate")
100: );
101:
102: WebRTCUtils.debugInfo(TAG, "📡 Received ICE Candidate: " + candidate.sdp,
103: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
104: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
105:
106: webRTCService.getPeerConnectionManager().handleIceCandidate(candidate);
107: }
108: } catch (JSONException e) {
109: WebRTCUtils.debugInfo(TAG, "❌ Failed to parse WebSocket message: " + text,
110: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
111: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
112: }
113: }
114:
115:
116: @Override
117: public void onFailure(WebSocket webSocket, Throwable t, Response response) {
118: WebRTCUtils.debugInfo(TAG, "❌ WebSocket connection failed: " + t.getMessage(),
119: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
120: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
121: webSocketConnected = false;
122: webRTCService.updateWebRTCState(WebRTCState.ERROR);
123: }
124: });
125: }
126:
127: public boolean isWebSocketConnected() {
128: return webSocketConnected;
129: }
130:
131: public boolean isWebSocketReady() {
132: return webRTCService.getWebRTCState() == WebRTCState.WEBSOCKET_CONNECTED;
133: }
134: // </editor-fold>
135:
136: // <editor-fold desc="Signaling Message Handling">
137: public void sendSignalingMessage(String message) {
138: WebRTCUtils.debugInfo(TAG, "sendSignalingMessage: Called. webRTCState=" + webRTCService.getWebRTCState() +
139: ", webSocketConnected=" + webSocketConnected +
140: ", message=" + message,
141: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
142: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
143:
144: if (!webSocketConnected) {
145: WebRTCUtils.debugInfo(TAG, "❌ WebSocket is not connected. Cannot send signaling message.",
146: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
147: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
148: return;
149: }
150:
151: if (webSocket != null) {
152: webSocket.send(message);
153: } else {
154: WebRTCUtils.debugInfo(TAG, "❌ WebSocket is null. Cannot send signaling message.",
155: webRTCService.getWebRTCState(), webRTCService.safeGetPeerConnection(),
156: webRTCService.safeGetDataChannel(), webSocket, signalingServerUrl);
157: }
158: }
159:
160: public void sendIceCandidateToSignalingServer(IceCandidate iceCandidate) {
161: sendSignalingMessage("{"type": "candidate", "candidate": "" + iceCandidate.sdp + "", " +
162: ""sdpMid": "" + iceCandidate.sdpMid + "", "sdpMLineIndex": " + iceCandidate.sdpMLineIndex + "}");
163: }
164: // </editor-fold>
165:
166: // <editor-fold desc="Accessors">
167: public String getSignalingServerUrl() {
168: return signalingServerUrl;
169: }
170:
171: public WebSocket getWebSocket() {
172: return webSocket;
169: }
170:
171: public WebSocket getWebSocket() {
172: return webSocket;
169: }
170:
169: }
169: }
169: }
170:
171: public WebSocket getWebSocket() {
172: return webSocket;
173: }
174: // </editor-fold>
175: }
176:
Return to WebRTC service
Android context:
Testing context:
Comments (
)
)
Link to this page:
http://www.vb-net.com/AndroidMosaic/Signal.htm
|
|