Compartilhar via


Forçar o tráfego de chamada a ser colocado em proxy em seu servidor

Tutorial: Fazer proxy do tráfego de chamadas de Serviços de Comunicação do Azure em seus servidores.

Em determinadas situações, pode ser útil ter todo o tráfego do cliente com proxy para um servidor que você pode controlar. Quando o SDK está inicializando, você pode fornecer os detalhes dos servidores para os quais deseja rotear o tráfego. Depois de habilitado, todo o tráfego de mídia (compartilhamento de áudio/vídeo/tela) percorre os servidores TURN fornecidos em vez dos padrões de Serviços de Comunicação do Azure.

Neste tutorial, você aprenderá a:

  • Configurar um servidor TURN.
  • Configurar um servidor proxy de sinalização.

Pré-requisitos

Nenhum

O recurso de proxy está disponível em geral a partir da versão pública 1.25.1 do SDK de Chamadas dos Serviços de Comunicação do Azure. Certifique-se de usar esse SDK ou uma versão posterior do SDK ao tentar usar esse recurso. Este tutorial usa uma versão do SDK de Chamada 1.13.0-beta.1 em que este recurso ficou disponível pela primeira vez na versão prévia pública.

Tráfego de mídia de chamada de proxy

As seções a seguir descrevem como fazer uma chamada proxy ao tráfego de mídia.

O que é um servidor TURN?

Muitas vezes, estabelecer uma conexão de rede entre dois pares não é simples. Uma conexão direta pode não funcionar devido a:

  • Firewalls com regras rígidas.
  • Nós par atrás de uma rede privada.
  • Computadores em execução em um ambiente NAT (conversão de endereços de rede).

Para resolver esses problemas de conexão de rede, você pode usar um servidor que usa o protocolo TURN (passagem usando retransmissão NAT) para retransmitir o tráfego de rede. O STUN (utilitários de passagem de sessão para servidores NAT) e o TURN são os servidores de retransmissão.

Forneça os detalhes do servidor TURN para o SDK

Para fornecer os detalhes dos servidores TURN, você precisa passar detalhes de qual servidor TURN usar como parte do CallClientOptions enquanto inicializa o CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK da Web de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

import { CallClient } from '@azure/communication-calling'; 

const myTurn1 = {
    urls: [
        'turn:turn.azure.com:3478?transport=udp',
        'turn:turn1.azure.com:3478?transport=udp',
    ],
    username: 'turnserver1username',
    credential: 'turnserver1credentialorpass'
};

const myTurn2 = {
    urls: [
        'turn:20.202.255.255:3478',
        'turn:20.202.255.255:3478?transport=tcp',
    ],
    username: 'turnserver2username',
    credential: 'turnserver2credentialorpass'
};

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        turn: {
            iceServers: [
                myTurn1,
                myTurn2
            ]
        }
    }
});




// ...continue normally with your SDK setup and usage.

Importante

Se você tiver fornecido os detalhes do servidor TURN ao inicializar o CallClient, todo o tráfego de mídia fluirá exclusivamente por esses servidores TURN. Quaisquer outros candidatos ice que normalmente são gerados ao criar uma chamada não serão considerados ao tentar estabelecer conectividade entre pares. Isso significa que apenas candidatos relay são considerados. Para saber mais sobre diferentes tipos de candidatos Ice, confira RTCIceCandidate: propriedade de tipo.

Se o parâmetro de consulta ?transport não estiver presente como parte da URL TURN ou não for um dos valores udp, tcp ou tls, o comportamento padrão será UDP.

Se qualquer uma das URLs fornecidas for inválida ou não tiver um dos esquemas turn:, turns: ou stun:, a inicialização CallClient falhará e gerará erros adequadamente. As mensagens de erro geradas deverão ajudar você a solucionar problemas, caso você venha a enfrentá-los.

Para ver a referência de API para o objeto CallClientOptions e a propriedade networkConfiguration dentro dele, confira CallClientOptions.

