Канал данных WebRTC не подключается или обратные вызовы не вызываются

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

Мои шаги примерно:

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

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

SDP клиента 1 отправляется клиенту 2, где создается ответ:

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

SDP клиента 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

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


person Zack    schedule 09.11.2014    source источник


Ответы (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];
        }
    };

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

person Zack    schedule 16.11.2014

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

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

person iain    schedule 13.11.2014
comment
Похоже, я получаю один и тот же результат, независимо от того, являются ли они необязательными или обязательными. Я обновил свою версию webrtc до 7700 и строю с помощью github.com/pristineio/webrtc-build. -scripts, которые должны компилироваться с помощью макроса HAVE_SCTP. Есть ли способ включить больше ведения журнала, чтобы добраться до сути? - person Zack; 15.11.2014
comment
Я получаю ответ от моего предлагающего клиента, и я получаю только следующие строки: 2014-11-14 22:47:49.908 Remotely[52330:4141871] изменение состояния peerConnection. ‹RTCPeerConnection: 0x797300e0›, 0 2014-11-14 22:47:49.908 Удаленно [52330:4141871] установить описание сеанса с ошибкой. ‹RTCPeerConnection: 0x797300e0›, (null) 2014-11-14 22:47:51.508 Удаленно[52330:4141871] сбор льда изменен. ‹RTCPeerConnection: 0x797300e0›, 2 - person Zack; 15.11.2014
comment
Если вы создаете WebRTC с включенной отладкой, вы должны получить гораздо больше результатов отладки. - person iain; 16.11.2014
comment
Наконец-то добрался до сути, за что я добавил и ответил. Большое спасибо за помощь, Иан! - person Zack; 17.11.2014