You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

NetDataRecv.cpp 2.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. #include "NetDataRecv.h"
  2. #include <QNetworkDatagram>
  3. NetDataRecv::NetDataRecv(QObject* parent)
  4. : QThread(parent)
  5. , m_bNeedWork(false)
  6. , m_pProcess(nullptr)
  7. , m_pFrame(nullptr)
  8. , m_socketId(nullptr)
  9. {
  10. m_network.ip = "";
  11. m_network.port = 0;
  12. m_network.type = 0;
  13. }
  14. NetDataRecv::~NetDataRecv()
  15. {
  16. m_file.write(m_fileArray);
  17. m_file.flush();
  18. m_file.close();
  19. }
  20. void NetDataRecv::init(Frame* frame, Network network, IProcess* process)
  21. {
  22. m_pFrame = frame;
  23. m_network = network;
  24. m_pProcess = process;
  25. createDataPath("Network");
  26. initNetwork();
  27. }
  28. void NetDataRecv::createDataPath(QString title)
  29. {
  30. QString strFilePath = m_pFrame->m_dataStore.m_strDataPath + "/" + title + "_"
  31. + m_pFrame->m_dataStore.m_strStoreType + "_"
  32. + m_pFrame->m_dataStore.m_strDateTime + ".bin";
  33. m_file.setFileName(strFilePath);
  34. m_file.open(QIODevice::WriteOnly);
  35. }
  36. void NetDataRecv::initNetwork()
  37. {
  38. // 创建用于监听的套接字
  39. m_socketId = new QUdpSocket(this);
  40. m_socketId->bind(QHostAddress::AnyIPv4, m_network.port,
  41. QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint);
  42. // 设置套接字缓冲区: 1M
  43. m_socketId->setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, NET_BUFFER);
  44. // 组播
  45. if (m_network.type == 2) {
  46. m_socketId->joinMulticastGroup(QHostAddress(m_network.ip));
  47. m_socketId->setSocketOption(QAbstractSocket::MulticastLoopbackOption, true);
  48. }
  49. }
  50. void NetDataRecv::send()
  51. {
  52. QByteArray sendArray;
  53. m_socketId->writeDatagram(sendArray, QHostAddress(m_network.ip), m_network.port);
  54. }
  55. void NetDataRecv::run()
  56. {
  57. m_bNeedWork = true;
  58. while (m_bNeedWork) {
  59. // 接收数据
  60. QNetworkDatagram datagram = m_socketId->receiveDatagram(NET_BUFFER);
  61. if (!datagram.isValid()) {
  62. QThread::usleep(1);
  63. continue;
  64. }
  65. auto recvdata = datagram.data();
  66. // 将数据放到缓冲区
  67. if (m_pProcess) {
  68. QMutexLocker locker(&m_mutex);
  69. m_pProcess->getConstBuffer()->write((unsigned char*)recvdata.data(),
  70. (unsigned short)recvdata.size());
  71. m_fileArray.append((char*)recvdata.data(), recvdata.size());
  72. if (DataAchiveBuffer <= m_fileArray.size()) {
  73. m_file.write(m_fileArray);
  74. m_file.flush();
  75. m_fileArray.clear();
  76. }
  77. }
  78. }
  79. }
  80. void NetDataRecv::stop()
  81. {
  82. m_bNeedWork = false;
  83. quit();
  84. wait();
  85. if (m_network.type == 2) {
  86. m_socketId->leaveMulticastGroup(QHostAddress(m_network.ip));
  87. }
  88. delete m_socketId;
  89. m_socketId = nullptr;
  90. }