diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3cd2078..711911f 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -23,6 +23,23 @@ return jsonObj; } +QJsonObject CounterDataDto::toJSON(int i) +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("rawValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", (i + 1)); + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} + void CounterDataDto::clone(CounterDataDto *copy) { copy->frameId = this->frameId; diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3cd2078..711911f 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -23,6 +23,23 @@ return jsonObj; } +QJsonObject CounterDataDto::toJSON(int i) +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("rawValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", (i + 1)); + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} + void CounterDataDto::clone(CounterDataDto *copy) { copy->frameId = this->frameId; diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 546fd02..ff19375 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -22,6 +22,9 @@ double channelClockValue; // + QList channelActiveArray; // xhts + QList channelDataArray; // xhts + QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 @@ -30,6 +33,7 @@ QString devStatus; QJsonObject toJSON(); + QJsonObject toJSON(int i); void clone(CounterDataDto * copy); signals: diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3cd2078..711911f 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -23,6 +23,23 @@ return jsonObj; } +QJsonObject CounterDataDto::toJSON(int i) +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("rawValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", (i + 1)); + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} + void CounterDataDto::clone(CounterDataDto *copy) { copy->frameId = this->frameId; diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 546fd02..ff19375 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -22,6 +22,9 @@ double channelClockValue; // + QList channelActiveArray; // xhts + QList channelDataArray; // xhts + QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 @@ -30,6 +33,7 @@ QString devStatus; QJsonObject toJSON(); + QJsonObject toJSON(int i); void clone(CounterDataDto * copy); signals: diff --git a/CounterAcq/protocol/protocol.pri b/CounterAcq/protocol/protocol.pri index fd0ab7d..8aa7808 100644 --- a/CounterAcq/protocol/protocol.pri +++ b/CounterAcq/protocol/protocol.pri @@ -1,6 +1,8 @@ -SOURCES += $$PWD/CounterProtocolBM.cpp +#SOURCES += $$PWD/CounterProtocolBM.cpp +SOURCES += $$PWD/CounterProtocolXH.cpp SOURCES += $$PWD/dto/CounterDataDto.cpp -HEADERS += $$PWD/CounterProtocolBM.h +#HEADERS += $$PWD/CounterProtocolBM.h +HEADERS += $$PWD/CounterProtocolXH.h HEADERS += $$PWD/dto/CounterDataDto.h diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3cd2078..711911f 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -23,6 +23,23 @@ return jsonObj; } +QJsonObject CounterDataDto::toJSON(int i) +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("rawValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", (i + 1)); + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} + void CounterDataDto::clone(CounterDataDto *copy) { copy->frameId = this->frameId; diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 546fd02..ff19375 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -22,6 +22,9 @@ double channelClockValue; // + QList channelActiveArray; // xhts + QList channelDataArray; // xhts + QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 @@ -30,6 +33,7 @@ QString devStatus; QJsonObject toJSON(); + QJsonObject toJSON(int i); void clone(CounterDataDto * copy); signals: diff --git a/CounterAcq/protocol/protocol.pri b/CounterAcq/protocol/protocol.pri index fd0ab7d..8aa7808 100644 --- a/CounterAcq/protocol/protocol.pri +++ b/CounterAcq/protocol/protocol.pri @@ -1,6 +1,8 @@ -SOURCES += $$PWD/CounterProtocolBM.cpp +#SOURCES += $$PWD/CounterProtocolBM.cpp +SOURCES += $$PWD/CounterProtocolXH.cpp SOURCES += $$PWD/dto/CounterDataDto.cpp -HEADERS += $$PWD/CounterProtocolBM.h +#HEADERS += $$PWD/CounterProtocolBM.h +HEADERS += $$PWD/CounterProtocolXH.h HEADERS += $$PWD/dto/CounterDataDto.h diff --git a/DeviceHub/TimeReplicatorForm.ui b/DeviceHub/TimeReplicatorForm.ui index c2f6ef4..68d2ce4 100644 --- a/DeviceHub/TimeReplicatorForm.ui +++ b/DeviceHub/TimeReplicatorForm.ui @@ -78,7 +78,7 @@ 20 - 290 + 250 100 30 diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index ad19c60..588b01d 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -6,6 +6,11 @@ CounterDevice::CounterDevice(QObject *parent) : QObject(parent) { + this->udpClient = new QUdpSocket(this); + udpClient->bind(QHostAddress("192.168.1.213"), 8089); + connect(udpClient, &QUdpSocket::readyRead, + this, &CounterDevice::dataReceivedHandlerByUDP); + connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); @@ -60,13 +65,13 @@ this->dataBuff.append(data); CounterDataDto * counterData = new CounterDataDto(this); - if (CounterProtocolBM::checkFrame(this->dataBuff) == true) + if (CounterProtocolXH::checkFrame(this->dataBuff) == true) { counterData->rawFrame = this->dataBuff; // std::cout << counterData->rawFrame.toStdString() << std::endl; // ★解析成数据对象 - bool parse = CounterProtocolBM::parseMessureData(this->dataBuff, counterData); + bool parse = CounterProtocolXH::parseMessureData(this->dataBuff, counterData); // 解析成功 if (parse == true) @@ -80,8 +85,10 @@ counterData->milisecond = now.toMSecsSinceEpoch(); counterData->devCode = devCode; + this->afterFramePhase(counterData); + // 3 计算数据ID一样的测量数据的时差值,通道值-参考通道值 - this->pushChannelRawFrame(counterData); +// this->pushChannelRawFrame(counterData); } } @@ -90,6 +97,20 @@ delete counterData; } +void CounterDevice::dataReceivedHandlerByUDP() +{ + + QByteArray ba; + while(udpClient->hasPendingDatagrams()) + { + ba.resize(udpClient->pendingDatagramSize()); + udpClient->readDatagram(ba.data(), ba.size()); + std::cout << ba.data() << std::endl; + } + + dataReceivedHandler(ba); +} + void CounterDevice::afterFramePhase(CounterDataDto * counterData) { // 0. 输出到日志文件中 @@ -97,10 +118,39 @@ // 1. 原始字节数组数据 QString filename = "raw_" + devCode + ".log"; - QString content = counterData->timestamp + " " + counterData->rawFrame.left(counterData->rawFrame.size() - COUNTER_FRAME_TAIL.size()); + QString content = counterData->timestamp + " " + counterData->rawFrame; QLogUtil::writeRawDataLogByDate(date, filename, content); // 2. 各个通道的clock diff数据 + for (int i = 1; i <= counterData->channelActiveArray.size(); i++) + { + if (counterData->channelActiveArray.at(i-1).toUInt() == 1) + { + QString chFilename("%1_CH_%2.log"); + chFilename = chFilename.arg(devCode); + if (i < 10) + { + chFilename = chFilename.arg(QString("0%1").arg(i)); + } else + { + chFilename = chFilename.arg(i); + } + QString channelDataStr = QString("%1 [%2] %3").arg(counterData->timestamp).arg(counterData->frameId).arg(counterData->channelDataArray.at(i-1)); + + QLogUtil::writeChannelDataLogByDate(date, chFilename, channelDataStr); + + // 3. 输出到中间件,执行后续处理过程 + if (SettingConfig::getInstance().NEED_KAFKA == 1) + { + QJsonObject jsonObj = counterData->toJSON(i - 1); + jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); + jsonObj.insert("deviceId", deviceId); + kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); + } + } + } + + /* QString chFilename("%1_CH_%2.log"); chFilename = chFilename.arg(devCode); if (counterData->channelId < 10) @@ -125,6 +175,7 @@ jsonObj.insert("deviceId", deviceId); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } + */ // 4. 在界面上简单显示相差数据结果 emit this->sendDataToDraw(counterData); diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 654a96d..4db2f79 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -2,13 +2,14 @@ #define COUNTERDEVICE_H #include +#include #include "common/utils/QSerialPortUtil.h" #include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" -#include "protocol/CounterProtocolBM.h" +#include "protocol/CounterProtocolXH.h" class CounterDevice : public QObject { @@ -36,6 +37,7 @@ QSerialPortUtil serialUtil; QKafkaUtil kafkaUtil; QByteArray dataBuff; + QUdpSocket * udpClient; QMap bench; QList hisList; @@ -48,6 +50,7 @@ public slots: void dataReceivedHandler(QByteArray data); + void dataReceivedHandlerByUDP(); void afterFramePhase(CounterDataDto * counterData); }; diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index a50ebcf..1dc37bf 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -55,7 +55,7 @@ // 4. 将获取到的设备添加到下拉列表框中 QJsonArray devArray = devListRes.find("data")->toArray(); - for (int i =0; i < devArray.size(); i++) + for (int i =0; i < 1; i++) { QJsonObject devItem = devArray.at(i).toObject(); ui->devSelect->addItem(devItem.find("deviceName")->toString(), devItem.find("deviceNo")->toString()); @@ -71,7 +71,7 @@ connect(device, &CounterDevice::sendDataToDraw, this, &CounterWindow::drawCounterDataOnPage); - device->initSerialPort(); +// device->initSerialPort(); QThread::msleep(200); } @@ -204,6 +204,20 @@ // 1. 判断数据属于哪个设备,显示在不同的widget上 // qDebug() << counterData->toJSON() << counterData->devCode << "---" << counterData->frameId; + // 更新所有通道BOX的值 + for (int i = 0; i < counterData->channelDataArray.size(); i++) + { + // 获取对应的通道BOX + QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(i + 1); + + // 赋值,对应的lineEdit/label + ((QLineEdit *)channelBox->children().at(2))->setText(counterData->timestamp); + ((QLineEdit *)channelBox->children().at(4))->setText(QString("%1 s").arg(counterData->channelDataArray.at(i))); + ((QLineEdit *)channelBox->children().at(6))->setText(counterData->frameId); + ((QLineEdit *)channelBox->children().at(8))->setText(QString("%1").arg(counterData->channelRefId)); + ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActiveArray.at(i) == "1" ? "有效" : "无效"); + } + /* // 获取对应的通道BOX QGroupBox * channelBox = (QGroupBox *)ui->scrollContents->children().at(counterData->channelId); @@ -215,6 +229,7 @@ ((QLineEdit *)channelBox->children().at(10))->setText(QString("%1 Ω").arg(counterData->load == 1 ? "1M" : "50")); ((QLineEdit *)channelBox->children().at(12))->setText(QString("%1 V").arg(counterData->level)); ((QLabel *)channelBox->children().at(13))->setText(counterData->channelActive == 1 ? "有效" : "无效"); + */ } int CounterWindow::initHttpToken() diff --git a/CounterAcq/common/utils/QSerialPortUtil.cpp b/CounterAcq/common/utils/QSerialPortUtil.cpp index 2da13b2..1710f93 100644 --- a/CounterAcq/common/utils/QSerialPortUtil.cpp +++ b/CounterAcq/common/utils/QSerialPortUtil.cpp @@ -58,21 +58,58 @@ void QSerialPortUtil::mockReceivData() { QDateTime now = QDateTime::currentDateTime(); - for (int i = 1; i <= 8; i++) + + QByteArray buffer; + buffer.append("$XHTS"); + buffer.append("03100010"); + buffer.append(now.toString("yyMMddHHmmss")); + buffer.append("276"); + + qsrand(QDateTime::currentDateTime().toMSecsSinceEpoch()); + + QByteArray statusBuff; + QByteArray dataBuff; + + QString validStr = "1111010111001011"; + + statusBuff.append("|").append("1").append(validStr.toLocal8Bit()).append("01"); + dataBuff.append("|").append("+0.000000000112"); + + for (int i = 1; i < 16; i++) { - QByteArray buffer; + int valid = validStr.mid(i, 1).toInt(); + int zero = qrand() % 2; + double data = qrand() % 200 * 1e-12; - QString channel = QString("%1").arg(i); - QString channelRef = "1"; - QString dataValue = QString("%1").arg(qrand() % 400); - QString level = QString("%1").arg(qrand() % 4 / (double) 10); - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - - buffer.append("$GL,") - .append("0,").append(channel + ",").append("1,").append(channelRef + ",") - .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") - .append("00").append("\r\n"); - - emit dataRecieved(buffer); + dataBuff.append("|"); + if (valid == 0) + { + dataBuff.append("+0.000000000000"); + } else + { + dataBuff.append(zero == 0 ? "+" : "-"); + dataBuff.append(QString::number(data, 'f', 12)); + } } + + buffer.append(statusBuff).append(dataBuff).append("0"); + + emit dataRecieved(buffer); +// for (int i = 1; i <= 8; i++) +// { +// QByteArray buffer; + +// QString channel = QString("%1").arg(i); +// QString channelRef = "1"; +// QString dataValue = QString("%1").arg(qrand() % 400); +// QString level = QString("%1").arg(qrand() % 4 / (double) 10); +// QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); + +// buffer.append("$GL,") +// .append("0,").append(channel + ",").append("1,").append(channelRef + ",") +// .append(dataValue + ",").append("1,").append(level + ",").append(frameId + "*") +// .append("00").append("\r\n"); + +// emit dataRecieved(buffer); +// } } diff --git a/CounterAcq/protocol/CounterProtocolXH.cpp b/CounterAcq/protocol/CounterProtocolXH.cpp new file mode 100644 index 0000000..dd09067 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.cpp @@ -0,0 +1,75 @@ +#include "CounterProtocolXH.h" + +CounterProtocolXH::CounterProtocolXH(QObject *parent) : QObject(parent) +{ + +} + +bool CounterProtocolXH::parseMessureData(QByteArray rawData, CounterDataDto * counterData) +{ + int start = rawData.indexOf(COUNTER_FRAME_CONTENT_SEP); + int dataLen = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH + COUNTER_FRAME_TIME_LENGTH, 3).toInt(); + + QString dataTime = rawData.mid(COUNTER_FRAME_HEAD.size() + COUNTER_FRAME_DEVCODE_LENGTH, COUNTER_FRAME_TIME_LENGTH); + QString frameId = dataTime.mid(6, 6); + counterData->frameId = frameId; + + QByteArray content = rawData.mid(start + 1, dataLen - 1); + QString contentStr = QString(content); + QStringList subList = contentStr.split(COUNTER_FRAME_CONTENT_SEP); + + QString statusStr = subList.at(0); + QString channelStatus = statusStr.mid(1, COUNTER_MESSURE_CHANNEL); + int channelRefNo = statusStr.mid(17, 2).toInt(); + counterData->channelRefId = channelRefNo; + + for (int i = 0; i < COUNTER_MESSURE_CHANNEL; i++) + { + if (channelRefNo - 1 == i) + { + // ref channel + counterData->channelActiveArray.append("1"); + counterData->channelDataArray.append(0.00); + } else + { + // not ref channel + counterData->channelActiveArray.append(channelStatus.mid(i, 1)); + if (channelStatus.mid(i, 1) == "0") + { + counterData->channelDataArray.append(0.00); + } else + { + counterData->channelDataArray.append(subList.at(i + 1).toDouble()); + } + } + } + +// counterData->type = subList.at(0).toUInt(); +// counterData->channelId = subList.at(1).toUInt(); +// counterData->channelActive = subList.at(2).toUInt(); +// counterData->channelRefId = subList.at(3).toUInt(); +// counterData->channelData = subList.at(4).toLongLong(); +// counterData->load = subList.at(5); +// counterData->level = subList.at(6).toDouble(); +// counterData->frameId = subList.at(7); + + return true; +} + + +bool CounterProtocolXH::checkFrame(QByteArray rawData) +{ + // 帧长度小于最小的长度 + if (rawData.size() < COUNTER_FRAME_MIN_LENGTH) + { + return false; + } + + // 帧头不是$GL + if (COUNTER_FRAME_HEAD.toLocal8Bit() != rawData.mid(0, COUNTER_FRAME_HEAD.size())) + { + return false; + } + + return true; +} diff --git a/CounterAcq/protocol/CounterProtocolXH.h b/CounterAcq/protocol/CounterProtocolXH.h new file mode 100644 index 0000000..9af82f5 --- /dev/null +++ b/CounterAcq/protocol/CounterProtocolXH.h @@ -0,0 +1,38 @@ +#ifndef COUNTERPROTOCOLXH_H +#define COUNTERPROTOCOLXH_H + +#include + +#include "dto/CounterDataDto.h" + +static const QString COUNTER_FRAME_HEAD = "$XHTS"; // 帧头 +static const QString COUNTER_FRAME_CONTENT_SEP = "|"; // 帧内分隔符 + +static const int COUNTER_FRAME_DEVCODE_LENGTH = 8; +static const int COUNTER_FRAME_TIME_LENGTH = 12; +static const int COUNTER_FRAME_DTLEN_LENGTH = 3; +static const int COUNTER_FRAME_SUM_LENGTH = 1; +static const int COUNTER_MESSURE_CHANNEL = 16; + +static const int COUNTER_FRAME_MIN_LENGTH = COUNTER_FRAME_HEAD.length() + + COUNTER_FRAME_DEVCODE_LENGTH + + COUNTER_FRAME_TIME_LENGTH + + COUNTER_FRAME_DTLEN_LENGTH + + COUNTER_FRAME_SUM_LENGTH; + +class CounterProtocolXH : public QObject +{ + Q_OBJECT +public: + explicit CounterProtocolXH(QObject *parent = nullptr); + + // 解析计数器测量数据 + static bool parseMessureData(QByteArray rawData, CounterDataDto * counterData); + + // 检测帧格式,帧头帧尾 + static bool checkFrame(QByteArray rawData); +signals: + +}; + +#endif // COUNTERPROTOCOLXH_H diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3cd2078..711911f 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -23,6 +23,23 @@ return jsonObj; } +QJsonObject CounterDataDto::toJSON(int i) +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("rawValue", QString("%1").arg(this->channelDataArray.at(i))); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", (i + 1)); + jsonObj.insert("ts", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} + void CounterDataDto::clone(CounterDataDto *copy) { copy->frameId = this->frameId; diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 546fd02..ff19375 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -22,6 +22,9 @@ double channelClockValue; // + QList channelActiveArray; // xhts + QList channelDataArray; // xhts + QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 @@ -30,6 +33,7 @@ QString devStatus; QJsonObject toJSON(); + QJsonObject toJSON(int i); void clone(CounterDataDto * copy); signals: diff --git a/CounterAcq/protocol/protocol.pri b/CounterAcq/protocol/protocol.pri index fd0ab7d..8aa7808 100644 --- a/CounterAcq/protocol/protocol.pri +++ b/CounterAcq/protocol/protocol.pri @@ -1,6 +1,8 @@ -SOURCES += $$PWD/CounterProtocolBM.cpp +#SOURCES += $$PWD/CounterProtocolBM.cpp +SOURCES += $$PWD/CounterProtocolXH.cpp SOURCES += $$PWD/dto/CounterDataDto.cpp -HEADERS += $$PWD/CounterProtocolBM.h +#HEADERS += $$PWD/CounterProtocolBM.h +HEADERS += $$PWD/CounterProtocolXH.h HEADERS += $$PWD/dto/CounterDataDto.h diff --git a/DeviceHub/TimeReplicatorForm.ui b/DeviceHub/TimeReplicatorForm.ui index c2f6ef4..68d2ce4 100644 --- a/DeviceHub/TimeReplicatorForm.ui +++ b/DeviceHub/TimeReplicatorForm.ui @@ -78,7 +78,7 @@ 20 - 290 + 250 100 30 diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index 0ae1660..9c26cb8 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -3,8 +3,8 @@ #定义了ordered表示子项目按照添加的顺序来编译 #CONFIG += ordered -#SUBDIRS += CounterAcq #计数器数据采集 -#SUBDIRS += PhaseCompAcq #比相仪数据采集 +SUBDIRS += CounterAcq #计数器数据采集 +SUBDIRS += PhaseCompAcq #比相仪数据采集 #SUBDIRS += DevStatusAcq SUBDIRS += DeviceHub # #SUBDIRS += HClockAcq #氢钟状态数据采集