Configurar um servidor TURN no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure. Para implantar um servidor TURN, use coturn. O Coturn é uma implementação gratuita e de software livre de um servidor TURN e STUN para VoIP e WebRTC.

Depois de configurar um servidor TURN, você pode testá-lo usando as instruções na página da Web WebRTC Trickle ICE.

Tráfego de sinalização de proxy

Para fornecer a URL de um servidor proxy, você precisa passá-la como parte de CallClientOptions ao inicializar CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK da Web de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

import { CallClient } from '@azure/communication-calling'; 

// While you are creating an instance of the CallClient (the entry point of the SDK):
const callClient = new CallClient({
    networkConfiguration: {
        proxy: {
            url: 'https://myproxyserver.com'
        }
    }
});

// ...continue normally with your SDK setup and usage.

Observação

Se a URL do proxy fornecida for uma URL inválida, a inicialização de CallClient falhará e gerará erros adequadamente. As mensagens de erro geradas ajudarão você a solucionar problemas, caso você venha a enfrentá-los.

Para ver a referência de API para o objeto CallClientOptions e a propriedade networkConfiguration dentro dele, confira CallClientOptions.

Configurando um middleware proxy de sinalização em Express.js

Você também pode criar um middleware proxy na configuração do servidor Express.js para que todas as URLs sejam redirecionadas por meio dele, usando o pacote npm http-proxy-middleware. A função createProxyMiddleware desse pacote deve abranger o que você precisa para uma configuração de proxy de redirecionamento simples. Aqui está um exemplo de uso dele com algumas configurações de opção que o SDK precisa para que todas as URLs funcionem conforme o esperado:

const proxyRouter = (req) => {
    // Your router function if you don't intend to set up a direct target

    // An example:
    if (!req.originalUrl && !req.url) {
        return '';
    }

    const incomingUrl = req.originalUrl || req.url;
    if (incomingUrl.includes('/proxy')) {
        return 'https://microsoft.com/forwarder/';
    }
    
    return incomingUrl;
}

const myProxyMiddleware = createProxyMiddleware({
    target: 'https://microsoft.com', // This will be ignored if a router function is provided, but createProxyMiddleware still requires this to be passed in (see its official docs on the npm page for the most recent changes)
    router: proxyRouter,
    changeOrigin: true,
    secure: false, // If you have proper SSL setup, set this accordingly
    followRedirects: true,
    ignorePath: true,
    ws: true,
    logLevel: 'debug'
});

// And finally pass in your proxy middleware to your express app depending on your URL/host setup
app.use('/proxy', myProxyMiddleware);

Dica

Se você estiver tendo problemas de SSL, confira o pacote cors.

Configurar um servidor proxy de sinalização no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure e implantar um servidor NGINX nela. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure.

Aqui está uma configuração NGINX que você pode usar como exemplo:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

O recurso de proxy não estará disponível para as ações de interoperabilidade de Identidades do Teams e de Serviços de Comunicação do Azure do Teams.

Tráfego de mídia de chamada de proxy

As seções a seguir descrevem como fazer uma chamada proxy ao tráfego de mídia.

O que é um servidor TURN?

Muitas vezes, estabelecer uma conexão de rede entre dois pares não é simples. Uma conexão direta pode não funcionar devido a:

  • Firewalls com regras rígidas.
  • Nós par atrás de uma rede privada.
  • Computadores em execução em um ambiente NAT (conversão de endereços de rede).

Para resolver esses problemas de conexão de rede, você pode usar um servidor que usa o protocolo TURN (passagem usando retransmissão NAT) para retransmitir o tráfego de rede. O STUN (utilitários de passagem de sessão para servidores NAT) e o TURN são os servidores de retransmissão.

Fornecer os detalhes do servidor TURN para o SDK

Para fornecer os detalhes dos servidores TURN, você precisa passar detalhes de qual servidor TURN usar como parte do CallClientOptions enquanto inicializa o CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do iOS de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

let callClientOptions = new CallClientOptions()
let callNetworkOptions = new CallNetworkOptions()

