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>
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"
3234using 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