Skip to content

Commit b183bbe

Browse files
committed
fix flutter client
1 parent 37785ff commit b183bbe

File tree

6 files changed

+145
-144
lines changed

6 files changed

+145
-144
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
11
# Flutter WebRTC Example
2+
3+
![Preview](demo.png)

demo.png

3.1 MB
Loading

webrtc-flutter-client/lib/my_app.dart

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,21 @@ Future<void> myMain() async {
4848
// @nhancv 10/23/2019: Init bflutter caching
4949
await BCache.instance.init();
5050
// @nhancv 10/23/2019: Run Application
51-
// runApp(MyApp());
51+
runApp(MyApp());
5252

53-
IO.Socket socket = IO.io('http://192.168.1.10:3000', <String, dynamic>{
54-
'transports': ['websocket']
55-
});
56-
// Dart client
57-
socket.on('connect', (_) {
58-
print('connect');
59-
socket.emit('msg', 'test');
60-
});
61-
socket.on('event', (data) => print(data));
62-
socket.on('exception', (e) => print('Exception: $e'));
63-
socket.on('connect_error', (e) => print('Connect error: $e'));
64-
socket.on('disconnect', (_) => print('disconnect'));
65-
socket.on('fromServer', (_) => print(_));
53+
// IO.Socket socket = IO.io('http://192.168.1.10:3000', <String, dynamic>{
54+
// 'transports': ['websocket']
55+
// });
56+
// // Dart client
57+
// socket.on('connect', (_) {
58+
// print('connect');
59+
// socket.emit('msg', 'test');
60+
// });
61+
// socket.on('event', (data) => print(data));
62+
// socket.on('exception', (e) => print('Exception: $e'));
63+
// socket.on('connect_error', (e) => print('Connect error: $e'));
64+
// socket.on('disconnect', (_) => print('disconnect'));
65+
// socket.on('fromServer', (_) => print(_));
6666

6767
}
6868

webrtc-flutter-client/lib/pages/home/signaling.dart

Lines changed: 77 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@
2222
* SOFTWARE.
2323
*/
2424

25-
import 'dart:convert';
2625
import 'dart:async';
27-
import 'package:flutter_webrtc/webrtc.dart';
26+
import 'dart:convert';
2827

29-
import 'random_string.dart';
28+
import 'package:flutter_webrtc/webrtc.dart';
3029

3130
import '../../utils/device_info.dart';
32-
import '../../utils/websocket.dart';
3331
import '../../utils/turn.dart';
32+
import '../../utils/websocket.dart';
33+
import 'random_string.dart';
3434

3535
enum SignalingState {
3636
CallStateNew,
@@ -61,11 +61,11 @@ class Signaling {
6161
var _sessionId;
6262
var _host;
6363
var _port = 3000;
64-
// var _port = 8086;
6564
var _peerConnections = new Map<String, RTCPeerConnection>();
6665
var _dataChannels = new Map<String, RTCDataChannel>();
6766
var _remoteCandidates = [];
6867
var _turnCredential;
68+
String calleeId;
6969

7070
MediaStream _localStream;
7171
List<MediaStream> _remoteStreams;
@@ -157,28 +157,16 @@ class Signaling {
157157
});
158158
}
159159

