Compartir vía


Forzar la llamada al tráfico para que se redirija mediante proxy a través de su propio servidor

En este tutorial, obtendrá información sobre cómo redirigir mediante proxy el tráfico de llamadas de Azure Communication Services a través de sus propios servidores.

En determinadas situaciones, puede resultar útil tener todo el tráfico de cliente redirigido mediante proxy a un servidor que pueda controlar. Cuando se inicializa el SDK, puede proporcionar los detalles de los servidores a los que desea que el tráfico se enrute. Una vez habilitado, todo el tráfico multimedia (audio, vídeo o uso compartido de pantalla) viaja por los servidores TURN proporcionados en lugar de los valores predeterminados de Azure Communication Services.

En este tutorial, aprenderá a:

  • Configure un servidor TURN.
  • Configure un servidor proxy de señalización.

Requisitos previos

Ninguno

La característica de proxy está disponible con carácter general a partir de la versión pública 1.25.1 del SDK de llamadas de Azure Communication Services. Asegúrese de usar este SDK o una versión posterior del SDK al intentar usar esta característica. En este tutorial se usa una versión del SDK de llamadas 1.13.0-beta.1 donde esta característica se puso primero a disposición en versión preliminar pública.

Proxy que llama a tráfico multimedia

Las siguientes secciones describen cómo hacer llamadas de proxy al tráfico de elementos multimedia.

¿Qué es un servidor TURN?

Muchas veces, establecer una conexión de red entre dos sistemas del mismo nivel no es sencillo. Es posible que una conexión directa no funcione debido a:

  • Firewalls con reglas estrictas.
  • Compañeros detrás de una red privada.
  • Equipos que se ejecutan en un entorno de traducción de direcciones de red (NAT).

Para resolver estos problemas de conexión de red, puede usar un servidor que use el protocolo Traversal Using Relay NAT (TURN) para retransmitir el tráfico de red. Los servidores Session Traversal Utilities for NAT (STUN) y TURN son los servidores de retransmisión.

Proporcione los detalles de su servidor TURN al SDK

Para proporcionar los detalles de los servidores TURN, debe pasar los detalles del servidor TURN que se va a usar como parte de CallClientOptions al inicializar CallClient. Para más información sobre cómo configurar una llamada, consulte SDK web de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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

Si proporcionó los detalles de su servidor TURN mientras inicializaba CallClient, todo el tráfico de elementos multimedia fluye exclusivamente a través de estos servidores TURN. Cualquier otro candidato ICE que se genere normalmente al crear una llamada no se tendrá en cuenta al intentar establecer la conectividad entre nodos del mismo nivel. Eso significa que solo se tienen en cuenta relay candidatos. Para más información sobre los distintos tipos de candidatos de Ice, consulte Propiedad RTCIceCandidate: type.

Si el parámetro de consulta ?transport no está presente como parte de la URL de TURN o no es uno de los valores udp, tcp o tls, el comportamiento predeterminado es UDP.

Si alguna de las URL proporcionadas no es válida o no tiene uno de los esquemas turn:, turns: o stun:, la inicialización de CallClient falla y genera los errores correspondientes. Los mensajes de error que se muestran deberían ayudarle a solucionar los problemas que se presenten.

Para ver la referencia de la API para el objeto CallClientOptions, y la propiedad networkConfiguration dentro de él, consulte CallClientOptions.

Configuración de un servidor TURN en Azure

Puede crear una máquina virtual Linux en Azure Portal. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal. Para implementar un servidor TURN, use coturn. Coturn es una implementación gratuita y de código abierto de un servidor TURN y STUN para VoIP y WebRTC.

Después de configurar un servidor TURN, puede probarlo usando las instrucciones de la página web de WebRTC Trickle ICE.

Proxy que señala tráfico

Para proporcionar la dirección URL de un servidor proxy, debe pasarla como parte de CallClientOptions al inicializar CallClient. Para más información sobre cómo configurar una llamada, consulte SDK web de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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.

Nota:

Si la dirección URL del proxy proporcionada es una dirección URL no válida, la inicialización de CallClient no tendrá éxito y se producirán errores como consecuencia de ello. Los mensajes de error que se muestran le ayudarán a solucionar los problemas que se le presenten.

Para ver la referencia de la API para el objeto CallClientOptions, y la propiedad networkConfiguration dentro de él, consulte CallClientOptions.

Configuración de un middleware de proxy de señalización en Express.js

Con el paquete npm http-proxy-middleware, también puede crear un middleware de proxy en la configuración del servidor Express.js para que todas las direcciones URL se redirijan a través de él. La función createProxyMiddleware de ese paquete debe abarcar lo que necesita para una configuración sencilla del proxy de redireccionamiento. Este es un ejemplo de uso con algunas opciones de configuración que el SDK necesita para que todas nuestras direcciones URL funcionen según lo previsto:

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);

Sugerencia

Si tiene problemas con SSL, consulte el paquete de cors.

Configuración de un servidor proxy de señalización en Azure

Puede crear una máquina virtual Linux en Azure Portal e implementar un servidor NGINX en ella. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal.