let iceServer = IceServer()
iceServer.urls = ["turn:20.202.255.255"]
iceServer.udpPort = 3478
iceServer.realm = "turn.azure.com"
iceServer.username = "turnserver1username"
iceServer.password = "turnserver1password"

callNetworkOptions.iceServers = [iceServer]

// Supply the network options when creating an instance of the CallClient
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions);

Importante

Se você tiver fornecido os detalhes do servidor TURN ao inicializar o CallClient, todo o tráfego de mídia fluirá exclusivamente por esses servidores TURN. Quaisquer outros candidatos ice que normalmente são gerados ao criar uma chamada não serão considerados ao tentar estabelecer conectividade entre pares. Isso significa que apenas candidatos relay são considerados. Para saber mais sobre diferentes tipos de candidatos Ice, confira RTCIceCandidate: propriedade de tipo.

Atualmente, o SDK do Android dá suporte apenas a um único endereço IPv4 e protocolo UDP para proxy de mídia. Se uma porta UDP não for fornecida, a padrão 3478 será usada. O SDK gerará um Failed to set media proxyerro de chamadasetIceServer com entrada sem suporte da seguinte maneira:

  • Mais de um servidor ICE é fornecido na lista IceServers.
  • Mais de uma URL é fornecida na lista de URLs do IceServer.
  • A URL IPv6 é fornecida na lista de URLs.
  • Somente a porta TCP é fornecida.
  • Informações de realm não são fornecidas.

Se as informações do servidor ICE fornecidas forem inválidas, a inicialização do CallClient falhará e gerará erros adequadamente.

Configurar um servidor TURN no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure. Para implantar um servidor TURN, use coturn. O Coturn é uma implementação gratuita e de software livre de um servidor TURN e STUN para VoIP e WebRTC.

Depois de configurar um servidor TURN, você pode testá-lo usando as instruções na página da Web WebRTC Trickle ICE.

Tráfego de sinalização de proxy

Para fornecer a URL de um servidor proxy, você precisa passá-la como parte CallClientOptions da sua propriedade Network ao inicializar CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do iOS de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

let callClientOptions = CallClientOptions()
let callNetworkOptions = CallNetworkOptions()
callNetworkOptions.proxyUrl = proxyUrl
callClientOptions.network = callNetworkOptions
self.callClient = CallClient(options: callClientOptions)

// ...continue normally with your SDK setup and usage.

Configurar um servidor proxy de sinalização no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure e implantar um servidor NGINX nela. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure.

Aqui está uma configuração NGINX que você pode usar como exemplo:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

O recurso de proxy não estará disponível para as ações de interoperabilidade de Identidades do Teams e de Serviços de Comunicação do Azure do Teams.

Tráfego de mídia de chamada de proxy

As seções a seguir descrevem como fazer uma chamada proxy ao tráfego de mídia.

O que é um servidor TURN?

Muitas vezes, estabelecer uma conexão de rede entre dois pares não é simples. Uma conexão direta pode não funcionar devido a:

  • Firewalls com regras rígidas.
  • Nós par atrás de uma rede privada.
  • Computadores em execução em um ambiente NAT (conversão de endereços de rede).

Para resolver esses problemas de conexão de rede, você pode usar um servidor que usa o protocolo TURN (passagem usando retransmissão NAT) para retransmitir o tráfego de rede. O STUN (utilitários de passagem de sessão para servidores NAT) e o TURN são os servidores de retransmissão.

Fornecer os detalhes do servidor TURN para o SDK

Para fornecer os detalhes dos servidores TURN, você precisa passar detalhes de qual servidor TURN usar como parte do CallClientOptions enquanto inicializa o CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do Android de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.setUrls(Arrays.asList("turn:20.202.255.255"));
iceServer.setUdpPort(3478);
iceServer.setRealm("turn.azure.com"); // Realm information is required.
iceServer.setUsername("turnserver1username");
iceServer.setPassword("turnserver1password");

callNetworkOptions.setIceServers(Arrays.asList(iceServer));

// Supply the network options when creating an instance of the CallClient
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

Importante

