Impelementation RTCDataChannel WebRTC в iOS
Я использую ISBX/apprtc-ios код для реализации видеочата. Эта работа идеально подходит для iPhone и симулятора. Я хочу отправить текстовые/строковые данные между двумя одноранговыми узлами, и я использую класс RTCDataChannel
.
Ниже приводится моя реализация, и я не могу установить соединение. Он всегда дает статус kRTCDataChannelStateConnecting
Как я могу подключить RTCDataChannel? Есть ли какая-либо рабочая реализация для WebRTC RTCDataChannel для iOS?
- (void)createNewDataChannel {
if (self.clientDataChannel) {
switch(self.clientDataChannel.state) {
case kRTCDataChannelStateConnecting:
NSLog(@"kRTCDataChannelStateConnecting");
break;
case kRTCDataChannelStateOpen:
NSLog(@"kRTCDataChannelStateOpen");
break;
case kRTCDataChannelStateClosing:
NSLog(@"kRTCDataChannelStateClosing");
break;
case kRTCDataChannelStateClosed:
NSLog(@"kRTCDataChannelStateClosed");
break;
default:
NSLog(@"Unknown");
}
return;
}
if (self.peerConnection == nil) {
NSLog(@"Peerconnection is nil");
}
RTCDataChannelInit *DataChannelInit = [[RTCDataChannelInit alloc] init];
DataChannelInit.maxRetransmits = 0;
DataChannelInit.isOrdered=false;
DataChannelInit.maxRetransmitTimeMs = -1;
DataChannelInit.isNegotiated = false;
DataChannelInit.streamId = 25;
RTCDataChannel *dataChannel =[_peerConnection createDataChannelWithLabel:@"commands" config:DataChannelInit];
dataChannel.delegate=self;
self.clientDataChannel = dataChannel;
if (self.clientDataChannel == nil) {
NSLog(@"Datachannel is nil");
}
else {
NSLog(@"Datachannel is working");
}
}
Ответы
Ответ 1
Я могу отправлять данные через RTCDataChannel. Я сделал это перед отправкой предложения. Я создал RTCDataChannelInit с приведенной ниже конфигурацией.
RTCDataChannelInit *datainit = [[RTCDataChannelInit alloc] init];
datainit.isNegotiated = YES;
datainit.isOrdered = YES;
datainit.maxRetransmits = 30;
datainit.maxRetransmitTimeMs = 30000;
datainit.streamId = 1;
self.dataChannel = [_peerConnection createDataChannelWithLabel:@"commands" config:datainit];
self.dataChannel.delegate=self;
Как только оба устройства подключаются, я проверил состояние в функции делегата. Состояние канала открыто.
- (void)channelDidChangeState:(RTCDataChannel*)channel
{
NSLog(@"channel.state %u",channel.state);
}
Затем я отправляю данные в соответствии с приведенным ниже кодом:
RTCDataBuffer *buffer = [[RTCDataBuffer alloc] initWithData:[str dataUsingEncoding:NSUTF8StringEncoding] isBinary:NO];
BOOL x = [self.dataChannel sendData:buffer];
Конфигурация, которую я использовал, была приведена здесь:
https://groups.google.com/forum/#!searchin/discuss-webrtc/RTCDataChannel/discuss-webrtc/9NObqxnItCg/mRvXBIwkA7wJ