Esta es una configuración de NGINX que puede usar como ejemplo:

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;
        }
    }
}

La característica de proxy no estará disponible para las identidades de Teams y las acciones de interoperabilidad de Teams de Azure Communication Services.

Proxy que llama a tráfico multimedia

Las siguientes secciones describen cómo hacer llamadas de proxy al tráfico de elementos multimedia.

¿Qué es un servidor TURN?

Muchas veces, establecer una conexión de red entre dos sistemas del mismo nivel no es sencillo. Es posible que una conexión directa no funcione debido a:

  • Firewalls con reglas estrictas.
  • Compañeros detrás de una red privada.
  • Equipos que se ejecutan en un entorno de traducción de direcciones de red (NAT).

Para resolver estos problemas de conexión de red, puede usar un servidor que use el protocolo Traversal Using Relay NAT (TURN) para retransmitir el tráfico de red. Los servidores Session Traversal Utilities for NAT (STUN) y TURN son los servidores de retransmisión.

Proporcione los detalles de su servidor TURN con el SDK

Para proporcionar los detalles de los servidores TURN, debe pasar los detalles del servidor TURN que se va a usar como parte de CallClientOptions al inicializar CallClient. Para más información sobre cómo configurar una llamada, consulte SDK de iOS de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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

Si proporcionó los detalles de su servidor TURN mientras inicializaba CallClient, todo el tráfico de elementos multimedia fluye exclusivamente a través de estos servidores TURN. Cualquier otro candidato ICE que se genere normalmente al crear una llamada no se tendrá en cuenta al intentar establecer la conectividad entre nodos del mismo nivel. Eso significa que solo se tienen en cuenta relay candidatos. Para más información sobre los distintos tipos de candidatos de Ice, consulte Propiedad RTCIceCandidate: type.

Actualmente, Android SDK solo es compatible con una única dirección IPv4 y el protocolo UDP para el proxy de elementos multimedia. Si no se proporciona un puerto UDP, se usará el puerto UDP 3478 de manera predeterminada. El SDK producirá un error Failed to set media proxy al llamar a setIceServer con entrada no admitida de la siguiente manera:

  • Se proporciona más de un servidor ICE en la lista IceServers.
  • Se proporciona más de una url la lista de url IceServer.
  • La url IPv6 se proporciona en la lista de url.
  • Solo se proporciona el puerto TCP.
  • No se proporciona información del dominio kerberos.

Si la información del servidor ICE proporcionada no es válida, la inicialización CallClient da error y se producirán errores como consecuencia de ello.

Configuración de un servidor TURN en Azure

Puede crear una máquina virtual Linux en Azure Portal. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal. Para implementar un servidor TURN, use coturn. Coturn es una implementación gratuita y de código abierto de un servidor TURN y STUN para VoIP y WebRTC.

Después de configurar un servidor TURN, puede probarlo usando las instrucciones de la página web de WebRTC Trickle ICE.

Proxy que señala tráfico

Para proporcionar la URL de un servidor proxy, debe pasarla como parte de CallClientOptions a través de su propiedad Network mientras inicializa CallClient. Para más información sobre cómo configurar una llamada, consulte SDK de iOS de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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.

Configuración de un servidor proxy de señalización en Azure

Puede crear una máquina virtual Linux en Azure Portal e implementar un servidor NGINX en ella. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal.

Esta es una configuración de NGINX que puede usar como ejemplo:

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;
        }
    }
}

La característica de proxy no estará disponible para las identidades de Teams y las acciones de interoperabilidad de Teams de Azure Communication Services.

Proxy que llama a tráfico multimedia

Las siguientes secciones describen cómo hacer llamadas de proxy al tráfico de elementos multimedia.

¿Qué es un servidor TURN?

Muchas veces, establecer una conexión de red entre dos sistemas del mismo nivel no es sencillo. Es posible que una conexión directa no funcione debido a:

  • Firewalls con reglas estrictas.
  • Compañeros detrás de una red privada.
  • Equipos que se ejecutan en un entorno de traducción de direcciones de red (NAT).

Para resolver estos problemas de conexión de red, puede usar un servidor que use el protocolo Traversal Using Relay NAT (TURN) para retransmitir el tráfico de red. Los servidores Session Traversal Utilities for NAT (STUN) y TURN son los servidores de retransmisión.

Proporcione los detalles de su servidor TURN con el SDK

Para proporcionar los detalles de los servidores TURN, debe pasar los detalles del servidor TURN que se va a usar como parte de CallClientOptions al inicializar CallClient. Para más información sobre cómo configurar una llamada, consulte Android SDK de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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

Si proporcionó los detalles de su servidor TURN mientras inicializaba CallClient, todo el tráfico de elementos multimedia fluye exclusivamente a través de estos servidores TURN. Cualquier otro candidato ICE que se genere normalmente al crear una llamada no se tendrá en cuenta al intentar establecer la conectividad entre nodos del mismo nivel. Eso significa que solo se tienen en cuenta relay candidatos. Para más información sobre los distintos tipos de candidatos de Ice, consulte Propiedad RTCIceCandidate: type.

