#include "SignalGenerator.h" #include <iostream> #include <QDateTime> SignalGenerator::SignalGenerator(QObject *parent) : QObject(parent) { connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); kafkaUtil.createProducer(); } SignalGenerator::~SignalGenerator() { disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); } void SignalGenerator::setComName(QString comName) { this->comName = comName; } void SignalGenerator::setBaudRate(int baudRate) { this->baudRate = baudRate; } QString SignalGenerator::getDevCode() { return this->devCode; } void SignalGenerator::setDevCode(QString devCode) { this->devCode = devCode; } bool SignalGenerator::isSerialOpen() { return this->serialUtil.isOpen(); } void SignalGenerator::initSerialPort() { this->serialUtil.openSerialPort(this->comName, this->baudRate); } void SignalGenerator::dataReceivedHandler(QByteArray data) { this->dataBuff.append(data); std::cout << dataBuff.toStdString() << std::endl; QList<QByteArray> frameList = SignalGeneratorProtocolBM::extractFrameList(this->dataBuff); if (frameList.size() > 0) { for (int i = 0; i < frameList.size(); i++) { QByteArray frameByte = frameList.at(i); int frameType = SignalGeneratorProtocolBM::checkFrame(frameByte); SignalGeneratorFrameDto * sgFrameDto = SignalGeneratorProtocolBM::sgFrameFactory(frameType); if (sgFrameDto != nullptr) { // ★解析成数据对象 bool parse = SignalGeneratorProtocolBM::parseSignalGeneratorData(frameByte, sgFrameDto, frameType); // 解析成功 if (parse == true) { QDateTime now = QDateTime::currentDateTime(); sgFrameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz"); sgFrameDto->milisecond = now.toMSecsSinceEpoch(); sgFrameDto->rawFrame = frameByte; this->afterFramePhase(sgFrameDto); } // 在此处释放内存,不影响后续显示 // 不在此处释放内存则会导致内存持续增加 // 具体原因不明 delete sgFrameDto; } } } } void SignalGenerator::afterFramePhase(SignalGeneratorFrameDto * frameDto) { std::cout << "frame type: " << typeid(* frameDto).name() << std::endl; std::cout << frameDto->rawFrame.toStdString() << std::endl; // 3. 输出到中间件,执行后续处理过程 if (SettingConfig::getInstance().NEED_KAFKA == 1) { QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } }