Skip to content

Commit ac62849

Browse files
committed
modify:sdp and stun and dtls connect support for webrtc example
1 parent 4481651 commit ac62849

File tree

1 file changed

+142
-14
lines changed

1 file changed

+142
-14
lines changed

XEngine_APPClient/APPClient_WebRTC/APPClient_WebRTC.cpp

Lines changed: 142 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,21 @@
55
#include <windows.h>
66
#include <tchar.h>
77
#pragma comment(lib,"XEngine_BaseLib/XEngine_BaseLib")
8-
#pragma comment(lib,"XEngine_Core/XEngine_OPenSsl")
98
#pragma comment(lib,"XEngine_Client/XClient_Socket")
9+
#pragma comment(lib,"XEngine_Client/XClient_OPenSsl")
1010
#pragma comment(lib,"XEngine_Client/XClient_APIHelp")
1111
#pragma comment(lib,"XEngine_StreamMedia/StreamMedia_SDPProtocol")
12+
#pragma comment(lib,"XEngine_RfcComponents/RfcComponents_NatProtocol")
1213
#pragma comment(lib,"Ws2_32")
1314
#endif
1415
#include <list>
1516
#include <thread>
17+
#include <memory>
1618
#include <XEngine_Include/XEngine_CommHdr.h>
1719
#include <XEngine_Include/XEngine_Types.h>
1820
#include <XEngine_Include/XEngine_ProtocolHdr.h>
1921
#include <XEngine_Include/XEngine_BaseLib/BaseLib_Define.h>
2022
#include <XEngine_Include/XEngine_BaseLib/BaseLib_Error.h>
21-
#include <XEngine_Include/XEngine_Core/OPenSsl_Define.h>
22-
#include <XEngine_Include/XEngine_Core/OPenSsl_Error.h>
2323
#include <XEngine_Include/XEngine_Client/XClient_Define.h>
2424
#include <XEngine_Include/XEngine_Client/XClient_Error.h>
2525
#include <XEngine_Include/XEngine_Client/APIClient_Define.h>
@@ -28,17 +28,14 @@
2828
#include <XEngine_Include/XEngine_Client/SslClient_Error.h>
2929
#include <XEngine_Include/XEngine_StreamMedia/SDPProtocol_Define.h>
3030
#include <XEngine_Include/XEngine_StreamMedia/SDPProtocol_Error.h>
31+
#include <XEngine_Include/XEngine_RfcComponents/NatProtocol_Define.h>
32+
#include <XEngine_Include/XEngine_RfcComponents/NatProtocol_Error.h>
3133
#include "../../XEngine_Source/XEngine_UserProtocol.h"
3234
using namespace std;
3335

34-
int main()
36+
bool APPClient_WEBRTC_SDPPacket(LPCXSTR lpszAPIUrl, LPCXSTR lpszFileCert, XCHAR* ptszSDPPacket, int* pInt_SDPLen)
3537
{
36-
int nMSGLen = 0;
3738
XNETHANDLE xhToken = 0;
38-
XCHAR tszMSGBuffer[2048] = {};
39-
//LPCXSTR lpszAPIUrl = _X("http://10.0.1.88:5600/rtc/v1/whep/?app=live&stream=livestream.flv");
40-
LPCXSTR lpszAPIUrl = _X("http://10.0.1.88:1985/rtc/v1/whep/?app=live&stream=livestream");
41-
LPCXSTR lpszFileCert = _X("");
4239

4340
SDPProtocol_Packet_Create(&xhToken);
4441
SDPProtocol_Packet_Owner(xhToken, _X("-"), 123456789, _X("127.0.0.1"));
@@ -58,11 +55,11 @@ int main()
5855
SDPProtocol_Packet_ClientInet(xhToken, _X("0.0.0.0"));
5956
SDPProtocol_Packet_RtcpInet(xhToken, 9);
6057
SDPProtocol_Packet_ICEUser(xhToken, _X("nzWE"), _X("xk/FvO+TXrJy6739etI/y0Kc"), true);
61-
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("fingerprint"), _X("sha-256 7E:A0:FF:BA:8F:C4:2C:E8:02:4C:82:22:96:A7:A2:B2:BF:53:79:AA:B0:0D:61:72:62:33:F9:0D:CC:A3:13:C8"));
58+
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("fingerprint"), _X("sha-256 E6:29:09:F9:C5:C7:A0:EA:0B:71:AC:F9:4C:D7:78:79:CC:35:DE:C3:90:45:25:EB:79:8F:14:0A:95:BC:30:B5"));
6259
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("setup"), _X("actpass"));
6360
SDPProtocol_Packet_OnlyRWFlag(xhToken);
6461
SDPProtocol_Packet_RtcpComm(xhToken, true, false);
65-
62+
6663
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPMedia = {};
6764
st_SDPMedia.st_RTPMap.nChannel = 2;
6865
st_SDPMedia.st_RTPMap.nSampleRate = 48000;
@@ -77,7 +74,7 @@ int main()
7774
SDPProtocol_Packet_ClientInet(xhToken, _X("0.0.0.0"));
7875
SDPProtocol_Packet_RtcpInet(xhToken, 9);
7976
SDPProtocol_Packet_ICEUser(xhToken, _X("nzWE"), _X("xk/FvO+TXrJy6739etI/y0Kc"), true);
80-
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("fingerprint"), _X("sha-256 7E:A0:FF:BA:8F:C4:2C:E8:02:4C:82:22:96:A7:A2:B2:BF:53:79:AA:B0:0D:61:72:62:33:F9:0D:CC:A3:13:C8"));
77+
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("fingerprint"), _X("sha-256 E6:29:09:F9:C5:C7:A0:EA:0B:71:AC:F9:4C:D7:78:79:CC:35:DE:C3:90:45:25:EB:79:8F:14:0A:95:BC:30:B5"));
8178
SDPProtocol_Packet_OptionalAddAttr(xhToken, _X("setup"), _X("actpass"));
8279
SDPProtocol_Packet_OnlyRWFlag(xhToken);
8380
SDPProtocol_Packet_RtcpComm(xhToken, true, true);
@@ -97,9 +94,123 @@ int main()
9794
st_SDPMedia.st_FmtpVideo.tszLeaveId[2] = 0x1f;
9895
SDPProtocol_Packet_VideoFmt(xhToken, 106, &st_SDPMedia, true);
9996