160-
void onMessage(message) async {
161-
Map<String, dynamic> mapData = message;
162-
var data = mapData['data'];
160+
void onMessage(tag, message) async {
161+
JsonDecoder decoder = new JsonDecoder();
163162

164-
switch (mapData['type']) {
165-
case 'peers':
166-
{
167-
List<dynamic> peers = data;
168-
if (this.onPeersUpdate != null) {
169-
Map<String, dynamic> event = new Map<String, dynamic>();
170-
event['self'] = _selfId;
171-
event['peers'] = peers;
172-
this.onPeersUpdate(event);
173-
}
174-
}
175-
break;
176-
case 'offer':
163+
switch (tag) {
164+
case OFFER_EVENT:
177165
{
178-
var id = data['from'];
179-
var description = data['description'];
180-
var media = data['media'];
181-
var sessionId = data['session_id'];
166+
var id = 'caller';
167+
var description = message;
168+
var media = 'call';
169+
var sessionId = 'session_id';
182170
this._sessionId = sessionId;
183171

184172
if (this.onStateChange != null) {
@@ -198,10 +186,10 @@ class Signaling {
198186
}
199187
}
200188
break;
201-
case 'answer':
189+
case ANSWER_EVENT:
202190
{
203-
var id = data['from'];
204-
var description = data['description'];
191+
var id = 'callee';
192+
var description = message;
205193

206194
var pc = _peerConnections[id];
207195
if (pc != null) {
@@ -210,24 +198,42 @@ class Signaling {
210198
}
211199
}
212200
break;
213-
case 'candidate':
201+
case ICE_CANDIDATE_EVENT:
214202
{
215-
var id = data['from'];
216-
var candidateMap = data['candidate'];
217-
var pc = _peerConnections[id];
218-
RTCIceCandidate candidate = new RTCIceCandidate(
219-
candidateMap['candidate'],
220-
candidateMap['sdpMid'],
221-
candidateMap['sdpMLineIndex']);
222-
if (pc != null) {
223-
await pc.addCandidate(candidate);
224-
} else {
225-
_remoteCandidates.add(candidate);
203+
var id = 'caller';
204+
var candidateMap = message;
205+
if (candidateMap != null) {
206+
var pc = _peerConnections[id];
207+
RTCIceCandidate candidate = new RTCIceCandidate(
208+
candidateMap['candidate'],
209+
candidateMap['sdpMid'],
210+
candidateMap['sdpMLineIndex']);
211+
if (pc != null) {
212+
await pc.addCandidate(candidate);
213+
} else {
214+
_remoteCandidates.add(candidate);
215+
}
216+
}
217+
}
218+
break;
219+
220+
case 'peers':
221+
{
222+
Map<String, dynamic> mapData = decoder.convert(message);
223+
var data = mapData['data'];
224+
List<dynamic> peers = data;
225+
if (this.onPeersUpdate != null) {
226+
Map<String, dynamic> event = new Map<String, dynamic>();
227+
event['self'] = _selfId;
228+
event['peers'] = peers;
229+
this.onPeersUpdate(event);
226230
}
227231
}
228232
break;
229233
case 'leave':
230234
{
235+
Map<String, dynamic> mapData = decoder.convert(message);
236+
var data = mapData['data'];
231237
var id = data;
232238
var pc = _peerConnections.remove(id);
233239
_dataChannels.remove(id);
@@ -248,6 +254,8 @@ class Signaling {
248254
break;
249255
case 'bye':
250256
{
257+
Map<String, dynamic> mapData = decoder.convert(message);
258+
var data = mapData['data'];
251259
var to = data['to'];
252260
var sessionId = data['session_id'];
253261
print('bye: ' + sessionId);
@@ -286,7 +294,6 @@ class Signaling {
286294
}
287295

288296
void connect() async {
289-
// var url = 'https://$_host:$_port/ws';
290297
var url = 'http://$_host:$_port';
291298
_socket = SimpleWebSocket(url);
292299

@@ -324,10 +331,9 @@ class Signaling {
324331
});
325332
};
326333

327-
_socket.onMessage = (message) {
328-
print('Recivied data: ' + message);
329-
JsonDecoder decoder = new JsonDecoder();
330-
this.onMessage(decoder.convert(message));
334+
_socket.onMessage = (tag, message) {
335+
print('Recivied data: $tag - $message');
336+
this.onMessage(tag, message);
331337
};
332338

333339
_socket.onClose = (int code, String reason) {
@@ -346,7 +352,7 @@ class Signaling {
346352
'video': {
347353
'mandatory': {
348354
'minWidth':
349-
'640', // Provide your own width, height and frame rate here
355+
'640', // Provide your own width, height and frame rate here
350356
'minHeight': '480',
351357
'minFrameRate': '30',
352358
},
@@ -369,16 +375,12 @@ class Signaling {
369375
RTCPeerConnection pc = await createPeerConnection(_iceServers, _config);
370376
if (media != 'data') pc.addStream(_localStream);
371377
pc.onIceCandidate = (candidate) {
372-
_send('candidate', {
373-
'to': id,
374-
'from': _selfId,
375-
'candidate': {
376-
'sdpMLineIndex': candidate.sdpMlineIndex,
377-
'sdpMid': candidate.sdpMid,
378-
'candidate': candidate.candidate,
379-
},
380-
'session_id': this._sessionId,
381-
});
378+
final iceCandidate = {
379+
'sdpMLineIndex': candidate.sdpMlineIndex,
380+
'sdpMid': candidate.sdpMid,
381+
'candidate': candidate.candidate,
382+
};
383+
emitIceCandidateEvent(!(calleeId == null), iceCandidate);
382384
};
383385

384386
pc.onIceConnectionState = (state) {};
@@ -424,13 +426,9 @@ class Signaling {
424426
RTCSessionDescription s = await pc
425427
.createOffer(media == 'data' ? _dc_constraints : _constraints);
426428
pc.setLocalDescription(s);
427-
_send('offer', {
428-
'to': id,
429-
'from': _selfId,
430-
'description': {'sdp': s.sdp, 'type': s.type},
431-
'session_id': this._sessionId,
432-
'media': media,
433-
});
429+
430+
final description = {'sdp': s.sdp, 'type': s.type};
431+
emitOfferEvent(id, description);
434432
} catch (e) {
435433
print(e.toString());
436434
}
@@ -441,21 +439,27 @@ class Signaling {
441439
RTCSessionDescription s = await pc
442440
.createAnswer(media == 'data' ? _dc_constraints : _constraints);
443441
pc.setLocalDescription(s);
444-
_send('answer', {
445-
'to': id,
446-
'from': _selfId,
447-
'description': {'sdp': s.sdp, 'type': s.type},
448-
'session_id': this._sessionId,
449-
});
442+
443+
final description = {'sdp': s.sdp, 'type': s.type};
444+
emitAnswerEvent(description);
450445
} catch (e) {
451446
print(e.toString());
452447
}
453448
}
454449

455450
_send(event, data) {
456-
var request = new Map();
457-
request["type"] = event;
458-
request["data"] = data;
459-
_socket.send(_encoder.convert(request));
451+
_socket.send(event, data);
452+
}
453+
454+
emitOfferEvent(peerId, description) {
455+
_send(OFFER_EVENT, {'peerId': peerId, 'description': description});
456+
}
457+
458+
emitAnswerEvent(description) {
459+
_send(ANSWER_EVENT, {'description': description});
460+
}
461+
462+
emitIceCandidateEvent(isHost, candidate) {
463+
_send(ICE_CANDIDATE_EVENT, {'isHost': isHost, 'candidate': candidate});
460464
}
461465
}

0 commit comments

Comments
 (0)