Actualmente, Android SDK solo es compatible con una única dirección IPv4 y el protocolo UDP para el proxy de elementos multimedia. Si no se proporciona un puerto UDP, se usará el puerto UDP 3478 de manera predeterminada. El SDK producirá un error Failed to set media proxy al llamar a setIceServer con entrada no admitida de la siguiente manera:

  • Se proporciona más de un servidor ICE en la lista IceServers.
  • Se proporciona más de una url la lista de url IceServer.
  • La url IPv6 se proporciona en la lista de url.
  • Solo se proporciona el puerto TCP.
  • No se proporciona información del dominio kerberos.

Si la información del servidor ICE proporcionada no es válida, la inicialización CallClient da error y se producirán errores como consecuencia de ello.

Configuración de un servidor TURN en Azure

Puede crear una máquina virtual Linux en Azure Portal. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal. Para implementar un servidor TURN, use coturn. Coturn es una implementación gratuita y de código abierto de un servidor TURN y STUN para VoIP y WebRTC.

Después de configurar un servidor TURN, puede probarlo usando las instrucciones de la página web de WebRTC Trickle ICE.

Proxy que señala tráfico

Para proporcionar la URL de un servidor proxy, debe pasarla como parte de CallClientOptions a través de su propiedad Network mientras inicializa CallClient. Para más información sobre cómo configurar una llamada, consulte Android SDK de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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.

Configuración de un servidor proxy de señalización en Azure

Puede crear una máquina virtual Linux en Azure Portal e implementar un servidor NGINX en ella. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal.

Esta es una configuración de NGINX que puede usar como ejemplo:

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;
        }
    }
}

La característica de proxy no estará disponible para las identidades de Teams y las acciones de interoperabilidad de Teams de Azure Communication Services.

Proxy que llama a tráfico multimedia

Las siguientes secciones describen cómo hacer llamadas de proxy al tráfico de elementos multimedia.

¿Qué es un servidor TURN?

Muchas veces, establecer una conexión de red entre dos sistemas del mismo nivel no es sencillo. Es posible que una conexión directa no funcione debido a:

  • Firewalls con reglas estrictas.
  • Compañeros detrás de una red privada.
  • Equipos que se ejecutan en un entorno de traducción de direcciones de red (NAT).

Para resolver estos problemas de conexión de red, puede usar un servidor que use el protocolo Traversal Using Relay NAT (TURN) para retransmitir el tráfico de red. Los servidores Session Traversal Utilities for NAT (STUN) y TURN son los servidores de retransmisión.

Proporcione los detalles de su servidor TURN con el SDK

Para proporcionar los detalles de los servidores TURN, debe pasar los detalles del servidor TURN que se va a usar como parte de CallClientOptions al inicializar CallClient. Para más información sobre cómo configurar una llamada, consulte Microsoft Windows SDK de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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

Si proporcionó los detalles de su servidor TURN mientras inicializaba CallClient, todo el tráfico de elementos multimedia fluye exclusivamente a través de estos servidores TURN. Cualquier otro candidato ICE que se genere normalmente al crear una llamada no se tendrá en cuenta al intentar establecer la conectividad entre nodos del mismo nivel. Eso significa que solo se tienen en cuenta relay candidatos. Para más información sobre los distintos tipos de candidatos de Ice, consulte Propiedad RTCIceCandidate: type.

Actualmente, Android SDK solo es compatible con una única dirección IPv4 y el protocolo UDP para el proxy de elementos multimedia. Si no se proporciona un puerto UDP, se usará el puerto UDP 3478 de manera predeterminada. El SDK producirá un error Failed to set media proxy al llamar a setIceServer con entrada no admitida de la siguiente manera:

  • Se proporciona más de un servidor ICE en la lista IceServers.
  • Se proporciona más de una url la lista de url IceServer.
  • La url IPv6 se proporciona en la lista de url.
  • Solo se proporciona el puerto TCP.
  • No se proporciona información del dominio kerberos.

Si la información del servidor ICE proporcionada no es válida, la inicialización CallClient da error y se producirán errores como consecuencia de ello.

Configuración de un servidor TURN en Azure

Puede crear una máquina virtual Linux en Azure Portal. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal. Para implementar un servidor TURN, use coturn. Coturn es una implementación gratuita y de código abierto de un servidor TURN y STUN para VoIP y WebRTC.

Después de configurar un servidor TURN, puede probarlo usando las instrucciones de la página web de WebRTC Trickle ICE.

Proxy que señala tráfico

Para proporcionar la URL de un servidor proxy, debe pasarla como parte de CallClientOptions a través de su propiedad Network mientras inicializa CallClient. Para más información sobre cómo configurar una llamada, consulte Microsoft Windows SDK de Azure Communication Services para el inicio rápido sobre cómo configurar voz y 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.

Configuración de un servidor proxy de señalización en Azure

Puede crear una máquina virtual Linux en Azure Portal e implementar un servidor NGINX en ella. Para obtener más información, vea Inicio rápido: Creación de una máquina virtual Linux en Azure Portal.

Esta es una configuración de NGINX que puede usar como ejemplo:

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;
        }
    }
}