2014-11-09 6 views
2

При попытке установить и канал данных WebRTC с использованием API Objective C я не могу получить какие-либо из обратных вызовов RTCDataChannelDelegate для фактического захвата. Кажется, что все хорошо подходит для однорангового соединения, но я добираюсь до точки, где поток одноранговых соединений был успешно добавлен.Канал данных WebRTC не подключен или вызываемые обратные вызовы

Мои шаги грубо:

Создать предложение:

_channel = [_connection createDataChannelWithLabel: @"offer-1" 
               config: [[RTCDataChannelInit alloc] init]]; 
    _channel.delegate = _stateMachine; 
    [_connection createOfferWithDelegate: _stateMachine constraints: [[RTCMediaConstraints alloc] init]]; 

СДП клиента 1 посылается клиенту 2, где создается ответ:

[_connection setRemoteDescriptionWithDelegate: _stateMachine sessionDescription: [[RTCSessionDescription alloc] initWithType: @"offer" sdp: sdp]]; 
    [_connection createAnswerWithDelegate: _stateMachine constraints: [[RTCMediaConstraints alloc] init]]; 

СДП клиента 2 отправляется обратно клиенту 1:

[_connection setRemoteDescriptionWithDelegate: _stateMachine sessionDescription: [[RTCSessionDescription alloc] initWithType: @"answer" sdp: sdp]]; 

После этого я получаю поток мультимедиа, добавляемый с устойчивой сигнализацией. Раньше, во время моего POC, мне удалось получить обратные вызовы канала данных, но я не совсем уверен, что мне здесь не хватает.

Вот равноправные настройки соединения:

RTCPeerConnectionFactory* _cfactory = [[RTCPeerConnectionFactory alloc] init]; 

    NSArray* mandatory = @[ 
          [[RTCPair alloc] initWithKey:@"DtlsSrtpKeyAgreement" value:@"true"], 
          [[RTCPair alloc] initWithKey:@"internalSctpDataChannels" value:@"true"], 
          ]; 

    RTCMediaConstraints* pcConstraints = [[RTCMediaConstraints alloc] initWithMandatoryConstraints: mandatory 
                       optionalConstraints: nil]; 
    RTCICEServer* server = [[RTCICEServer alloc] initWithURI:[NSURL URLWithString:@"stun:stun.l.google.com:19302"] 
                username: @"" 
                password: @""]; 
    NSArray* servers = @[server]; 

    _connection = [_cfactory peerConnectionWithICEServers: servers 
               constraints: pcConstraints 
               delegate: _stateMachine]; 

Мое состояние машина реализует следующую со всеми методами настоящими:

@protocol DelegateAggregator 
    <RTCPeerConnectionDelegate, RTCSessionDescriptionDelegate, RTCDataChannelDelegate, RTCStatsDelegate> 
@end 

Есть ли что-то я здесь отсутствую? Кажется, канал устанавливается и добавляется медиа-поток (мне нужны только данные), но без каких-либо обратных вызовов. Могу ли я активировать больше записей? Любая помощь приветствуется!

ответ

2

Так получилось, что ключевая ошибка в том, как я структурировал свой ответ, была в обратном вызове, чтобы инициировать отправку SDP клиенту 1. Я ждал, когда сеанс создаст обратный вызов для делегата, чтобы отправить мой ответ обратно клиенту 1. Как выясняется, это слишком рано, и сбор кандидатов еще не завершен. Я установки обратных вызовов в делегатом прикрепить к которому выглядел так:

//WRONG 
_tunnel.stateMachine.peerConnectionSessionCallback = ^(RTCPeerConnection* peerConnection, RTCSessionDescription* sdp, NSError* error) { 
     SessionAnswer* answer = [[SessionAnswer alloc] init]; 
     answer.sdp = [sdp description]; 

     [queueManager sendEvent: answer]; 
    }; 

Правильный путь ждать этого события:

_tunnel.stateMachine.peerConnectionICEGatheringCallback = ^(RTCPeerConnection* peerConnection, RTCICEGatheringState newState) { 
     if (newState == RTCICEGatheringComplete) { 
      SessionAnswer* answer = [[SessionAnswer alloc] init]; 
      answer.sdp = [[peerConnection localDescription] description]; 

      [queueManager sendEvent: answer]; 
     } 
    }; 

После того, как я структурировал это таким образом, обратные вызовы канала данных как ожидалось.

1

DtlsSrtpKeyAgreement и internalSctpDataChannels необходимо ввести в необязательные ограничения вместо обязательного.

Чтобы настроить канал передачи данных, я поместил RtpDataChannels в факультативный вариант.

+0

Похоже, я получаю тот же результат, независимо от того, находятся они в факультативном или требуемом. Я обновил мою версию webrtc до 7700 и создаю https://github.com/pristineio/webrtc-build-scripts, который должен компилироваться с помощью макроса HAVE_SCTP. Есть ли способ, чтобы я включил больше протоколов, чтобы добраться до сути? – Zack

+0

Получаю ответ от моего клиента-клиента, и я получаю только следующие строки: 2014-11-14 22: 47: 49.908 Удаленное [52330: 4141871] изменение состояния peerConnection. , 0 2014-11-14 22: 47: 49.908 Удаленно [52330: 4141871] задайте описание сеанса с ошибкой. , (null) 2014-11-14 22:47:51.508 Удалено [52330: 4141871] смена льда. , 2 – Zack

+1

Если вы создаете WebRTC с включенной отладкой, вы должны получить намного больше отладочного вывода – iain