diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index fe674c5..a8ecb8b 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -1,4 +1,4 @@ -#include "FrequencyTuning.h" +#include "FrequencyTuning.h" #include #include @@ -7,9 +7,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index fe674c5..a8ecb8b 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -1,4 +1,4 @@ -#include "FrequencyTuning.h" +#include "FrequencyTuning.h" #include #include @@ -7,9 +7,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index c72544a..aa76efb 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -1,4 +1,4 @@ -#include "SignalGenerator.h" +#include "SignalGenerator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index fe674c5..a8ecb8b 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -1,4 +1,4 @@ -#include "FrequencyTuning.h" +#include "FrequencyTuning.h" #include #include @@ -7,9 +7,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index c72544a..aa76efb 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -1,4 +1,4 @@ -#include "SignalGenerator.h" +#include "SignalGenerator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp index b34c961..b15e2b7 100644 --- a/DevStatusAcq/device/TimeReplicator.cpp +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -1,4 +1,4 @@ -#include "TimeReplicator.h" +#include "TimeReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &TimeReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index fe674c5..a8ecb8b 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -1,4 +1,4 @@ -#include "FrequencyTuning.h" +#include "FrequencyTuning.h" #include #include @@ -7,9 +7,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index c72544a..aa76efb 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -1,4 +1,4 @@ -#include "SignalGenerator.h" +#include "SignalGenerator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp index b34c961..b15e2b7 100644 --- a/DevStatusAcq/device/TimeReplicator.cpp +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -1,4 +1,4 @@ -#include "TimeReplicator.h" +#include "TimeReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &TimeReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 004eeb4..0cf4bc7 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -1,4 +1,4 @@ -#include "TimeSwitcher.h" +#include "TimeSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &TimeSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 1011525..2758128 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -28,7 +28,7 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterDevice.cpp b/CounterAcq/CounterDevice.cpp index a8f4891..1aef95a 100644 --- a/CounterAcq/CounterDevice.cpp +++ b/CounterAcq/CounterDevice.cpp @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &CounterDevice::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); } CounterDevice::~CounterDevice() @@ -111,7 +111,7 @@ QJsonObject jsonObj = counterData->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } // 4. 在界面上简单显示相差数据结果 diff --git a/CounterAcq/CounterDevice.h b/CounterAcq/CounterDevice.h index 2e5f04e..3572d69 100644 --- a/CounterAcq/CounterDevice.h +++ b/CounterAcq/CounterDevice.h @@ -4,7 +4,7 @@ #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -34,7 +34,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; signals: diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index 133c113..31d43fd 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -43,7 +43,7 @@ this->deviceList.append(device); - device->initSerialPort(); +// device->initSerialPort(); // device->startWork(); } @@ -56,6 +56,16 @@ this->generateWidgetForDevice(devCodeList.at(i), i); } + httpReq = new HttpRequestController(this); + QJsonObject response = httpReq->getTokenByClientId(SettingConfig::getInstance().CLIENT_ID, + SettingConfig::getInstance().APP_KEY); + if (response.find("code")->toInt() == 200) + { + httpReq->initDictDeviceType(); + + httpReq->initDeviceList(); + } + // timer = new QTimer(this); // timer->start(1000 * 10); } @@ -65,42 +75,6 @@ delete ui; } -void CounterWindow::mockOneFrame() -{ - qlonglong deviceId = 9101; - - QKafkaUtil * kafkaUtil = new QKafkaUtil(this); - kafkaUtil->setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil->setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil->createProducer(); - - QDateTime now = QDateTime::currentDateTime(); - - QString frameId = QString("%1").arg(now.toSecsSinceEpoch() % 10000); - qlonglong ts = now.toMSecsSinceEpoch(); - - for (int i = 0; i < 16; i++) { - CounterDataDto channelDataDto; - - channelDataDto.devCode = deviceId; - - channelDataDto.frameId = frameId; - channelDataDto.channelData = qrand() % 400; - channelDataDto.channelRefId = 0; - channelDataDto.channelId = i; - channelDataDto.milisecond = ts; - channelDataDto.timestamp = now.toString("yyyyMMddHHmmssZZZ"); - - QJsonObject dtoJson = channelDataDto.toJSON(); - dtoJson.insert("clientId", SettingConfig::getInstance().CLIENT_ID); - dtoJson.insert("deviceId", deviceId); - - std::cout << QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact)).toStdString() << std::endl; - - kafkaUtil->produceMessage(QString(QJsonDocument(dtoJson).toJson(QJsonDocument::Compact))); - } -} - void CounterWindow::generateWidgetForDevice(QString devCode, int index) { // 顶部切换widget diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index d231f5d..88ec496 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -5,7 +5,8 @@ #include #include "common/utils/SettingConfig.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" +#include "common/HttpRequestController.h" #include "CounterDevice.h" namespace Ui { @@ -20,16 +21,16 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); + QString token; + public slots: void drawCounterDataOnPage(CounterDataDto * counterData); -private slots: - void mockOneFrame(); - private: Ui::CounterWindow *ui; QTimer * timer; + HttpRequestController * httpReq; QList devWidgetList; diff --git a/CounterAcq/common/ConstCache.h b/CounterAcq/common/ConstCache.h new file mode 100644 index 0000000..6cc831b --- /dev/null +++ b/CounterAcq/common/ConstCache.h @@ -0,0 +1,30 @@ +#ifndef CONSTCACHE_H +#define CONSTCACHE_H + +#include +#include +#include +#include + +class ConstCache : public QObject +{ + Q_OBJECT +public: + ~ConstCache() {}; + ConstCache(const ConstCache&)=delete; + ConstCache& operator=(const ConstCache&)=delete; + + static ConstCache& getInstance() { + static ConstCache instance; + return instance; + } + + QMap deviceTypes; + QList deviceList; + +private: + ConstCache() {}; + +}; + +#endif // CONSTCACHE_H diff --git a/CounterAcq/common/HttpRequestController.cpp b/CounterAcq/common/HttpRequestController.cpp new file mode 100644 index 0000000..500f902 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.cpp @@ -0,0 +1,145 @@ +#include "HttpRequestController.h" + +HttpRequestController::HttpRequestController(QObject *parent) : QObject(parent) +{ + httpUtil = new HttpRequestUtil(this); + baseUrl = SettingConfig::getInstance().getProperty("http", "baseUrl").toString(); + system = SettingConfig::getInstance().getProperty("client", "clientId").toString(); +} + +QJsonObject HttpRequestController::getTokenByClientId(QString clientId, QString key) +{ + QJsonObject resultObj; + + // 获取token的url地址 + QUrl url = baseUrl + "/getTokenByClientId"; + + // 请求对象 + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + + // 生成随机数作为salt + qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); + float random = (qrand() % 10000) / (float)10000; + QString salt = QByteUtil::binToHexString(QByteUtil::floatToBytes(random)); + QString clientSecret = clientId + "_" + key + "_" + salt; + + // MD5加密clientSecret + char secretEn[CHAR_MD5_LEN]; + MD5::MD5Encode(clientSecret.toStdString().data(), clientSecret.length(), secretEn); + QString secretMD5(secretEn); + + QJsonObject paramObj; + paramObj.insert("clientId", clientId); + paramObj.insert("salt", salt); + paramObj.insert("clientSecret", secretMD5); + QJsonDocument document; + document.setObject(paramObj); + QByteArray content = document.toJson(QJsonDocument::Compact); + + QNetworkReply *reply = httpUtil->sendPostRequest(request, content); + + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + QString token = resultObj.find("data")->toString(); + this->token = token; + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDictDeviceType() +{ + QJsonObject resultObj; + + // 获取字典值的接口地址 + QUrl url = baseUrl + "/sys/dict/code/deviceType"; + + // + QNetworkRequest request; + request.setUrl(url); + + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceTypes.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceTypes.insert(item.find("value")->toString(), item.find("name")->toString()); + } + } + + return resultObj; +} + +QJsonObject HttpRequestController::initDeviceList() +{ + QJsonObject resultObj; + + QString counterDevType = "01"; + QMapIterator it(ConstCache::getInstance().deviceTypes); + while (it.hasNext()) + { + it.next(); + if (it.value().contains("计数器") == true) + { + counterDevType = it.key(); + break; + } + } + + // 获取设备列表的接口地址 + QUrl url = baseUrl + "/device/list"; + QUrlQuery query; + query.addQueryItem("type", counterDevType); + url.setQuery(query); + + QNetworkRequest request; + request.setUrl(url); + request.setRawHeader("Content-type", "application/json"); + request.setRawHeader("token", token.toLocal8Bit()); + request.setRawHeader("system", system.toLocal8Bit()); + + QNetworkReply * reply = httpUtil->sendGetRequest(request); + const QByteArray reply_data = reply->readAll(); + QJsonDocument jsonDocument = QJsonDocument::fromJson(reply_data); + if( jsonDocument.isNull() == false ) { + resultObj = jsonDocument.object(); + } + + qDebug() << resultObj; + if (resultObj.find("code")->toInt() == 200) + { + ConstCache::getInstance().deviceList.clear(); + + QJsonArray data = resultObj.find("data")->toArray(); + for (int i = 0; i < data.size(); i++) + { + QJsonObject item = data.at(i).toObject(); + + ConstCache::getInstance().deviceList.append(item); + } + } + + return resultObj; +} diff --git a/CounterAcq/common/HttpRequestController.h b/CounterAcq/common/HttpRequestController.h new file mode 100644 index 0000000..46d9b84 --- /dev/null +++ b/CounterAcq/common/HttpRequestController.h @@ -0,0 +1,35 @@ +#ifndef HTTPREQUESTCONTROLLER_H +#define HTTPREQUESTCONTROLLER_H + +#include +#include + +#include "utils/HttpRequestUtil.h" +#include "utils/SettingConfig.h" +#include "utils/MD5.h" +#include "utils/QByteUtil.h" +#include "ConstCache.h" + +class HttpRequestController : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestController(QObject *parent = nullptr); + + QJsonObject getTokenByClientId(QString clientId, QString key); + QJsonObject initDictDeviceType(); + QJsonObject initDeviceList(); + +private: + HttpRequestUtil * httpUtil; + + QString baseUrl; + + QString token; + QString system; + +signals: + +}; + +#endif // HTTPREQUESTCONTROLLER_H diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index 055a2db..8f0aeae 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,10 +3,19 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp +SOURCES += $$PWD/utils/HttpRequestUtil.cpp +SOURCES += $$PWD/utils/MD5.cpp +SOURCES += $$PWD/HttpRequestController.cpp +SOURCES += HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h +HEADERS += $$PWD/utils/HttpRequestUtil.h +HEADERS += $$PWD/utils/DefHead.h +HEADERS += $$PWD/utils/MD5.h +HEADERS += $$PWD/HttpRequestController.h +HEADERS += $$PWD/ConstCache.h diff --git a/CounterAcq/common/utils/DefHead.h b/CounterAcq/common/utils/DefHead.h new file mode 100644 index 0000000..2171b0e --- /dev/null +++ b/CounterAcq/common/utils/DefHead.h @@ -0,0 +1,59 @@ +/***********************************************Copyright:Pluviophile******************************************/ +/**********************************************Email:1565203609@qq.com*****************************************/ +#pragma once + +#define _In_ +#define _Inout_ +#define SOCKET_ERROR -1 + +#define cu_long unsigned long +#define cu_char unsigned char +#define cu_int unsigned int +#define cu_short unsigned short + +#define __ERROR 0X00000 +#define __SUCCESS 0X00001 +//PE FILE DEFINE +#define __FILE_OPEN_ERROR 0X00002 +#define __FILE_READ_ERROR 0X00003 +#define __FILE_NO_PE 0X00004 +#define __FILE_NO_NT 0X00005 +#define __FILE_SAVE_ERROR 0X00006 +#define __FILE_WRITE_ERROR 0X00007 +#define __LASTSECTION_NO_NULL 0X00008 +#define __FILE_WRITESIZE_MISMATCH 0X00009 +#define __FILE_TOO_BIG 0X0000A + +#define __SECTION_SIZE 0X00028 + +#define __I386_FILE_MAX 0XFFFFFFFF + +//UDPSocket DEINE +#define __SOCK_WSAINIT_ERROR 0X0000B +#define __SOCK_INIT_ERROR __SOCK_WSAINIT_ERROR+1 +#define __SOCK_PORT_ERROR __SOCK_WSAINIT_ERROR+2 +#define __SOCK_IP_ERROR __SOCK_WSAINIT_ERROR+3 +#define __SOCK_LISTEN_ERROR __SOCK_WSAINIT_ERROR+4 +#define __SOCKET_CLOSE_ERROR __SOCK_WSAINIT_ERROR+5 +#define __SOCKET_LISTENNUM_TOOBIG __SOCK_WSAINIT_ERROR+6 +#define __SOCK_ACCEPT_ERROR __SOCK_WSAINIT_ERROR+7 +#define __SOCK_CONNECT_ERROR __SOCK_WSAINIT_ERROR+8 +#define __SOCK_IP_ISNULL __SOCK_WSAINIT_ERROR+9 +#define __SOCKET_NO_RECV __SOCK_WSAINIT_ERROR+10 +#define __SOCKET_SEND_ERROR __SOCK_WSAINIT_ERROR+11 +#define __SOCKET_RECV_ERROR __SOCK_WSAINIT_ERROR+12 + +//base64 +#define __BASE_NO_BASE64 0X00018 + +//SMTP +#define __SMTP_ERROR 0X00019 +#define __SMTP_HELO_ERROR __SMTP_ERROR+1 +#define __SMTP_AUTH_ERROR __SMTP_ERROR+2 +#define __SMTP_USERPASSWD_ERROR __SMTP_ERROR+3 +#define __SMTP_PASSWD_ERROR __SMTP_ERROR+4 +#define __SMTP_FROM_ERROR __SMTP_ERROR+5 +#define __SMTP_RECPTO_ERROR __SMTP_ERROR+6 +#define __SMTP_QUIT_ERROR __SMTP_ERROR+7 +#define __SMTP_DATAFLAG_ERROR __SMTP_ERROR+8 +#define __SMTP_EMAILSEND_ERROR __SMTP_ERROR+9 \ No newline at end of file diff --git a/CounterAcq/common/utils/HttpRequestUtil.cpp b/CounterAcq/common/utils/HttpRequestUtil.cpp new file mode 100644 index 0000000..e537083 --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.cpp @@ -0,0 +1,33 @@ +#include "HttpRequestUtil.h" + +HttpRequestUtil::HttpRequestUtil(QObject *parent) : QObject(parent) +{ + manager = new QNetworkAccessManager(this); +} + + +QNetworkReply * HttpRequestUtil::sendGetRequest(QNetworkRequest request) +{ + //发送请求 + QNetworkReply * reply = manager->get(request); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} + +QNetworkReply * HttpRequestUtil::sendPostRequest(QNetworkRequest request, QByteArray params) +{ + //发送请求 + QNetworkReply * reply = manager->post(request, params); + + // 同步等待 + QEventLoop eventLoop; + connect(manager, &QNetworkAccessManager::finished, &eventLoop, &QEventLoop::quit); + eventLoop.exec(); + + return reply; +} diff --git a/CounterAcq/common/utils/HttpRequestUtil.h b/CounterAcq/common/utils/HttpRequestUtil.h new file mode 100644 index 0000000..ee0478b --- /dev/null +++ b/CounterAcq/common/utils/HttpRequestUtil.h @@ -0,0 +1,28 @@ +#ifndef HTTPREQUESTUTIL_H +#define HTTPREQUESTUTIL_H + +#include +#include +#include +#include +#include +#include +#include +#include + +class HttpRequestUtil : public QObject +{ + Q_OBJECT +public: + explicit HttpRequestUtil(QObject *parent = nullptr); + + QNetworkAccessManager * manager; + + QNetworkReply * sendGetRequest(QNetworkRequest request); + QNetworkReply * sendPostRequest(QNetworkRequest request, QByteArray params); + +signals: + +}; + +#endif // HTTPREQUESTUTIL_H diff --git a/CounterAcq/common/utils/MD5.cpp b/CounterAcq/common/utils/MD5.cpp new file mode 100644 index 0000000..dc422ca --- /dev/null +++ b/CounterAcq/common/utils/MD5.cpp @@ -0,0 +1,144 @@ +#include"MD5.h" + +MD5::MD5() +{ + nullptr; +} + +void MD5::MD5Encode +( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst +) +{ + //用于存放最终结果,以便转化为字符串 + short output[16]; + char dest[16]; + memset(dest, 0, SHORT_MD5_LEN); + memset(dst, 0, CHAR_MD5_LEN); + //四组幻数 + unsigned int h[] = { 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476 }; + static const unsigned int k[64] = + { + 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, + 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501, + 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be, + 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821, + 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, + 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8, + 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed, + 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a, + 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, + 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70, + 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05, + 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665, + 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, + 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1, + 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1, + 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 + }; + //四轮循环(GG,FF,HH,II)每轮循环每一步所要位移的位数 + static const unsigned int qz[] = + { + 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, + 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, + 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, + 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21 + }; + //每一轮所要读取的元素下表 + static const unsigned int s[] = + { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 1, 6, 11, 0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, + 5, 8, 11, 14, 1, 4, 7, 10, 13, 0, 3, 6, 9, 12, 15, 2, + 0, 7, 14, 5, 12, 3, 10, 1, 8, 15, 6, 13, 4, 11, 2, 9 + }; + + unsigned int i = 0, j = 0; + //N*512+448 + //N=(数据长度+64(bit))/512(bit),长度+8是为了防止数据长度>=56 + //任意数据长度+64bit刚好是512倍数,最后+8空出存放数据原始长度的位置 + size_t n_len = ((len + 8) / 64) * 64 + 56 + 8; + unsigned char *n_text = (unsigned char *)malloc(n_len); + memset(n_text, 0x00, n_len); + memcpy(n_text, text, len); + //末尾添加二进制1000 0000 + n_text[len] = 0x80; + //追加长度 + //注意此处末尾添加的是一个64位的数据!!! + unsigned char len_s[8]; + memset(len_s, 0x00, 8); + unsigned long temp_len = 0x00000000; + temp_len = (unsigned long)(len * 8); + //此处注意,只拷贝4个字节数据,因为 + //unsigned long只有四个字节 + memcpy(len_s, &temp_len, 4); + memcpy(n_text + (n_len-8), len_s, 8); + + //每64字节(512位) + //处理一次,因为填充过后的数刚好是64的倍数 + for (j = 0; j < n_len; j += 64) + { + unsigned int H[4] = { 0,0,0,0 }; + memcpy(H, h, 4 * sizeof(unsigned int)); + //分段拷贝内容,以供处理多组数据 + unsigned char temp_text[64]; + memset(temp_text, 0x00, 64); + memcpy(temp_text, n_text + j, 64); + + //一共循环64次,分为四组 + for (i = 0; i < 64; i++) + { + //四组非线性函数运算,用开关语句来判断是第几组 + // 0~16第一组,16~32第二组 + //32~48第三组,48~64第四组 + unsigned int R = 0, f = 0, tmp = 0; + switch ((int)i / 16) + { + //H[1]=X,H[2]=Y,H[3]=Z + //F(X,Y,Z) + case 0: f = (H[1] & H[2]) | ((~H[1]) & H[3]); break; + //G(X,Y,Z) + case 1: f = (H[3] & H[1]) | (H[2] & (~H[3])); break; + //H(X,Y,Z) + case 2: f = H[1] ^ H[2] ^ H[3]; break; + //I + case 3: f = H[2] ^ (H[1] | (~H[3])); break; + } + //abcd分别交换位置 + tmp = H[3]; + H[3] = H[2]; + H[2] = H[1]; + //R=(a+?(bcd)+M?+ti),四个字节一运算不是一个字节 + R = H[0] + f + k[i] + (((unsigned int *)temp_text)[s[i]]); + //b+((a+?(bcd)+M?+ti)<> (32 - qz[i]))); + H[0] = tmp; + } + //每轮循环结束后,ABCD分别与abcd相加 + for (i = 0; i < 4; i++) h[i] += H[i]; + } + + free(n_text); + memcpy(dest, h, 16); + + //与0xff位与将高位的ff变为00 + for (int i = 0; i < 16; i++) + output[i] = dest[i] & 0xff; + //将十六进制数据打印成字符串 + for (int i = 0; i < SHORT_MD5_LEN; i++) + sprintf(dst + i * 2, "%02x", output[i]); +} + + +bool MD5::MD5StrValidate +( + _In_ const char * input1, + _In_ const char * input2 +) +{ + if (strcmp(input1, input2) == 0) + return true; + return false; +} diff --git a/CounterAcq/common/utils/MD5.h b/CounterAcq/common/utils/MD5.h new file mode 100644 index 0000000..5d86d32 --- /dev/null +++ b/CounterAcq/common/utils/MD5.h @@ -0,0 +1,33 @@ +#ifndef MD5_H +#define MD5_H + +#include +#include +#include +#include"DefHead.h" + +#define SHORT_MD5_LEN 16 +#define CHAR_MD5_LEN 34 + + +class MD5 +{ +public: + explicit MD5(); + static void MD5Encode + ( + _In_ const char* text, + _In_ size_t len, + _Inout_ char* dst + ); + + static bool MD5StrValidate + ( + _In_ const char* input1, + _In_ const char* input2 + ); +private: + ; +}; + +#endif // !MD5_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index 67a8dd0..e9d136e 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -14,6 +14,9 @@ KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); CLIENT_ID = getProperty("client", "clientId").toString(); + APP_KEY = getProperty("client", "appKey").toString(); + + BASE_URL = getProperty("http", "baseUrl").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d10a4d..227d029 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -36,6 +36,9 @@ QString KAFKA_DATA_TOPIC; QString CLIENT_ID; + QString APP_KEY; + + QString BASE_URL; private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini index 0840fa9..0321e65 100644 --- a/CounterAcq/conf/config.ini +++ b/CounterAcq/conf/config.ini @@ -1,4 +1,4 @@ -[com] +[com] portNames="COM1,COM2,COM3" devCodes="9101,9102,9103" baudRate=115200 @@ -9,4 +9,8 @@ dataTopic="cppTest" [client] -clientId="112233445566" +clientId="clock" +appKey="bd347bdd20943d2db8af558c3712a357" + +[http] +baseUrl="http://111.198.10.15:11410" diff --git a/DevStatusAcq/DevStatusAcq.pro b/DevStatusAcq/DevStatusAcq.pro index b4409bb..ee80867 100644 --- a/DevStatusAcq/DevStatusAcq.pro +++ b/DevStatusAcq/DevStatusAcq.pro @@ -1,4 +1,4 @@ -QT += core gui serialport +QT += core gui serialport network greaterThan(QT_MAJOR_VERSION, 4): QT += widgets @@ -34,9 +34,9 @@ else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target -INCLUDEPATH += $$PWD/include/librdkafka -DEPENDPATH += $$PWD/include/librdkafka +#INCLUDEPATH += $$PWD/include/librdkafka +#DEPENDPATH += $$PWD/include/librdkafka -unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ +#unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ DISTFILES += conf/config.ini diff --git a/DevStatusAcq/common/common.pri b/DevStatusAcq/common/common.pri index 055a2db..27ec57d 100644 --- a/DevStatusAcq/common/common.pri +++ b/DevStatusAcq/common/common.pri @@ -3,10 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.cpp -SOURCES += $$PWD/utils/QKafkaUtil.cpp +#SOURCES += $$PWD/utils/QKafkaUtil.cpp HEADERS += $$PWD/utils/SettingConfig.h HEADERS += $$PWD/utils/QByteUtil.h HEADERS += $$PWD/utils/QSerialPortUtil.h HEADERS += $$PWD/utils/QLogUtil.h -HEADERS += $$PWD/utils/QKafkaUtil.h +#HEADERS += $$PWD/utils/QKafkaUtil.h diff --git a/DevStatusAcq/device/BCodeTerminal.cpp b/DevStatusAcq/device/BCodeTerminal.cpp index f455e70..a299297 100644 --- a/DevStatusAcq/device/BCodeTerminal.cpp +++ b/DevStatusAcq/device/BCodeTerminal.cpp @@ -1,4 +1,4 @@ -#include "BCodeTerminal.h" +#include "BCodeTerminal.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &BCodeTerminal::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/DeviceBase.h b/DevStatusAcq/device/DeviceBase.h index 961f87f..a41b884 100644 --- a/DevStatusAcq/device/DeviceBase.h +++ b/DevStatusAcq/device/DeviceBase.h @@ -1,9 +1,9 @@ -#ifndef DEVICEBASE_H +#ifndef DEVICEBASE_H #define DEVICEBASE_H #include #include "common/utils/QSerialPortUtil.h" -#include "common/utils/QKafkaUtil.h" +//#include "common/utils/QKafkaUtil.h" #include "common/utils/QByteUtil.h" #include "common/utils/QLogUtil.h" #include "common/utils/SettingConfig.h" @@ -33,7 +33,7 @@ int baudRate; QSerialPortUtil serialUtil; - QKafkaUtil kafkaUtil; +// QKafkaUtil kafkaUtil; QByteArray dataBuff; DeviceStatusProtocolBase * protocol; diff --git a/DevStatusAcq/device/FreqReplicator.cpp b/DevStatusAcq/device/FreqReplicator.cpp index a096e68..6acfbb8 100644 --- a/DevStatusAcq/device/FreqReplicator.cpp +++ b/DevStatusAcq/device/FreqReplicator.cpp @@ -1,4 +1,4 @@ -#include "FreqReplicator.h" +#include "FreqReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FreqSwitcher.cpp b/DevStatusAcq/device/FreqSwitcher.cpp index c64e69e..23311ee 100644 --- a/DevStatusAcq/device/FreqSwitcher.cpp +++ b/DevStatusAcq/device/FreqSwitcher.cpp @@ -1,4 +1,4 @@ -#include "FreqSwitcher.h" +#include "FreqSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FreqSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,7 +73,7 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/FrequencyTuning.cpp b/DevStatusAcq/device/FrequencyTuning.cpp index fe674c5..a8ecb8b 100644 --- a/DevStatusAcq/device/FrequencyTuning.cpp +++ b/DevStatusAcq/device/FrequencyTuning.cpp @@ -1,4 +1,4 @@ -#include "FrequencyTuning.h" +#include "FrequencyTuning.h" #include #include @@ -7,9 +7,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &FrequencyTuning::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/SignalGenerator.cpp b/DevStatusAcq/device/SignalGenerator.cpp index c72544a..aa76efb 100644 --- a/DevStatusAcq/device/SignalGenerator.cpp +++ b/DevStatusAcq/device/SignalGenerator.cpp @@ -1,4 +1,4 @@ -#include "SignalGenerator.h" +#include "SignalGenerator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &SignalGenerator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -74,6 +74,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/TimeReplicator.cpp b/DevStatusAcq/device/TimeReplicator.cpp index b34c961..b15e2b7 100644 --- a/DevStatusAcq/device/TimeReplicator.cpp +++ b/DevStatusAcq/device/TimeReplicator.cpp @@ -1,4 +1,4 @@ -#include "TimeReplicator.h" +#include "TimeReplicator.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &TimeReplicator::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/DevStatusAcq/device/TimeSwitcher.cpp b/DevStatusAcq/device/TimeSwitcher.cpp index 004eeb4..0cf4bc7 100644 --- a/DevStatusAcq/device/TimeSwitcher.cpp +++ b/DevStatusAcq/device/TimeSwitcher.cpp @@ -1,4 +1,4 @@ -#include "TimeSwitcher.h" +#include "TimeSwitcher.h" #include #include @@ -8,9 +8,9 @@ connect(&this->serialUtil, &QSerialPortUtil::dataRecieved, this, &TimeSwitcher::dataReceivedHandler); - kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); - kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); - kafkaUtil.createProducer(); +// kafkaUtil.setBrokers(SettingConfig::getInstance().KAFKA_BROKERS); +// kafkaUtil.setTopic(SettingConfig::getInstance().KAFKA_DATA_TOPIC); +// kafkaUtil.createProducer(); this->protocol = DeviceStatusProtocolBase::deviceStatusProtocolFactory(typeid (this).name()); } @@ -73,6 +73,6 @@ QJsonObject jsonObj = frameDto->toJSON(); jsonObj.insert("clientId", SettingConfig::getInstance().CLIENT_ID); jsonObj.insert("deviceId", devCode); - kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); +// kafkaUtil.produceMessage(QString(QJsonDocument(jsonObj).toJson(QJsonDocument::Compact))); } } diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index ec3c2e5..196b1a8 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -3,7 +3,7 @@ #定义了ordered表示子项目按照添加的顺序来编译 #CONFIG += ordered -#SUBDIRS += CounterAcq #计数器数据采集 +SUBDIRS += CounterAcq #计数器数据采集 #SUBDIRS += PhaseCompAcq #比相仪数据采集 SUBDIRS += DevStatusAcq #SUBDIRS += HClockAcq #氢钟状态数据采集