Se você tiver fornecido os detalhes do servidor TURN ao inicializar o CallClient, todo o tráfego de mídia fluirá exclusivamente por esses servidores TURN. Quaisquer outros candidatos ice que normalmente são gerados ao criar uma chamada não serão considerados ao tentar estabelecer conectividade entre pares. Isso significa que apenas candidatos relay são considerados. Para saber mais sobre diferentes tipos de candidatos Ice, confira RTCIceCandidate: propriedade de tipo.

Atualmente, o SDK do Android dá suporte apenas a um único endereço IPv4 e protocolo UDP para proxy de mídia. Se uma porta UDP não for fornecida, a padrão 3478 será usada. O SDK gerará um Failed to set media proxyerro de chamadasetIceServer com entrada sem suporte da seguinte maneira:

  • Mais de um servidor ICE é fornecido na lista IceServers.
  • Mais de uma URL é fornecida na lista de URLs do IceServer.
  • A URL IPv6 é fornecida na lista de URLs.
  • Somente a porta TCP é fornecida.
  • Informações de realm não são fornecidas.

Se as informações do servidor ICE fornecidas forem inválidas, a inicialização do CallClient falhará e gerará erros adequadamente.

Configurar um servidor TURN no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure. Para implantar um servidor TURN, use coturn. O Coturn é uma implementação gratuita e de software livre de um servidor TURN e STUN para VoIP e WebRTC.

Depois de configurar um servidor TURN, você pode testá-lo usando as instruções na página da Web WebRTC Trickle ICE.

Tráfego de sinalização de proxy

Para fornecer a URL de um servidor proxy, você precisa passá-la como parte CallClientOptions da sua propriedade Network ao inicializar CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do Android de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.setProxyUrl("https://myproxyserver.com");
callClientOptions.setNetwork(callNetworkOptions);
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Configurar um servidor proxy de sinalização no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure e implantar um servidor NGINX nela. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure.

Aqui está uma configuração NGINX que você pode usar como exemplo:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}

O recurso de proxy não estará disponível para as ações de interoperabilidade de Identidades do Teams e de Serviços de Comunicação do Azure do Teams.

Tráfego de mídia de chamada de proxy

As seções a seguir descrevem como fazer uma chamada proxy ao tráfego de mídia.

O que é um servidor TURN?

Muitas vezes, estabelecer uma conexão de rede entre dois pares não é simples. Uma conexão direta pode não funcionar devido a:

  • Firewalls com regras rígidas.
  • Nós par atrás de uma rede privada.
  • Computadores em execução em um ambiente NAT (conversão de endereços de rede).

Para resolver esses problemas de conexão de rede, você pode usar um servidor que usa o protocolo TURN (passagem usando retransmissão NAT) para retransmitir o tráfego de rede. O STUN (utilitários de passagem de sessão para servidores NAT) e o TURN são os servidores de retransmissão.

Fornecer os detalhes do servidor TURN para o SDK

Para fornecer os detalhes dos servidores TURN, você precisa passar detalhes de qual servidor TURN usar como parte do CallClientOptions enquanto inicializa o CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do Windows de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();

IceServer iceServer = new IceServer();
iceServer.Uris = new List<Uri>() { new Uri("turn:20.202.255.255") }.AsReadOnly();
iceServer.UdpPort = 3478;
iceServer.Realm = "turn.azure.com";
iceServer.Username = "turnserver1username";
iceServer.Password = "turnserver1password";

callNetworkOptions.IceServers = new List<IceServer>() { iceServer }.AsReadOnly();

// Supply the network options when creating an instance of the CallClient
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

Importante

Se você tiver fornecido os detalhes do servidor TURN ao inicializar o CallClient, todo o tráfego de mídia fluirá exclusivamente por esses servidores TURN. Quaisquer outros candidatos ice que normalmente são gerados ao criar uma chamada não serão considerados ao tentar estabelecer conectividade entre pares. Isso significa que apenas candidatos relay são considerados. Para saber mais sobre diferentes tipos de candidatos Ice, confira RTCIceCandidate: propriedade de tipo.