100-
SDPProtocol_Packet_GetPacket(xhToken, tszMSGBuffer, &nMSGLen);
97+
SDPProtocol_Packet_GetPacket(xhToken, ptszSDPPacket, pInt_SDPLen);
10198
SDPProtocol_Packet_Destory(xhToken);
102-
printf("%s\n", tszMSGBuffer);
99+
return true;
100+
}
101+
bool APPClient_WEBRTC_SDPParse(LPCXSTR lpszMSGBuffer, int nMSGLen, XCHAR* ptszICEUser, XCHAR* ptszICEPass)
102+
{
103+
XNETHANDLE xhParse = 0;
104+
105+
if (!SDPProtocol_Parse_Create(&xhParse, lpszMSGBuffer, nMSGLen))
106+
{
107+
return false;
108+
}
109+
int nAttrCount = 0;
110+
STREAMMEDIA_SDPPROTOCOL_ATTR** ppSt_ListAttr;
111+
SDPProtocol_Parse_GetAttr(xhParse, &ppSt_ListAttr, &nAttrCount);
112+
113+
int nListCount = 0;
114+
STREAMMEDIA_SDPPROTOCOL_AVMEDIA** ppSt_AVMedia;
115+
SDPProtocol_Parse_GetAVMedia(xhParse, &ppSt_AVMedia, &nListCount);
116+
for (int i = 0; i < nListCount; i++)
117+
{
118+
STREAMMEDIA_SDPPROTOCOL_MEDIAINFO st_SDPMeida = {};
119+
if (0 == _tcsxnicmp(ppSt_AVMedia[i]->tszAVType, "audio", 5))
120+
{
121+
SDPProtocol_Parse_RTPMapAudio(&ppSt_ListAttr, nAttrCount, ppSt_AVMedia[i]->nCodecNumber, &st_SDPMeida);
122+
}
123+
else
124+
{
125+
SDPProtocol_Parse_RTPMapVideo(&ppSt_ListAttr, nAttrCount, ppSt_AVMedia[i]->nCodecNumber, &st_SDPMeida);
126+
}
127+
printf("%s:\n", ppSt_AVMedia[i]->tszAVType);
128+
}
129+
int nAVIndex1 = 0;
130+
int nAVIndex2 = 0;
131+
SDPProtocol_Parse_AttrBundle(&ppSt_ListAttr, nAttrCount, &nAVIndex1, &nAVIndex2);
132+
SDPProtocol_Parse_AttrICEUser(&ppSt_ListAttr, nAttrCount, ptszICEUser, ptszICEPass);
133+
134+
XCHAR tszAlgorithmKey[MAX_PATH] = {};
135+
XCHAR tszAlgorithmVlu[MAX_PATH] = {};
136+
SDPProtocol_Parse_AttrFinger(&ppSt_ListAttr, nAttrCount, tszAlgorithmKey, tszAlgorithmVlu);
137+
138+
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_AVMedia, nListCount);
139+
BaseLib_OperatorMemory_Free((XPPPMEM)&ppSt_ListAttr, nAttrCount);
140+
SDPProtocol_Parse_Destory(xhParse);
141+
return true;
142+
}
143+
bool APPClient_WEBRTC_StunSend(XSOCKET hSocket, LPCXSTR lpszICEUser, LPCXSTR lpszICEPass)
144+
{
145+
int nMSGLen = 0;
146+
XCHAR tszMSGBuffer[1024] = {};
147+
XCHAR tszICEUser[128] = {};
148+
XCHAR tszTmpBuffer[128] = {};
149+
XCHAR tszTokenStr[64] = {};
150+
XCHAR tszRandomStr[10] = {};
151+
152+
_xstprintf(tszICEUser, _X("%s:nzWE"), lpszICEUser);
153+
BaseLib_OperatorHandle_CreateStr(tszRandomStr, 8, 0, 2);
154+
NatProtocol_StunNat_BuildAttr(tszTmpBuffer, &nMSGLen, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_USERNAME, tszICEUser, 13);
155+
NatProtocol_StunNat_BuildAttr(tszTmpBuffer + nMSGLen, &nMSGLen, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_ICE_CONTROLLING, tszRandomStr, 8);
156+
NatProtocol_StunNat_BuildPriority(tszTmpBuffer + nMSGLen, &nMSGLen);
157+
158+
BaseLib_OperatorHandle_CreateStr(tszTokenStr, 12, 0, 2);
159+
NatProtocol_StunNat_Packet(tszMSGBuffer, &nMSGLen, tszTokenStr, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_CLASS_REQUEST, RFCCOMPONENTS_NATCLIENT_PROTOCOL_STUN_ATTR_MAPPED_ADDRESS, tszTmpBuffer, true, lpszICEPass, true);
160+
161+
while (true)
162+
{
163+
if (!XClient_UDPSelect_SendMsg(hSocket, tszMSGBuffer, nMSGLen))
164+
{
165+
return false;
166+
}
167+
std::this_thread::sleep_for(std::chrono::seconds(5));
168+
}
169+
170+
return true;
171+
}
172+
bool APPClient_WEBRTC_Dlts(XSOCKET hSocket)
173+
{
174+
LPCXSTR lpszCertFile = _X("D:\\XEngine_StreamMedia\\XEngine_APPClient\\Debug\\certificate.crt");
175+
LPCXSTR lpszPrivateFile = _X("D:\\XEngine_StreamMedia\\XEngine_APPClient\\Debug\\private.key");
176+
177+
XHANDLE xhSsl = XClient_OPenSsl_InitEx(ENUM_XCLIENT_SSL_TYPE_DTL_VERSION, false, lpszCertFile, NULL, lpszPrivateFile);
178+
if (NULL == xhSsl)
179+
{
180+
return false;
181+
}
182+
XClient_OPenSsl_ConfigEx(xhSsl);
183+
184+
XCLIENT_SSLCERT_SRVINFO st_SslInfo;
185+
XClient_OPenSsl_ConnectEx(xhSsl, hSocket, &st_SslInfo);
186+
187+
XBYTE byKEYBuffer[128] = {};
188+
XClient_OPenSsl_GetKeyEx(xhSsl, byKEYBuffer);
189+
while (true)
190+
{
191+
int nMSGLen = 2048;
192+
XCHAR tszMSGBuffer[2048] = {};
193+
if (XClient_UDPSelect_RecvMsg(hSocket, tszMSGBuffer, &nMSGLen))
194+
{
195+
int nRVLen = 0;
196+
XCHAR* ptszMSGBuffer = NULL;
197+
XClient_OPenSsl_RecvMemoryEx(xhSsl, &ptszMSGBuffer, &nRVLen, tszMSGBuffer, nMSGLen);
198+
printf("%d\n", nRVLen);
199+
}
200+
}
201+
return true;
202+
}
203+
204+
int main()
205+
{
206+
XSOCKET hSocket;
207+
//LPCXSTR lpszAPIUrl = _X("http://10.0.1.88:5600/rtc/v1/whep/?app=live&stream=livestream.flv");
208+
LPCXSTR lpszAPIUrl = _X("http://app.xyry.org:1985/rtc/v1/whep/?app=live&stream=livestream");
209+
LPCXSTR lpszFileCert = _X("");
210+
int nMSGLen = 0;
211+
XCHAR tszMSGBuffer[2048] = {};
212+
213+
APPClient_WEBRTC_SDPPacket(lpszAPIUrl, lpszFileCert, tszMSGBuffer, &nMSGLen);
103214

104215
int nHTTPCode = 0;
105216
XCHAR* ptszMSGBuffer = NULL;
@@ -108,7 +219,24 @@ int main()
108219
printf("APIClient_Http_Request:%lX\n", APIClient_GetLastError());
109220
return -1;
110221
}
222+
XCHAR tszICEUser[128] = {};
223+
XCHAR tszICEPass[128] = {};
224+
APPClient_WEBRTC_SDPParse(ptszMSGBuffer, nMSGLen, tszICEUser, tszICEPass);
225+
BaseLib_OperatorMemory_FreeCStyle((XPPMEM)&ptszMSGBuffer);
226+
227+
XClient_UDPSelect_Create(&hSocket);
228+
XClient_UDPSelect_Connect(hSocket, "43.139.170.67", 8000);
229+
230+
std::thread pSTDThread_Stun(APPClient_WEBRTC_StunSend, hSocket, tszICEUser, tszICEPass);
231+
pSTDThread_Stun.detach();
111232

233+
std::thread pSTDThread_Dtls(APPClient_WEBRTC_Dlts, hSocket);
234+
pSTDThread_Dtls.detach();
112235

236+
while (true)
237+
{
238+
std::this_thread::sleep_for(std::chrono::seconds(1));
239+
}
240+
XClient_UDPSelect_Close(hSocket);
113241
return 0;
114242
}

0 commit comments

Comments
 (0)