metaRTC datachannel 实现 reply

      webrtc的datachannel是实时数据传输,特别是控制信息或者交互信息的一个高效简洁安全的传输方式,在交换SDP时加入m=application webrtc-datachannel 相关内容,协商一致后即可实现通信,为了datachannel通道可以传输byte类数据也可以传输string类字符,所以可以灵活的实现自定义的数据交互。

    下面就metaRTC5.0进行多链路的datachannel接收并回传,只针对string类型,data类型可自行扩展,metaRTC里面是通过rtc建立session后设置回调函数实现的,下面即为回调函数的具体实现,将收到的字符串信息加上前缀后回传回去,其中uid作为peer的索引

void g_ipc_rtcrecv_receiveMsg(void* user,YangFrame *msgFrame){
	if(user==NULL||msgFrame==NULL) return;
	if(msgFrame->mediaType!=YANG_DATA_CHANNEL_STRING) return;
	char *Msg;
	char * prex="reply ";
	uint32_t len,prexlen=sizeof(prex);
	YangFrame replayFrame;
	// memset(&replayFrame,0,sizeof(YangFrame));
	replayFrame.payload=MEMCALLOC(replayFrame.payload,msgFrame->nb+prexlen);//datachanelmsg;
	replayFrame.mediaType=YANG_DATA_CHANNEL_STRING;
	printf("recv datachannel peer %d:%s\n",msgFrame->uid,(char*)msgFrame->payload);
	yang_trace("recv datachannel:%s",msgFrame->payload);
	IpcRtcSession* rtcHandle=(IpcRtcSession*)user;
	for(int32_t i=0;ipushs.vec.vsize;i++){
		YangPeerConnection* rtc=rtcHandle->pushs.vec.payload[i];
		//找到本peer
        if(rtc->peer.streamconfig.uid==msgFrame->uid){
			//回传
			Msg=(char*)msgFrame->payload;
			len=strlen(Msg);
			memcpy(replayFrame.payload,prex,prexlen-1);
			memcpy(replayFrame.payload+prexlen-2,Msg,len);
			replayFrame.nb=len+prexlen-2;//strlen(replayFrame.payload);//len+prexlen;
			replayFrame.payload[replayFrame.nb]="\0";
			// replayFrame.nb+=1;
			replayFrame.pts=replayFrame.dts=GETTIME();
			printf("datachannel send out %s\n",(char*)replayFrame.payload);
            rtc->on_message(&rtc->peer,&replayFrame);
		    break;
		}
	}	
	SAFE_MEMFREE(replayFrame.payload);
}

 以下是建立连接后按发送控制信息,即可发送msgout给metaRTC,metaRTC回传reply msgout显示在数据接收框里

metaRTC datachannel 实现 reply_第1张图片

稳定性还可以,测试了4个session 4k 30fps 16小时,一切正常

metaRTC datachannel 实现 reply_第2张图片

 

      metaRTC是新开发的嵌入式webrtc,有很多功能和api需要进一步开发完善和摸索,也需要更多的人参与进来,大家一起学习进步,让社区更强大。期待你的帮助!

 

你可能感兴趣的:(metaRTC,笔记,物联网,webrtc,实时互动,实时音视频)