QDBus通信小记

1.客户端

1.1TestQtDBus.pro

QT       +=  dbus 

1.2TestQtDBus.h

#ifndef TESTQTDBUS_H
#define TESTQTDBUS_H

#include <QObject>
#include <QtDBus>

enum MessageType
{
    Message_Conncet = 0,     //设备连接
    Message_DisConnect = 1,  //设备断开连接
    Message_Command = 2,     //下发指令

    Meassge_Note = 99
};
class TestQtDBus : public QObject
{
    Q_OBJECT

public:
    TestQtDBus();
    void NewIP_Connect(QString oldIp,int DeviceNum); //服务端发送

public slots:
    void Client_get(QDBusMessage st); //获取通信服务端信息

signals:
    void Updatexxx();
private:
};

#endif // TESTQTDBUS_H

1.3TestQtDBus.cpp

#include <QDebug>

#include "TestQtDBus.h"

TestQtDBus::TestQtDBus()
{
    QDBusConnection::sessionBus().connect(QString(), QString("/citos/path"), "com.citos.test", "send_to_client", this, SLOT(Client_get(QDBusMessage)));
}

void TestQtDBus::Client_get(QDBusMessage st)
{
    QList<QVariant> mDataList = st.arguments();

    if(mDataList.size() == 1){
        if(4 > mDataList[0].toInt()){
            emit Updataxxx();
        }
    }
}


void TestQtDBus::NewIP_Connect(QString oldIp,int DeviceNum)
{
    QDBusMessage message = QDBusMessage::createSignal("/citos/path", "com.citos.test", "send_to_service");

    int mCmdIndex = Message_Conncet;

    message << mCmdIndex << DeviceNum<< oldIp;
    QDBusConnection::sessionBus().send(message);
}

2.服务端

2.1serQdbus.pro

QT       +=  dbus 

2.2serQdbus.h

#ifndef SERDBUS_H
#define SERDBUS_H

#include <QObject>
#include <QtDBus>

class serQdbus : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("D-Bus Interface", "com.citos.test")

public:
    serQdbus();

    void Message_Down_CallBack(int nRes, int MsgType); //下行设备上报的状态

public slots:
    void service_get(QDBusMessage st); //接受客户端消息

signals:
    void MSG_NewIP();
};

#endif // SERDBUS_H

2.3serQdbus.cpp

#include <QDebug>


#include "serQdbus.h"

serQdbus::serQdbus()
{
    if(!QDBusConnection::sessionBus().isConnected()) {
        qDebug()<<"isNoConnected!";
        QDBusConnection con = QDBusConnection::sessionBus();
        if(!con.registerService("com.citos.service")){
            qDebug()<<con.lastError().message();//"Not connected to D-Bus server"
        }
    }
    QDBusConnection::sessionBus().registerObject("/citos/path", this, QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals);
    bool xx = QDBusConnection::sessionBus().connect(QString(), QString("/citos/path"), "com.citos.test", "send_to_service", this, SLOT(service_get(QDBusMessage)));
    qDebug()<<"连接状态:"<<xx;
}

void serQdbus::Message_Down_CallBack(int nRes, int MsgType){

    QDBusMessage message = QDBusMessage::createSignal("/citos/path", "com.citos.test", "send_to_client");

    int mCmdIndex = MessageType::Meassge_Note;
    switch (MsgType) {
        case 0: mCmdIndex = MessageType::Message_Conncet;break;
        case 1: mCmdIndex = MessageType::Message_DisConnect;break;
        case 2: mCmdIndex = MessageType::Message_Command;break;
        default:mCmdIndex = MessageType::Meassge_Note;break;
    }

    message << mCmdIndex << 0 << nRes;
    QDBusConnection::sessionBus().send(message);
}

void serQdbus::service_get(QDBusMessage st)
{
    QList<QVariant> mDataList = st.arguments();

    if (Message_Conncet == mDataList[0].toInt())
    {
        qDebug() << QString::fromLocal8Bit("连接");

        if (mDataList.size() == 3)
        {
            qDebug()<<mDataList[1].toInt()<<mDataList[2].toString();
            emit MSG_NewIP();
            return;
        }
    }

    qDebug() << QString::fromLocal8Bit("接受消息解析错误");
}

3.注意

3.1QDbus仅用于linux系统;

3.2不同权限之间的QDbus是无法直接通信的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值