Недействительное описание, отсутствует атрибут ice-ufrag на уровне 0 Ошибка.

Вопрос или проблема

Я пытался реализовать сессию sipjs.

initializeSip() {
const uri = UserAgent.makeURI('sip:[email protected]'); // Замените на ваш SIP URI
if (!uri) {
  throw new Error('Не удалось создать URI');
}

const userAgentOptions: UserAgentOptions = {
  uri,
  transportOptions: {
    server: 'ws://127.0.0.1:9090',
  },

  delegate: {
    onInvite: (invitation: Invitation) => {
      return this.handleIncomingCall(invitation);
    },
  },
};

this.userAgent = new UserAgent(userAgentOptions);

const registererOptions: RegistererOptions = {
  // Настройте registererOptions по мере необходимости
};
this.registerer = new Registerer(this.userAgent, registererOptions);

this.userAgent.start().then(() => {
  this.registerer.register();
})}

Вот как определяется принятие вызова в функции handleIncomingCall

const acceptCall = () => {
  const constraints = {
    audio: true,
    video: false,
  };

  navigator.mediaDevices
    .getUserMedia(constraints)
    .then((localStream) => {
      // Присоедините локальный поток к аудиокомпоненту, если это необходимо
      const localAudio = document.getElementById(
        'localAudio'
      ) as HTMLAudioElement;
      if (localAudio) {
        localAudio.srcObject = localStream;
      }
    })
    .catch((error) => {
      console.error('Ошибка получения медиа: ', error);
    });

  const peerConnectionConfig = {
    iceServers: [
      {
        urls: ['stun:stun.l.google.com:19302'],
        
      },
    ],
    iceTransportPolicy: 'all',
    bundlePolicy: 'balanced' as RTCBundlePolicy,
    rtcpMuxPolicy: 'require' as RTCRtcpMuxPolicy,
  };

  const options = {
    sessionDescriptionHandlerOptions: {
      constraints,
      peerConnectionConfiguration: peerConnectionConfig,
      peerConnectionOptions: {
        rtcConfiguration: peerConnectionConfig,
        iceGatheringTimeout: 5000,
      },
    },
  };

  // Принять вызов
  // Добавление слушателя для изменений состояния

  invitation
    .accept(options)
    .then(() => {
      console.log('Вызов успешно принят');
    })
    .catch((error) => {
      console.error('Не удалось принять вызов: ', error);
    });
};

Я настроил описание и передал его в качестве аргумента, принимая приглашение. Но даже после этого я получаю следующую ошибку. Я пробовал решить много способов, но ничего не работает. Есть ли ошибки в том, как я передал флаги ice?

sip.SessionDescriptionHandler | SessionDescriptionHandler.setDescription не удалась – InvalidAccessError: Неверное описание, отсутствует атрибут ice-ufrag на уровне 0

Ответ или решение

Ошибка, с которой вы столкнулись — "InvalidAccessError: Invalid description, no ice-ufrag attribute at level 0", означает, что полученное SDP (Session Description Protocol) описание не включает обязательные атрибуты, такие как ICE (Interactive Connectivity Establishment) ice-ufrag, которые необходимы для установления соединения WebRTC. Это может произойти по нескольким причинам, связанным с конфигурацией или использованием систем передачи данных.

Вот несколько шагов, которые помогут вам решить эту проблему:

  1. Проверьте настройки ICE-серверов: Убедитесь, что STUN или TURN серверы, которые вы используете, работают правильно. Попробуйте включить дополнительные серверы для тестирования. Код, который вы предоставили, включает только STUN сервер от Google.

    const peerConnectionConfig = {
     iceServers: [
       { urls: 'stun:stun.l.google.com:19302' },
       // Добавьте TURN сервер, если у вас есть
       {
         urls: 'turn:username@your.turn.server:3478',
         credential: 'your-turn-password',
       },
     ],
     iceTransportPolicy: 'all',
     bundlePolicy: 'balanced',
     rtcpMuxPolicy: 'require',
    };
  2. Проверьте создание SDP: Убедитесь, что SDP корректно формируется, когда вы принимаете вызов. Ошибка может указывать на то, что локальный клиент не генерирует ICE параметры. Убедитесь, что getUserMedia завершен до того, как вы принимаете вызов.

  3. Проверьте конфигурацию SessionDescriptionHandlerOptions: Убедитесь, что параметры, передаваемые в accept(options), корректны. Например, передача неправильных значений может вызвать ошибки.

  4. Дебаг SDP: Используйте браузерные инструменты разработчика, чтобы просмотреть SDP, который генерируется и отправляется. Вам нужно убедиться, что в нем есть такие строки, как a=ice-ufrag, a=ice-pwd, а также другие параметры ICE.

  5. Проверьте версии библиотек: Убедитесь, что вы используете актуальные версии библиотек SIP.js и других зависимостей. Обновление может помочь, если проблема была устранена в более поздней версии.

  6. Обработка состояния соединения: Убедитесь, что все события/состояния соединения обрабатываются корректно, и нет других ошибок, которые могут повлиять на вашу возможность принимать вызовы.

Вот пример общей структуры вашего кода с исправлениями и дополнениями:

initializeSip() {
  const uri = UserAgent.makeURI('sip:[email protected]');
  if (!uri) {
    throw new Error('Failed to create URI');
  }

  const userAgentOptions: UserAgentOptions = {
    uri,
    transportOptions: {
      server: 'ws://127.0.0.1:9090',
    },
    delegate: {
      onInvite: (invitation: Invitation) => {
        return this.handleIncomingCall(invitation);
      },
    },
  };

  this.userAgent = new UserAgent(userAgentOptions);
  const registererOptions: RegistererOptions = {};
  this.registerer = new Registerer(this.userAgent, registererOptions);

  this.userAgent.start().then(() => {
    this.registerer.register();
  });
}

handleIncomingCall(invitation: Invitation) {
  const acceptCall = () => {
    const constraints = { audio: true, video: false };

    navigator.mediaDevices
      .getUserMedia(constraints)
      .then((localStream) => {
        const localAudio = document.getElementById('localAudio') as HTMLAudioElement;
        if (localAudio) {
          localAudio.srcObject = localStream;
        }
      })
      .catch((error) => {
        console.error('Error getting user media:', error);
      });

    const peerConnectionConfig = {
      iceServers: [
        { urls: ['stun:stun.l.google.com:19302'] },
        // другие возможные STUN/TURN сервера
      ],
      iceTransportPolicy: 'all',
      bundlePolicy: 'balanced',
      rtcpMuxPolicy: 'require',
    };

    const options = {
      sessionDescriptionHandlerOptions: {
        constraints,
        peerConnectionConfiguration: peerConnectionConfig,
        peerConnectionOptions: {
          rtcConfiguration: peerConnectionConfig,
          iceGatheringTimeout: 5000,
        },
      },
    };

    invitation
      .accept(options)
      .then(() => {
        console.log('Call accepted successfully');
      })
      .catch((error) => {
        console.error('Failed to accept call:', error);
      });
  };

  acceptCall();
}

Следуя этим рекомендациям, вы сможете устранить возникшую ошибку и обеспечить успешное взаимодействие между SIP-сессиями через WebRTC.

Оцените материал
Добавить комментарий

Капча загружается...