I use sample scene “Samples~ > DataChannel” in Unity-Technologies/com.unity.webrtc. This sample, 2 peer in the same pc communicate.But I want to connect between another lan.I use websocket and signaling server.The signaling server relays the received message to other peers as it is.
I changed the program, to send an offer and receive an answer via websocket, between two UNITY apps.
However, when I received the answer and executed “remotePeer.SetLocalDescription (ref desc)”, I got an error that the fingerprint dose not match.
When and where was the fingerprint printed in the first place?
Is it when created a peer with "localPeer = new RTCPeerConnection (ref configuration) "?
The processing flow is as follows.
1.Create local and remote peers with app1 and app2, respectively.
2.Create an offer in app1 and set the local DESC of the local peer, set the remote DESC of the remote peer.
Send the offer to app2 via a signaling server via websocket.
3.App2 sets the received offer to the local DESC of the remote peer, and sets it to the remote DESC of the local peer. Create an answer and set the local DESC of the local peer, set the remote DESC of the remote peer, and send the answer to app1.
4.App1 sets the received answer to the remote peer’s local DESC (fingerprint not match here) and sets it to the local peer’s remote DESC.
the process that causes an error when receiving an answer
//1.make peer and offer
IEnumerator Call()
{
callButton.interactable = false;
Debug.Log("GetSelectedSdpSemantics");
var configuration = GetSelectedSdpSemantics();
localPeer = new RTCPeerConnection(ref configuration);
Debug.Log("Created local peer connection object pc1");
localPeer.OnIceCandidate = pc1OnIceCandidate;
localPeer.OnIceConnectionChange = pc1OnIceConnectionChange;
remotePeer = new RTCPeerConnection(ref configuration);
Debug.Log("Created remote peer connection object pc2");
remotePeer.OnIceCandidate = pc2OnIceCandidate;
remotePeer.OnIceConnectionChange = pc2OnIceConnectionChange;
remotePeer.OnDataChannel = onDataChannel;
RTCDataChannelInit conf = new RTCDataChannelInit();
dataChannel = localPeer.CreateDataChannel("data", conf);
dataChannel.OnOpen = onDataChannelOpen;
Debug.Log("pc1 createOffer start");
var op1 = localPeer.CreateOffer();
yield return op1;
if (!op1.IsError)
{
yield return StartCoroutine(OnCreateOfferSuccess(op1.Desc));
}
else
{
OnCreateSessionDescriptionError(op1.Error);
}
}
//2.offer send to app2
IEnumerator OnCreateOfferSuccess(RTCSessionDescription op1offerdesc)
{
Debug.Log($"Offer from pc1\n{op1offerdesc.sdp}");
Debug.Log("pc1 setLocalDescription start");
var op2 = localPeer.SetLocalDescription(ref op1offerdesc);
yield return op2;
if (!op2.IsError)
{
OnSetLocalSuccess(localPeer);
}
else
{
var error = op2.Error;
OnSetSessionDescriptionError(ref error);
}
Debug.Log("pc2 setRemoteDescription start");
var op3 = remotePeer.SetRemoteDescription(ref op1offerdesc);
yield return op3;
if (!op3.IsError)
{
OnSetRemoteSuccess(remotePeer);
}
else
{
var error = op3.Error;
OnSetSessionDescriptionError(ref error);
}
int i = (int)op1offerdesc.type;
ws.Send(i.ToString() + "," + op1offerdesc.sdp);
}
//3.In app2,recieve offer. Then make answer and send answer to app1.
//4.In app1,recieve answer.
IEnumerator getRemoteMessage(RTCSessionDescription desc) {
if (localPeer != null) {
Debug.Log("get answer!");
Debug.Log($"Answer from pc2\n{desc.sdp}");
Debug.Log("remotePeer setLocalDescription start");
var op5 = remotePeer.SetLocalDescription(ref desc);
yield return op5;
if (!op5.IsError) {
OnSetLocalSuccess(remotePeer);
} else {
Debug.Log(op5.Error.message);// ←error happen!
var error = op5.Error;
OnSetSessionDescriptionError(ref error);
}
Debug.Log("localPeer setRemoteDescription start");
var op6 = localPeer.SetRemoteDescription(ref desc);
if (!op6.IsError) {
OnSetRemoteSuccess(localPeer);
} else {
var error = op6.Error;
OnSetSessionDescriptionError(ref error);
}
} else {
Debug.Log("get offer!");
//localPeer and remotePeer instantiate
Call2();
//受け取ったおフォーのSDPからpc2ローカルを作成
var op2 = remotePeer.SetLocalDescription(ref desc);
if (!op2.IsError) {
OnSetLocalSuccess(remotePeer);
} else {
var error = op2.Error;
OnSetSessionDescriptionError(ref error);
}
//pc2ローカル=pc1のリモート
var op3 = localPeer.SetRemoteDescription(ref desc);
if (!op3.IsError) {
OnSetRemoteSuccess(localPeer);
} else {
var error = op3.Error;
OnSetSessionDescriptionError(ref error);
}
//アンサーを作成
var op4 = localPeer.CreateAnswer();
yield return op4;
if (!op4.IsError) {
yield return OnCreateAnswerSuccess(op4.Desc);
} else {
OnCreateSessionDescriptionError(op4.Error);
}
}
}
//localPeer and remotePeer instantiate
void Call2() {
callButton.interactable = false;
Debug.Log("GetSelectedSdpSemantics");
var configuration = GetSelectedSdpSemantics();
localPeer = new RTCPeerConnection(ref configuration);
Debug.Log("Created local peer connection object pc1");
localPeer.OnIceCandidate = pc1OnIceCandidate;
localPeer.OnIceConnectionChange = pc1OnIceConnectionChange;
remotePeer = new RTCPeerConnection(ref configuration);
Debug.Log("Created remote peer connection object pc2");
remotePeer.OnIceCandidate = pc2OnIceCandidate;
remotePeer.OnIceConnectionChange = pc2OnIceConnectionChange;
remotePeer.OnDataChannel = onDataChannel;
RTCDataChannelInit conf = new RTCDataChannelInit();
dataChannel = remotePeer.CreateDataChannel("data", conf);
dataChannel.OnOpen = onDataChannelOpen;
}
//send answer
IEnumerator OnCreateAnswerSuccess(RTCSessionDescription op4AnswerDesc)
{
Debug.Log($"Answer from pc1:\n{op4AnswerDesc.sdp}");
Debug.Log("pc1 setLocalDescription start");
var op5 = localPeer.SetLocalDescription(ref op4AnswerDesc);
yield return op5;
if (!op5.IsError)
{
OnSetLocalSuccess(localPeer);
} else
{
var error = op5.Error;
OnSetSessionDescriptionError(ref error);
}
//pc1のローカル=pc2のリモート
Debug.Log("pc2 setRemoteDescription start");
var op6 = remotePeer.SetRemoteDescription(ref op4AnswerDesc);
yield return op6;
if (!op6.IsError)
{
OnSetRemoteSuccess(remotePeer);
}
else
{
var error = op6.Error;
OnSetSessionDescriptionError(ref error);
}
//リモートにアンサーのdescを投げる @@@
ws.Send(((int)(op4AnswerDesc.type)).ToString() + "," + op4AnswerDesc.sdp);
}