You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PayloadAPP/Src/ModelCamera/encodemodelcamera.cpp

60 lines
1.8 KiB
C++

#include "encodemodelcamera.h"
#include "global.h"
EncodeModelCamera::EncodeModelCamera(QObject *parent) : QObject{parent} {
cameraUDP = new QUdpSocket(this);
// cameraUDP->bind(QHostAddress("172.10.1.104"), 8899);
cmdArray.insert(0, 0xFA);
cmdArray.insert(1, 0xFA);
connect(cameraUDP, SIGNAL(readyRead()), this, SLOT(ReadData()));
}
void EncodeModelCamera::SendCMD(QByteArray cmdDataArray) {
cmdArray.clear();
cmdArray.insert(0, 0xFA);
cmdArray.insert(1, 0xFA);
cmdArray.append(cmdDataArray);
uint8_t *data = reinterpret_cast<uint8_t *>(cmdArray.data());
uint16_t crc16 = calCRC16(data, cmdArray.size());
QByteArray byteArray;
QDataStream stream(&byteArray, QIODevice::WriteOnly);
stream.setByteOrder(QDataStream::BigEndian);
stream << crc16;
cmdArray.append(byteArray);
cameraUDP->writeDatagram(cmdArray, QHostAddress(m_net.remoteIp),
m_net.remotePort);
}
// upd socket收到数据
void EncodeModelCamera::ReadData() {
QByteArray array;
QHostAddress address;
quint16 port;
array.resize(cameraUDP->bytesAvailable()); // 根据可读数据来设置空间大小
cameraUDP->readDatagram(array.data(), array.size(), &address,
&port); // 读取数据
// 校验
int len = array.size();
if (len <= 2) {
return;
}
uint8_t *data = reinterpret_cast<uint8_t *>(array.data());
uint16_t crc16 = calCRC16(data, array.size() - 2);
uint16_t Rcrc = (array[len - 2] << 8) | array[len - 1];
if (crc16 == Rcrc) {
emit UDP_Receive(array);
}
cameraUDP->writeDatagram(cmdArray, QHostAddress(m_net.remoteIp),
m_net.remotePort);
}
void EncodeModelCamera::setIPandPort(netStruct net) {
m_net = net;
// 断开 重连
cameraUDP->abort();
cameraUDP->bind(QHostAddress(m_net.localIp), m_net.localPort);
}