Newer
Older
ZXSSCJ / DeviceHub / device / BCodeTerminal.cpp
tan yue on 23 Nov 2021 5 KB 20211123 B Term command
#include "BCodeTerminal.h"
#include "DeviceHubWindow.h"
#include <iostream>
#include <QDateTime>

BCodeTerminal::BCodeTerminal(QObject* parent) : DeviceBase(parent)
{
    this->devType = "07";
    connect(&this->serialUtil, &QSerialPortUtil::dataRecieved,
            this, &BCodeTerminal::dataReceivedHandler);

    connect(this, &BCodeTerminal::sendDataToDraw,
            ((DeviceHubWindow *)this->parent())->bCodeTermForm, &BCodeTerminalForm::drawDeviceFrameOnForm);
    connect(this, &BCodeTerminal::sendCommandToDisplay,
            ((DeviceHubWindow *)this->parent())->bCodeTermForm, &BCodeTerminalForm::displayDeviceCommandOnForm);

    connect(((DeviceHubWindow *)this->parent())->kafkaConsumer, &QKafkaConsumer::messageRecieved,
            this, &BCodeTerminal::commandReceivedHandler);

    kafkaProducer.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS);
    kafkaProducer.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC);
    kafkaProducer.createProducer();

    this->protocol = DeviceProtocolBase::deviceProtocolFactory(devType);
}

BCodeTerminal::~BCodeTerminal()
{
    disconnect(&this->serialUtil, &QSerialPortUtil::dataRecieved,
               this, &BCodeTerminal::dataReceivedHandler);
}

void BCodeTerminal::mockReceivData()
{
    QByteArray buffer;

    // b-code terminal
    buffer.append("$2621304-20 210100112100f90210.035422*");
    buffer.append("$3e21304-20 2101001111304-20 2101001210801H.1.00S.1.030008432*");

    this->dataReceivedHandler(buffer);
}

void BCodeTerminal::dataReceivedHandler(QByteArray data)
{
    this->dataBuff.append(data);

    std::cout << dataBuff.toStdString() << std::endl;

    QList<QByteArray> frameList = protocol->extractFrameList(this->dataBuff);

    if (frameList.size() > 0)
    {
        for (int i = 0; i < frameList.size(); i++)
        {
            QByteArray frameByte = frameList.at(i);

            int frameType = protocol->checkFrame(frameByte);
            DeviceFrameBaseDto * frameDto = protocol->frameFactory(frameType);
            if (frameDto != nullptr)
            {
                // ★解析成数据对象
                bool parse = protocol->parseDeviceFrameData(frameByte, frameDto, frameType);

                // 解析成功
                if (parse == true)
                {
                    QDateTime now = QDateTime::currentDateTime();
                    frameDto->timestamp = now.toString("yyyy-MM-dd HH:mm:ss.zzz");
                    frameDto->milisecond = now.toMSecsSinceEpoch();
                    frameDto->rawFrame = frameByte;

                    this->afterFramePhase(frameDto);
                }

                // 在此处释放内存,不影响后续显示
                // 不在此处释放内存则会导致内存持续增加
                // 具体原因不明
                delete frameDto;
            }
        }
    }
}

void BCodeTerminal::afterFramePhase(DeviceFrameBaseDto * 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", deviceId);
        kafkaProducer.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact)));
    }
}

void BCodeTerminal::sendDataToSerial(QByteArray data)
{
    data.append(FRAME_TAIL);
    this->serialUtil.sendData(data);

    // ��������
    // 0. ����������������
    QDateTime now = QDateTime::currentDateTime();
    QString date = now.toString("yyyy-MM-dd");

    // 1. ����������������
    QString filename = "raw_" + devCode + ".log";
    QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + data.left(data.size() - FRAME_TAIL.size());
    QLogUtil::writeRawDataLogByDate(date, filename, content);
}

void BCodeTerminal::commandReceivedHandler(QJsonObject command)
{
    if (command.contains("deviceType") == false || command.value("deviceType").toString() != "07")
    {
        std::cout << "device type [" << command.value("deviceType").toString().toStdString() << "] not matched. return" << std::endl;
        return;
    }

    if (command.contains("deviceId") == false || command.value("deviceId").toString() != deviceId)
    {
        std::cout << "deviceId [" << command.value("deviceId").toString().toStdString() << "] not matched. return" << std::endl;
        return;
    }

    // ��������
    // 0. ����������������
    QDateTime now = QDateTime::currentDateTime();
    QString date = now.toString("yyyy-MM-dd");

    // 1. ����������������
    QString filename = "frame_" + devCode + ".log";
    QString content = now.toString("yyyy-MM-dd HH:mm:ss.zzz") + " [send] " + command.find("cmdStr")->toString();
    QLogUtil::writeChannelDataLogByDate(date, filename, content);

    QByteArray commandBytes = protocol->generateSettingCommand(command.value("command").toString(), command.value("params").toString());
    this->sendDataToSerial(commandBytes);
    command.insert("rawCommand", QString::fromUtf8(commandBytes));

    QJsonObject cmdcb;
    cmdcb.insert("commandId", command.value("commandId").toString());
    cmdcb.insert("rawCommand", QString::fromUtf8(commandBytes));
    cmdcb.insert("status", "1");
    this->kafkaProducer.produceMessage(SettingConfig::getInstance().KAFKA_CMDCB_TOPIC, QString(QJsonDocument(cmdcb).toJson(QJsonDocument::Compact)));

    // display on page
    emit sendCommandToDisplay(command);
}