Реализация звонков на сервере #15
8
.env
8
.env
@@ -8,9 +8,9 @@ PORT=3000 # Порт, на котором будет работать серве
|
||||
|
||||
# Список серверов CDN и SDU. Разделяются запятой если их несколько
|
||||
# Без пробелов
|
||||
CDN_SERVERS=http://10.211.55.2:7789
|
||||
CDN_SERVERS=http://192.168.6.82:7789
|
||||
#SDU - Server Delivery Updates
|
||||
SDU_SERVERS=http://10.211.55.2:7777
|
||||
SDU_SERVERS=http://192.168.6.82:7777
|
||||
|
||||
#Firebase Credentials
|
||||
FIREBASE_CREDENTIALS_PATH=serviceAccount.json
|
||||
@@ -21,3 +21,7 @@ BUFFER_CLEANUP_DAYS=7
|
||||
#SFU Сервера
|
||||
SFU_SERVERS=127.0.0.1:1001@SFU_TEST_SECRET
|
||||
|
||||
#TURN Сервера (должны поддерживать TCP и UDP протоколы)
|
||||
# Формат: host:port@username:password через запятую если их несколько, без пробелов
|
||||
TURN_SERVERS=192.168.6.82:3478@user:pass
|
||||
|
||||
|
||||
39
src/main/java/im/rosetta/executors/Executor28IceServers.java
Normal file
39
src/main/java/im/rosetta/executors/Executor28IceServers.java
Normal file
@@ -0,0 +1,39 @@
|
||||
package im.rosetta.executors;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import im.rosetta.Failures;
|
||||
import im.rosetta.client.tags.ECIAuthentificate;
|
||||
import im.rosetta.packet.Packet28IceServers;
|
||||
import im.rosetta.service.services.ForwardUnitService;
|
||||
import io.orprotocol.ProtocolException;
|
||||
import io.orprotocol.client.Client;
|
||||
import io.orprotocol.packet.PacketExecutor;
|
||||
|
||||
public class Executor28IceServers extends PacketExecutor<Packet28IceServers> {
|
||||
|
||||
private ForwardUnitService fus;
|
||||
|
||||
public Executor28IceServers(ForwardUnitService fus) {
|
||||
this.fus = fus;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPacketReceived(Packet28IceServers packet, Client client) throws Exception, ProtocolException {
|
||||
ECIAuthentificate eciAuthentificate = client.getTag(ECIAuthentificate.class);
|
||||
if(eciAuthentificate == null || !eciAuthentificate.hasAuthorized()) {
|
||||
/**
|
||||
* Если клиент не авторизован, то мы не будем обрабатывать его запрос на получение ICE серверов
|
||||
* и просто отключим его от сервера.
|
||||
*/
|
||||
client.disconnect(Failures.HANDSHAKE_NOT_COMPLETED);
|
||||
return;
|
||||
}
|
||||
/**
|
||||
* Берем TURN сервера и отправляем их клиенту
|
||||
*/
|
||||
packet.setIceServers(new ArrayList<>(this.fus.getTurnServers()));
|
||||
client.send(packet);
|
||||
}
|
||||
|
||||
}
|
||||
56
src/main/java/im/rosetta/packet/Packet28IceServers.java
Normal file
56
src/main/java/im/rosetta/packet/Packet28IceServers.java
Normal file
@@ -0,0 +1,56 @@
|
||||
package im.rosetta.packet;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import io.g365sfu.webrtc.RTCIceServer;
|
||||
import io.orprotocol.Stream;
|
||||
import io.orprotocol.packet.Packet;
|
||||
|
||||
public class Packet28IceServers extends Packet {
|
||||
|
||||
private List<RTCIceServer> iceServers;
|
||||
|
||||
@Override
|
||||
public void read(Stream stream) {
|
||||
int count = stream.readInt16();
|
||||
this.iceServers = new ArrayList<>();
|
||||
for (int i = 0; i < count; i++) {
|
||||
String url = stream.readString();
|
||||
String username = stream.readString();
|
||||
String credential = stream.readString();
|
||||
RTCIceServer iceServer = new RTCIceServer(url, username, credential);
|
||||
iceServers.add(iceServer);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Stream write() {
|
||||
Stream stream = new Stream();
|
||||
stream.writeInt16(this.packetId);
|
||||
stream.writeInt16(iceServers.size());
|
||||
for (RTCIceServer iceServer : iceServers) {
|
||||
stream.writeString(iceServer.getUrl());
|
||||
stream.writeString(iceServer.getUsername());
|
||||
stream.writeString(iceServer.getCredential());
|
||||
}
|
||||
return stream;
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
|
||||
* @return список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
|
||||
*/
|
||||
public List<RTCIceServer> getIceServers() {
|
||||
return iceServers;
|
||||
}
|
||||
|
||||
/**
|
||||
* Установить список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
|
||||
* @param iceServers список серверов ICE, которые могут быть использованы для обмена кандидатами между участниками звонка через сервер SFU.
|
||||
*/
|
||||
public void setIceServers(List<RTCIceServer> iceServers) {
|
||||
this.iceServers = iceServers;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user