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是无法直接通信的。