ntrip_client.cpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. #include "ntrip_client.h"
  2. #include <memory>
  3. ntrip_client::ntrip_client(std::string strip,std::string strport,std::string strMountPoint,
  4. std::string strUserName,std::string strPassWord,
  5. std::string strCOMName,int nBaudRate )
  6. {
  7. mstrip = strip;
  8. mstrport = strport;
  9. mstrMountPoint = strMountPoint;
  10. mstrUserName = strUserName;
  11. mstrPassWord = strPassWord;
  12. mstrCOMName = strCOMName;
  13. mnBaudRate = nBaudRate;
  14. socket_ = new QTcpSocket(this);
  15. // socket_->connectToHost("rtk.ntrip.qxwz.com",8002);
  16. connect(socket_, SIGNAL(connected()), this, SLOT(connectedSlot()));
  17. connect(socket_, SIGNAL(disconnected()), this, SLOT(disconnectedSlot()));
  18. connect(socket_, SIGNAL(readyRead()), this, SLOT(readyReadSlot()));
  19. connect(socket_, SIGNAL(error(QAbstractSocket::SocketError)), this,
  20. SLOT(errorSlot(QAbstractSocket::SocketError)));
  21. mpTimerNtrip = new QTimer(this);
  22. connect(mpTimerNtrip,SIGNAL(timeout()),this,SLOT(onTimerNtrip()));
  23. mpTimerNtrip->setInterval(1000);
  24. mpTimerNtrip->start();
  25. mpTimerPort = new QTimer(this);
  26. connect(mpTimerPort,SIGNAL(timeout()),this,SLOT(onTimerPortOpen()));
  27. mpTimerPort->start(100);
  28. }
  29. void ntrip_client::run()
  30. {
  31. }
  32. void ntrip_client::connectedSlot()
  33. {
  34. if(socket_->state() == QAbstractSocket::ConnectedState)
  35. {
  36. qDebug("main is connected.\n");
  37. mFindCMState = 3;
  38. }
  39. else
  40. {
  41. qDebug("main is not connected.\n");
  42. }
  43. isConnected_ = true;
  44. }
  45. void ntrip_client::disconnectedSlot()
  46. {
  47. // qDebug("connect server fail.");
  48. if(mFindCMState != -1)mFindCMState = 0;
  49. isConnected_ = false;
  50. socket_->close();
  51. }
  52. void ntrip_client::readyReadSlot()
  53. {
  54. char * str;
  55. QByteArray message = socket_->readAll();
  56. // qDebug(message.data());
  57. switch (mFindCMState) {
  58. case 4:
  59. str = (char *)message.data();
  60. if(strstr(str,"ICY 200 OK") > 0)
  61. {
  62. mFindCMState = 5;
  63. qDebug("Login succcess");
  64. }
  65. else
  66. {
  67. if(strstr(str,"HTTP 401 Unauthorized") > 0)
  68. {
  69. mFindCMState = -1;
  70. qDebug("Authorize Fail. message is %s",message.data());
  71. }
  72. // mFindCMState = 0;
  73. }
  74. break;
  75. case 5:
  76. #ifdef DEBUG_NTRIP_MSG
  77. ShowNtripMsg(message);
  78. #else
  79. qDebug("ntrip msg len is %d",message.length());
  80. #endif
  81. if(mbPortOpen)
  82. {
  83. if(-1 == m_serialPort_RTK->write(message))
  84. {
  85. qDebug("Write Serial Port Fail.");
  86. m_serialPort_RTK->close();
  87. mbPortOpen = false;
  88. mpTimerPort->start(100);
  89. }
  90. }
  91. break;
  92. default:
  93. break;
  94. }
  95. // qDebug("len = %d",message.length());
  96. /*
  97. char strX[3000],strX2[10];
  98. int i;
  99. int nLen = message.length();
  100. snprintf(strX,3000,"");
  101. for(i=0;i<nLen;i++)
  102. {
  103. unsigned char * p = (unsigned char *)(message.data()+i);
  104. snprintf(strX2,10,"%02X ",*p);strncat(strX,strX2,3000);
  105. }
  106. qDebug(strX);*/
  107. // qDebug("TIME = %d read meesage length = %d",mTime.elapsed() ,message.length());
  108. }
  109. void ntrip_client::errorSlot(QAbstractSocket::SocketError)
  110. {
  111. // QMessageBox::information(this, "show", socket_->errorString());
  112. disconnectedSlot();
  113. }
  114. void ntrip_client::onTimerNtrip()
  115. {
  116. switch (mFindCMState) {
  117. case -1:
  118. mpTimerPort->stop();
  119. mpTimerNtrip->stop();
  120. qDebug("User Pass Word Error.");
  121. if(mbPortOpen)m_serialPort_RTK->close();
  122. break;
  123. case 0:
  124. socket_->connectToHost(mstrip.data(),atoi(mstrport.data()));
  125. mFindCMState = 1;
  126. break;
  127. case 2:
  128. break;
  129. case 3:
  130. SendUserPass();
  131. mFindCMState = 4;
  132. break;
  133. case 4:
  134. break;
  135. case 5:
  136. SendGPGGA();
  137. break;
  138. default:
  139. break;
  140. }
  141. }
  142. void ntrip_client::SendUserPass()
  143. {
  144. char strSend[1000];
  145. // snprintf(strSend,1000,"GET / HTTP/1.0\r\nUser-Agent: NTRIP GNSSInternetRadio/1.4.10\r\nAccept: */*\r\nConnection: close\r\n\r\n");
  146. char strLine[100];
  147. char strX[1000];
  148. snprintf(strX,1000,"%s:%s",mstrUserName.data(),mstrPassWord.data());
  149. QByteArray ba; ba.append(strX);qDebug(ba.toBase64().data());
  150. snprintf(strSend,1000,"GET /%s HTTP/1.0\r\n",mstrMountPoint.data());
  151. snprintf(strLine,100,"User-Agent: NTRIP GNSSInternetRadio/1.4.10\r\n");strncat(strSend,strLine,1000);
  152. snprintf(strLine,100,"Accept: */*\r\n");strncat(strSend,strLine,1000);
  153. snprintf(strLine,100,"Connection: close\r\n");strncat(strSend,strLine,1000);
  154. snprintf(strLine,100,"Authorization: Basic %s\r\n",ba.toBase64().data());strncat(strSend,strLine,1000);
  155. snprintf(strLine,100,"\r\n");strncat(strSend,strLine,1000);
  156. socket_->write(strSend,strlen(strSend));
  157. socket_->flush();
  158. }
  159. void ntrip_client::SendGPGGA()
  160. {
  161. if(mbPortOpen)
  162. {
  163. QByteArray ba = m_serialPort_RTK->read(1000);
  164. if(ba.length() > 0)
  165. {
  166. socket_->write(ba);
  167. socket_->flush();
  168. }
  169. }
  170. else
  171. {
  172. #ifdef DEBUG_NTRIP_MSG
  173. char strSend[1000];
  174. snprintf(strSend,1000,"$GPGGA,102342.00,3948.6248006,N,11633.1924828,E,1,13,1.5,46.4085,M,-9.452,M,99,AAAA*72\r\n");
  175. socket_->write(strSend,strlen(strSend));
  176. socket_->flush();
  177. #endif
  178. }
  179. /* char strSend[1000];
  180. snprintf(strSend,1000,"$GPGGA,102342.00,3948.6248006,N,11633.1924828,E,1,13,1.5,46.4085,M,-9.452,M,99,AAAA*72\r\n");
  181. socket_->write(strSend,strlen(strSend));
  182. socket_->flush();*/
  183. }
  184. void ntrip_client::onTimerPortOpen()
  185. {
  186. if(mbPortOpen)return;
  187. m_serialPort_RTK = new QSerialPort();
  188. m_serialPort_RTK->setPortName(mstrCOMName.data());
  189. m_serialPort_RTK->setBaudRate(mnBaudRate);
  190. m_serialPort_RTK->setParity(QSerialPort::NoParity);
  191. m_serialPort_RTK->setDataBits(QSerialPort::Data8);
  192. m_serialPort_RTK->setStopBits(QSerialPort::OneStop);
  193. m_serialPort_RTK->setFlowControl(QSerialPort::NoFlowControl);
  194. m_serialPort_RTK->setReadBufferSize(0);
  195. if(m_serialPort_RTK->open(QSerialPort::ReadWrite))
  196. {
  197. mbPortOpen = true;
  198. mpTimerPort->stop();
  199. }
  200. else
  201. {
  202. qDebug("Open RTK Port Fail. Port Name is %s BaudRate is %d ",mstrCOMName.data(),mnBaudRate);
  203. mbPortOpen = false;
  204. delete m_serialPort_RTK;
  205. mpTimerPort->setInterval(10000);
  206. }
  207. }
  208. void ntrip_client::ShowNtripMsg(QByteArray ba)
  209. {
  210. if(ba.size()<1)return;
  211. char * strout = 0;
  212. std::shared_ptr<char> str_ptr = std::shared_ptr<char>(new char[ba.size()*3 + 100]);
  213. strout = str_ptr.get();
  214. snprintf(strout,3000,"Ntrip msg len is %d info is: ",ba.length());
  215. char strtem[10];
  216. int nlen = ba.length();
  217. int i;
  218. for(i=0;i<nlen;i++)
  219. {
  220. snprintf(strtem,10,"%02X ",(unsigned char )ba.at(i));
  221. strncat(strout,strtem,10);
  222. }
  223. qDebug(strout);
  224. }