diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d68710..8f752a0 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -31,6 +31,11 @@ int BAUD_RATE; QString DEV_CODES; + QString KAFKA_BROKERS; + QString KAFKA_DATA_TOPIC; + + QString CLIENT_ID; + private: SettingConfig(); diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d68710..8f752a0 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -31,6 +31,11 @@ int BAUD_RATE; QString DEV_CODES; + QString KAFKA_BROKERS; + QString KAFKA_DATA_TOPIC; + + QString CLIENT_ID; + private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini new file mode 100644 index 0000000..1430594 --- /dev/null +++ b/CounterAcq/conf/config.ini @@ -0,0 +1,11 @@ +[com] +portNames="COM1,COM2,COM3" +devCodes="9101,9102,9103" +baudRate=115200 + +[kafka] +brokers="111.198.10.15:12502" +dataTopic="clock-data" + +[client] +clientId="112233445566" diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d68710..8f752a0 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -31,6 +31,11 @@ int BAUD_RATE; QString DEV_CODES; + QString KAFKA_BROKERS; + QString KAFKA_DATA_TOPIC; + + QString CLIENT_ID; + private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini new file mode 100644 index 0000000..1430594 --- /dev/null +++ b/CounterAcq/conf/config.ini @@ -0,0 +1,11 @@ +[com] +portNames="COM1,COM2,COM3" +devCodes="9101,9102,9103" +baudRate=115200 + +[kafka] +brokers="111.198.10.15:12502" +dataTopic="clock-data" + +[client] +clientId="112233445566" diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3ceb810..c86988a 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -1,6 +1,23 @@ #include "CounterDataDto.h" +#include "common/utils/SettingConfig.h" CounterDataDto::CounterDataDto(QObject *parent) : QObject(parent) { } + +QJsonObject CounterDataDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", this->channelData); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", this->channelId); + jsonObj.insert("js", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d68710..8f752a0 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -31,6 +31,11 @@ int BAUD_RATE; QString DEV_CODES; + QString KAFKA_BROKERS; + QString KAFKA_DATA_TOPIC; + + QString CLIENT_ID; + private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini new file mode 100644 index 0000000..1430594 --- /dev/null +++ b/CounterAcq/conf/config.ini @@ -0,0 +1,11 @@ +[com] +portNames="COM1,COM2,COM3" +devCodes="9101,9102,9103" +baudRate=115200 + +[kafka] +brokers="111.198.10.15:12502" +dataTopic="clock-data" + +[client] +clientId="112233445566" diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3ceb810..c86988a 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -1,6 +1,23 @@ #include "CounterDataDto.h" +#include "common/utils/SettingConfig.h" CounterDataDto::CounterDataDto(QObject *parent) : QObject(parent) { } + +QJsonObject CounterDataDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", this->channelData); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", this->channelId); + jsonObj.insert("js", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 96dd4c0..3008f48 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -2,6 +2,8 @@ #define COUNTERDATADTO_H #include +#include +#include class CounterDataDto : public QObject { @@ -12,7 +14,7 @@ QString frameId; // 帧ID -- <8> double level; // 触发电平浮点数 -- <7> QString load; // 负载(0=50欧姆,1=1M欧姆) -- <6> - qulonglong channelData; // 通道测量数据,单位:10ps -- <5> + qlonglong channelData; // 通道测量数据,单位:10ps -- <5> qint8 channelRefId; // 参考通道号 -- <4> qint8 channelActive; // 通道有效标志 -- <3> qint8 channelId; // 测量通道号 -- <2> @@ -21,10 +23,12 @@ QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 - qulonglong milisecond; // 毫秒计数 + qlonglong milisecond; // 毫秒计数 QString devCode; QString devStatus; + QJsonObject toJSON(); + signals: }; diff --git a/CounterAcq/CounterAcq.pro b/CounterAcq/CounterAcq.pro index 061f942..1011525 100644 --- a/CounterAcq/CounterAcq.pro +++ b/CounterAcq/CounterAcq.pro @@ -21,7 +21,14 @@ SOURCES += CounterDevice.cpp +DISTFILES += conf/config.ini + # Default rules for deployment. qnx: target.path = /tmp/$${TARGET}/bin else: unix:!android: target.path = /opt/$${TARGET}/bin !isEmpty(target.path): INSTALLS += target + +unix:!macx: LIBS += -L$$PWD/lib/librdkafka/ -lrdkafka -lrdkafka++ + +INCLUDEPATH += $$PWD/include/librdkafka +DEPENDPATH += $$PWD/include/librdkafka diff --git a/CounterAcq/CounterWindow.cpp b/CounterAcq/CounterWindow.cpp index bc94305..4bad032 100644 --- a/CounterAcq/CounterWindow.cpp +++ b/CounterAcq/CounterWindow.cpp @@ -38,3 +38,8 @@ { delete ui; } + +void CounterWindow::on_pushButton_clicked() +{ + qlonglong deviceId = 9101; +} diff --git a/CounterAcq/CounterWindow.h b/CounterAcq/CounterWindow.h index 8bae180..c0f439d 100644 --- a/CounterAcq/CounterWindow.h +++ b/CounterAcq/CounterWindow.h @@ -17,6 +17,9 @@ explicit CounterWindow(QWidget *parent = nullptr); ~CounterWindow(); +private slots: + void on_pushButton_clicked(); + private: Ui::CounterWindow *ui; }; diff --git a/CounterAcq/CounterWindow.ui b/CounterAcq/CounterWindow.ui index 0b19cdd..60a7bac 100644 --- a/CounterAcq/CounterWindow.ui +++ b/CounterAcq/CounterWindow.ui @@ -1,7 +1,5 @@ + - - - CounterWindow @@ -15,7 +13,20 @@ Form + + + + 100 + 120 + 181 + 51 + + + + Mock ClockDiff Data + + - + diff --git a/CounterAcq/common/common.pri b/CounterAcq/common/common.pri index cbcd7e5..055a2db 100644 --- a/CounterAcq/common/common.pri +++ b/CounterAcq/common/common.pri @@ -3,8 +3,10 @@ SOURCES += $$PWD/utils/QByteUtil.cpp SOURCES += $$PWD/utils/QSerialPortUtil.cpp SOURCES += $$PWD/utils/QLogUtil.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 diff --git a/CounterAcq/common/utils/QKafkaUtil.cpp b/CounterAcq/common/utils/QKafkaUtil.cpp new file mode 100644 index 0000000..3f00452 --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.cpp @@ -0,0 +1,59 @@ +#include "QKafkaUtil.h" +#include + +QKafkaUtil::QKafkaUtil(QObject *parent) : QObject(parent) +{ + this->conf = RdKafka::Conf::create(RdKafka::Conf::CONF_GLOBAL); +} + +void QKafkaUtil::setBrokers(QString brokers) +{ + this->brokers = brokers; +} +void QKafkaUtil::setTopic(QString topic) +{ + this->topic = topic; +} + + +int QKafkaUtil::createProducer() +{ + int result; + result = this->conf->set("bootstrap.servers", this->brokers.toStdString(), errStr); + + if (result != RdKafka::Conf::CONF_OK) + { + std::cerr << errStr << std::endl; + + return RdKafka::Conf::CONF_INVALID; // -1 + } + + this->producer = RdKafka::Producer::create(this->conf, errStr); + if (producer == 0) + { + std::cerr << "Failed to create producer: " << errStr << std::endl; + return -2; + } + + result = 1; + return result; +} + +int QKafkaUtil::produceMessage(QString message) +{ + auto retCode = producer->produce(topic.toStdString(), RdKafka::Topic::PARTITION_UA, RdKafka::Producer::RK_MSG_COPY, + const_cast(message.toStdString().c_str()), message.size(), + nullptr, 0, 0, nullptr, nullptr); + + if (retCode != RdKafka::ERR_NO_ERROR) + { + std::cerr << "Failed to produce to topic " << topic.toStdString() << ": " << + RdKafka::err2str(retCode) << std::endl; + } else + { + std::cerr << "Enqueued message (" << message.size() << " bytes) " << + "for topic " << topic.toStdString() << "[" << message.toStdString() <<"]" << std::endl; + } + + return retCode; +} diff --git a/CounterAcq/common/utils/QKafkaUtil.h b/CounterAcq/common/utils/QKafkaUtil.h new file mode 100644 index 0000000..289ea6f --- /dev/null +++ b/CounterAcq/common/utils/QKafkaUtil.h @@ -0,0 +1,33 @@ +#ifndef QKAFKAUTIL_H +#define QKAFKAUTIL_H + +#include + +#include "include/librdkafka/rdkafkacpp.h" + +class QKafkaUtil : public QObject +{ + Q_OBJECT +public: + explicit QKafkaUtil(QObject *parent = nullptr); + + void setBrokers(QString brokers); + void setTopic(QString topic); + + int createProducer(); + int produceMessage(QString message); + +private: + QString brokers; + QString topic; + + std::string errStr; + + RdKafka::Conf * conf; + + RdKafka::Producer * producer = 0; +signals: + +}; + +#endif // QKAFKAUTIL_H diff --git a/CounterAcq/common/utils/SettingConfig.cpp b/CounterAcq/common/utils/SettingConfig.cpp index ef037c9..0c9d89d 100644 --- a/CounterAcq/common/utils/SettingConfig.cpp +++ b/CounterAcq/common/utils/SettingConfig.cpp @@ -8,6 +8,11 @@ PORT_NAMES = getProperty("com", "portNames").toString(); BAUD_RATE = getProperty("com", "baudRate").toUInt(); DEV_CODES = getProperty("com", "devCodes").toString(); + + KAFKA_BROKERS = getProperty("kafka", "brokers").toString(); + KAFKA_DATA_TOPIC = getProperty("kafka", "dataTopic").toString(); + + CLIENT_ID = getProperty("client", "clientId").toString(); } diff --git a/CounterAcq/common/utils/SettingConfig.h b/CounterAcq/common/utils/SettingConfig.h index 2d68710..8f752a0 100644 --- a/CounterAcq/common/utils/SettingConfig.h +++ b/CounterAcq/common/utils/SettingConfig.h @@ -31,6 +31,11 @@ int BAUD_RATE; QString DEV_CODES; + QString KAFKA_BROKERS; + QString KAFKA_DATA_TOPIC; + + QString CLIENT_ID; + private: SettingConfig(); diff --git a/CounterAcq/conf/config.ini b/CounterAcq/conf/config.ini new file mode 100644 index 0000000..1430594 --- /dev/null +++ b/CounterAcq/conf/config.ini @@ -0,0 +1,11 @@ +[com] +portNames="COM1,COM2,COM3" +devCodes="9101,9102,9103" +baudRate=115200 + +[kafka] +brokers="111.198.10.15:12502" +dataTopic="clock-data" + +[client] +clientId="112233445566" diff --git a/CounterAcq/protocol/dto/CounterDataDto.cpp b/CounterAcq/protocol/dto/CounterDataDto.cpp index 3ceb810..c86988a 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.cpp +++ b/CounterAcq/protocol/dto/CounterDataDto.cpp @@ -1,6 +1,23 @@ #include "CounterDataDto.h" +#include "common/utils/SettingConfig.h" CounterDataDto::CounterDataDto(QObject *parent) : QObject(parent) { } + +QJsonObject CounterDataDto::toJSON() +{ + QJsonObject jsonObj; + + QJsonObject dataObj; + dataObj.insert("channelRefNo", this->channelRefId); + dataObj.insert("dataValue", this->channelData); + dataObj.insert("frameId", this->frameId); + + jsonObj.insert("channelNo", this->channelId); + jsonObj.insert("js", this->milisecond); + jsonObj.insert("data", dataObj); + + return jsonObj; +} diff --git a/CounterAcq/protocol/dto/CounterDataDto.h b/CounterAcq/protocol/dto/CounterDataDto.h index 96dd4c0..3008f48 100644 --- a/CounterAcq/protocol/dto/CounterDataDto.h +++ b/CounterAcq/protocol/dto/CounterDataDto.h @@ -2,6 +2,8 @@ #define COUNTERDATADTO_H #include +#include +#include class CounterDataDto : public QObject { @@ -12,7 +14,7 @@ QString frameId; // 帧ID -- <8> double level; // 触发电平浮点数 -- <7> QString load; // 负载(0=50欧姆,1=1M欧姆) -- <6> - qulonglong channelData; // 通道测量数据,单位:10ps -- <5> + qlonglong channelData; // 通道测量数据,单位:10ps -- <5> qint8 channelRefId; // 参考通道号 -- <4> qint8 channelActive; // 通道有效标志 -- <3> qint8 channelId; // 测量通道号 -- <2> @@ -21,10 +23,12 @@ QByteArray rawFrame; // 原始帧字节数组 QString timestamp; // 时间戳字符串 - qulonglong milisecond; // 毫秒计数 + qlonglong milisecond; // 毫秒计数 QString devCode; QString devStatus; + QJsonObject toJSON(); + signals: }; diff --git a/ZXSSCJ.pro b/ZXSSCJ.pro index f1c0807..87b1bd3 100644 --- a/ZXSSCJ.pro +++ b/ZXSSCJ.pro @@ -5,5 +5,5 @@ SUBDIRS += CounterAcq #计数器数据采集 SUBDIRS += PhaseCompAcq #比相仪数据采集 -SUBDIRS += DevStatusAcq +#SUBDIRS += DevStatusAcq #SUBDIRS += HClockAcq #氢钟状态数据采集