qt_pdu_msgq.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. #include "qt_pdu_msgq.h"
  2. #include <QDebug>
  3. #include <unistd.h>
  4. #include <sys/ipc.h>
  5. #include <qfile.h>
  6. qt_pdu_msgq::qt_pdu_msgq(QObject *parent) : QObject(parent)
  7. {
  8. /*
  9. // 尝试清理旧队列
  10. int msgid = msgget(key, 0666);
  11. if (msgid != -1) {
  12. struct msqid_ds buf;
  13. if (msgctl(msgid, IPC_STAT, &buf) == 0) {
  14. if (buf.msg_qnum > 0) {
  15. qWarning() << "Cleaning" << buf.msg_qnum << "stale messages";
  16. while(msgrcv(msgid, nullptr, 0, 0, IPC_NOWAIT) != -1);
  17. }
  18. msgctl(msgid, IPC_RMID, nullptr);
  19. }
  20. }
  21. */
  22. // 创建新队列
  23. // qDebug()<<"MSG INIT SUCCESS msgid"<<msgid;
  24. }
  25. void qt_pdu_msgq::startListening()
  26. {
  27. running = true;
  28. MsgData msg;
  29. while(running) {
  30. if(msgrcv(msgid, &msg, sizeof(msg)-sizeof(long),1,IPC_NOWAIT) > 0)
  31. {
  32. //emit newMessageReceived(msg.CtrlType, msg.nValue);
  33. }else
  34. {
  35. usleep(100000); // 100ms轮询
  36. }
  37. }
  38. }
  39. void qt_pdu_msgq::sendResponse(MsgData* pMSGData)
  40. {
  41. if(!pMSGData)
  42. {
  43. return;
  44. }
  45. const char* path = "/root/run/app/smartPDU_MSGQ";
  46. QFile::setPermissions(path, QFile::ReadOwner|QFile::WriteOwner|QFile::ReadGroup|QFile::WriteGroup|QFile::ReadOther|QFile::WriteOther);
  47. key_t key = ftok(path, 'Q');
  48. if (key == -1) {
  49. qCritical() << "ftok failed:" << strerror(errno);
  50. return;
  51. }
  52. msgid = msgget(key, 0666 | IPC_CREAT);
  53. if (msgid == -1) {
  54. qCritical() << "msgget failed:" << strerror(errno);
  55. return;
  56. }
  57. MsgData msg;
  58. msg=*pMSGData;
  59. msg.MsgType=1;
  60. qDebug()<<"MSGType="<<QString::number(msg.MsgType);
  61. qDebug()<<"CtrlType="<<QString::number(msg.CtrlType);
  62. // qDebug()<<"strData="<<QString::fromLocal8Bit(msg.strData);
  63. qDebug()<<"nValue1="<<QString::number(msg.nValue[0]);
  64. qDebug()<<"nValue2="<<QString::number(msg.nValue[1]);
  65. qDebug()<<"msgid="<<msgid;
  66. int r=msgsnd(msgid, &msg, sizeof(msg) - sizeof(long), IPC_NOWAIT);
  67. if( r<0) {
  68. qWarning() << "Qt send failed:" << strerror(errno);
  69. if(r<0) {
  70. qWarning()<<"msgsnd failed"<<r<<", errno:"<< errno;
  71. }
  72. else {
  73. qWarning()<<"msgsnd ok\n";
  74. }
  75. }
  76. }
  77. void qt_pdu_msgq::stopListening() {
  78. running = false;
  79. }