| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- #include "qt_pdu_msgq.h"
- #include <QDebug>
- #include <unistd.h>
- #include <sys/ipc.h>
- #include <qfile.h>
- qt_pdu_msgq::qt_pdu_msgq(QObject *parent) : QObject(parent)
- {
- /*
- // 尝试清理旧队列
- int msgid = msgget(key, 0666);
- if (msgid != -1) {
- struct msqid_ds buf;
- if (msgctl(msgid, IPC_STAT, &buf) == 0) {
- if (buf.msg_qnum > 0) {
- qWarning() << "Cleaning" << buf.msg_qnum << "stale messages";
- while(msgrcv(msgid, nullptr, 0, 0, IPC_NOWAIT) != -1);
- }
- msgctl(msgid, IPC_RMID, nullptr);
- }
- }
- */
- // 创建新队列
- // qDebug()<<"MSG INIT SUCCESS msgid"<<msgid;
- }
- void qt_pdu_msgq::startListening()
- {
- running = true;
- MsgData msg;
- while(running) {
- if(msgrcv(msgid, &msg, sizeof(msg)-sizeof(long),1,IPC_NOWAIT) > 0)
- {
- //emit newMessageReceived(msg.CtrlType, msg.nValue);
- }else
- {
- usleep(100000); // 100ms轮询
- }
- }
- }
- void qt_pdu_msgq::sendResponse(MsgData* pMSGData)
- {
- if(!pMSGData)
- {
- return;
- }
- const char* path = "/root/run/app/smartPDU_MSGQ";
- QFile::setPermissions(path, QFile::ReadOwner|QFile::WriteOwner|QFile::ReadGroup|QFile::WriteGroup|QFile::ReadOther|QFile::WriteOther);
- key_t key = ftok(path, 'Q');
- if (key == -1) {
- qCritical() << "ftok failed:" << strerror(errno);
- return;
- }
- msgid = msgget(key, 0666 | IPC_CREAT);
- if (msgid == -1) {
- qCritical() << "msgget failed:" << strerror(errno);
- return;
- }
- MsgData msg;
- msg=*pMSGData;
- msg.MsgType=1;
- qDebug()<<"MSGType="<<QString::number(msg.MsgType);
- qDebug()<<"CtrlType="<<QString::number(msg.CtrlType);
- // qDebug()<<"strData="<<QString::fromLocal8Bit(msg.strData);
- qDebug()<<"nValue1="<<QString::number(msg.nValue[0]);
- qDebug()<<"nValue2="<<QString::number(msg.nValue[1]);
- qDebug()<<"msgid="<<msgid;
- int r=msgsnd(msgid, &msg, sizeof(msg) - sizeof(long), IPC_NOWAIT);
- if( r<0) {
- qWarning() << "Qt send failed:" << strerror(errno);
- if(r<0) {
- qWarning()<<"msgsnd failed"<<r<<", errno:"<< errno;
- }
- else {
- qWarning()<<"msgsnd ok\n";
- }
- }
- }
- void qt_pdu_msgq::stopListening() {
- running = false;
- }
|