source: ntrip/trunk/BNC/bncnetqueryrtp.cpp@ 1501

Last change on this file since 1501 was 1496, checked in by mervart, 15 years ago

* empty log message *

File size: 5.6 KB
Line 
1/* -------------------------------------------------------------------------
2 * BKG NTRIP Client
3 * -------------------------------------------------------------------------
4 *
5 * Class: bncNetQueryRtp
6 *
7 * Purpose: Blocking Network Requests (NTRIP Version 2 with RTSP)
8 *
9 * Author: L. Mervart
10 *
11 * Created: 27-Dec-2008
12 *
13 * Changes:
14 *
15 * -----------------------------------------------------------------------*/
16
17#include <iostream>
18#include <iomanip>
19
20#include "bncnetqueryrtp.h"
21
22using namespace std;
23
24#define BNCVERSION "1.7"
25
26// Constructor
27////////////////////////////////////////////////////////////////////////////
28bncNetQueryRtp::bncNetQueryRtp() {
29 _socket = 0;
30 _udpSocket = 0;
31 _eventLoop = new QEventLoop(this);
32}
33
34// Destructor
35////////////////////////////////////////////////////////////////////////////
36bncNetQueryRtp::~bncNetQueryRtp() {
37 delete _eventLoop;
38 delete _socket;
39 delete _udpSocket;
40}
41
42//
43////////////////////////////////////////////////////////////////////////////
44void bncNetQueryRtp::stop() {
45 _eventLoop->quit();
46 _status = finished;
47}
48
49//
50////////////////////////////////////////////////////////////////////////////
51void bncNetQueryRtp::waitForRequestResult(const QUrl&, QByteArray&) {
52}
53
54//
55////////////////////////////////////////////////////////////////////////////
56void bncNetQueryRtp::waitForReadyRead(QByteArray& outData) {
57
58 // Wait Loop
59 // ---------
60 if (!_udpSocket->hasPendingDatagrams()) {
61 _eventLoop->exec();
62 }
63
64 // Append Data
65 // -----------
66 QByteArray datagram;
67 datagram.resize(_udpSocket->pendingDatagramSize());
68 _udpSocket->readDatagram(datagram.data(), datagram.size());
69
70 if (datagram.size() > 12) {
71 outData.append(datagram.mid(12));
72 }
73}
74
75// Connect to Caster, send the Request
76////////////////////////////////////////////////////////////////////////////
77void bncNetQueryRtp::startRequest(const QUrl& url, const QByteArray& gga) {
78
79 const int timeOut = 5000;
80
81 _status = running;
82
83 delete _socket;
84 _socket = new QTcpSocket();
85
86 // Default scheme
87 // --------------
88 QUrl urlLoc(url);
89 urlLoc.setScheme("rtsp");
90
91 // Connect the Socket
92 // ------------------
93 QSettings settings;
94 QString proxyHost = settings.value("proxyHost").toString();
95 int proxyPort = settings.value("proxyPort").toInt();
96
97 if ( proxyHost.isEmpty() ) {
98 _socket->connectToHost(urlLoc.host(), urlLoc.port());
99 }
100 else {
101 _socket->connectToHost(proxyHost, proxyPort);
102 }
103
104 // Send Request 1
105 // --------------
106 if (_socket->waitForConnected(timeOut)) {
107 QString uName = QUrl::fromPercentEncoding(urlLoc.userName().toAscii());
108 QString passW = QUrl::fromPercentEncoding(urlLoc.password().toAscii());
109 QByteArray userAndPwd;
110
111 if(!uName.isEmpty() || !passW.isEmpty()) {
112 userAndPwd = "Authorization: Basic " + (uName.toAscii() + ":" +
113 passW.toAscii()).toBase64() + "\r\n";
114 }
115
116 // Find a free port number
117 // -----------------------
118 int clientPortInt = 0;
119 QTcpSocket* hlpSocket = new QTcpSocket();
120 if ( proxyHost.isEmpty() ) {
121 hlpSocket->connectToHost(urlLoc.host(), urlLoc.port());
122 }
123 else {
124 hlpSocket->connectToHost(proxyHost, proxyPort);
125 }
126 if (hlpSocket->waitForConnected(timeOut)) {
127 clientPortInt = hlpSocket->localPort();
128 }
129 delete hlpSocket;
130
131 // Setup the RTSP Connection
132 // -------------------------
133 if (clientPortInt) {
134 QByteArray clientPort = QString("%1").arg(clientPortInt).toAscii();
135 delete _udpSocket;
136 _udpSocket = new QUdpSocket();
137 _udpSocket->bind(clientPortInt);
138 connect(_udpSocket, SIGNAL(readyRead()), _eventLoop, SLOT(quit()));
139
140 QByteArray reqStr;
141 reqStr = "SETUP " + urlLoc.toEncoded() + " RTSP/1.0\r\n"
142 + "CSeq: 1\r\n"
143 + "Ntrip-Version: Ntrip/2.0\r\n"
144 + "Ntrip-Component: Ntripclient\r\n"
145 + "User-Agent: NTRIP BNC/" BNCVERSION "\r\n"
146 + "Transport: RTP/GNSS;unicast;client_port=" + clientPort + "\r\n"
147 + userAndPwd
148 + "\r\n";
149 _socket->write(reqStr, reqStr.length());
150
151 // Read Server Answer 1
152 // --------------------
153 if (_socket->waitForBytesWritten(timeOut)) {
154 if (_socket->waitForReadyRead(timeOut)) {
155 QTextStream in(_socket);
156 QByteArray session;
157 QString line = in.readLine();
158 while (!line.isEmpty()) {
159 if (line.indexOf("Session:") == 0) {
160 session = line.mid(9).toAscii();
161 break;
162 }
163 line = in.readLine();
164 }
165
166 // Send Request 2
167 // --------------
168 if (!session.isEmpty()) {
169 reqStr = "PLAY " + urlLoc.toEncoded() + " RTSP/1.0\r\n"
170 + "CSeq: 2\r\n"
171 + "Session: " + session + "\r\n"
172 + "\r\n";
173 _socket->write(reqStr, reqStr.length());
174
175 // Read Server Answer 2
176 // --------------------
177 if (_socket->waitForBytesWritten(timeOut)) {
178 if (_socket->waitForReadyRead(timeOut)) {
179 QTextStream in(_socket);
180 line = in.readLine();
181 while (!line.isEmpty()) {
182 if (line.indexOf("200 OK") != -1) {
183 emit newMessage(urlLoc.host().toAscii() +
184 urlLoc.path().toAscii() +
185 ": UDP connection established", true);
186 return;
187 }
188 line = in.readLine();
189 }
190 }
191 }
192 }
193 }
194 }
195 }
196 }
197
198 delete _socket;
199 _socket = 0;
200 _status = error;
201}
202
Note: See TracBrowser for help on using the repository browser.