Atualmente, o SDK do Android dá suporte apenas a um único endereço IPv4 e protocolo UDP para proxy de mídia. Se uma porta UDP não for fornecida, a padrão 3478 será usada. O SDK gerará um Failed to set media proxyerro de chamadasetIceServer com entrada sem suporte da seguinte maneira:

  • Mais de um servidor ICE é fornecido na lista IceServers.
  • Mais de uma URL é fornecida na lista de URLs do IceServer.
  • A URL IPv6 é fornecida na lista de URLs.
  • Somente a porta TCP é fornecida.
  • Informações de realm não são fornecidas.

Se as informações do servidor ICE fornecidas forem inválidas, a inicialização do CallClient falhará e gerará erros adequadamente.

Configurar um servidor TURN no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure. Para implantar um servidor TURN, use coturn. O Coturn é uma implementação gratuita e de software livre de um servidor TURN e STUN para VoIP e WebRTC.

Depois de configurar um servidor TURN, você pode testá-lo usando as instruções na página da Web WebRTC Trickle ICE.

Tráfego de sinalização de proxy

Para fornecer a URL de um servidor proxy, você precisa passá-la como parte CallClientOptions da sua propriedade Network ao inicializar CallClient. Para obter mais detalhes sobre como configurar uma chamada, confira SDK do Windows de Serviços de Comunicação do Azure para o ver o guia de início rápido sobre como configurar voz e vídeo.

CallClientOptions callClientOptions = new CallClientOptions();
CallNetworkOptions callNetworkOptions = new CallNetworkOptions();
callNetworkOptions.ProxyUri = new Uri("https://myproxyserver.com");
callClientOptions.Network = callNetworkOptions;
CallClient callClient = new CallClient(callClientOptions);

// ...continue normally with your SDK setup and usage.

Configurar um servidor proxy de sinalização no Azure

Você pode criar uma máquina virtual do Linux no portal do Azure e implantar um servidor NGINX nela. Para obter mais informações, consulte Início Rápido: criar uma máquina virtual Linux no portal do Azure.

Aqui está uma configuração NGINX que você pode usar como exemplo:

events {
    multi_accept       on;
    worker_connections 65535;
}
http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    map $request_method $access_control_header {
        OPTIONS '*';
    }
    server {
        listen <port_you_want_listen_on> ssl;
        ssl_certificate     <path_to_your_ssl_cert>;
        ssl_certificate_key <path_to_your_ssl_key>;
        location ~* ^/(.*?\.(com|net)(?::[\d]+)?)/(.*)$ {
            if ($request_method = 'OPTIONS') {
                add_header Access-Control-Allow-Origin '*' always;
                add_header Access-Control-Allow-Credentials 'true' always;
                add_header Access-Control-Allow-Headers '*' always;
                add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
                add_header Access-Control-Max-Age 1728000;
                add_header Content-Type 'text/plain';
                add_header Content-Length 0;
                return 204;
            }
            resolver 1.1.1.1;
            set $ups_host $1;
            set $r_uri $3;
            rewrite ^/.*$ /$r_uri break;
            proxy_set_header Host $ups_host;
            proxy_ssl_server_name on;
            proxy_ssl_protocols TLSv1.2;
            proxy_ssl_ciphers DEFAULT;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_pass_header Authorization;
            proxy_pass_request_headers on;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Proxy "";
            proxy_set_header Access-Control-Allow-Origin $access_control_header;
            proxy_pass https://$ups_host;
            proxy_redirect https://$ups_host https://$host/$ups_host;
            proxy_intercept_errors on;
            error_page 301 302 307 = @process_redirect;
            error_page 400 405 = @process_error_response;
        }
        location @process_redirect {
            set $saved_redirect_location '$upstream_http_location';
            resolver 1.1.1.1;
            proxy_pass $saved_redirect_location;
            add_header X-DBUG-MSG "301" always;
        }
        location @process_error_response {
            add_header Access-Control-Allow-Origin * always;
        }
    }
}