C++ 如何使用Qt在D-Bus上创建/实例化配对代理
我正在尝试构建一个Qt应用程序,用于在Linux设备上配对/连接蓝牙设备。正如BlueZ官方网站()中描述的那样,我在D-Bus上使用BlueZ API() 一般程序如下所述: 目前,我可以使用API来配对/连接设备而不会出现问题 但我不知道如何使用配对代理 我试图遵循这里指出的方向: 我在网上搜索了很多,有很多代码: 但是,我还是不明白这是怎么回事。Python中还有很多脚本,但是我正在使用C++。< /P> 我的(伪)代码如下所示:C++ 如何使用Qt在D-Bus上创建/实例化配对代理,c++,linux,qt,dbus,C++,Linux,Qt,Dbus,我正在尝试构建一个Qt应用程序,用于在Linux设备上配对/连接蓝牙设备。正如BlueZ官方网站()中描述的那样,我在D-Bus上使用BlueZ API() 一般程序如下所述: 目前,我可以使用API来配对/连接设备而不会出现问题 但我不知道如何使用配对代理 我试图遵循这里指出的方向: 我在网上搜索了很多,有很多代码: 但是,我还是不明白这是怎么回事。Python中还有很多脚本,但是我正在使用C++。< /P> 我的(伪)代码如下所示: agentManager = new QD
agentManager = new QDBusInterface("org.bluez","/org/bluez","org.bluez.AgentManager1",QDBusConnection::systemBus(),this);
agent = new QDBusInterface("org.bluez","/org/bluez/agent","org.bluez.Agent1",QDBusConnection::systemBus(),this);
QDBusReply<void> reply;
reply = agentManager->call("RegisterAgent", QVariant::fromValue(QDBusObjectPath(path)), capability);
if (!reply.isValid()) {
qDebug() << reply.error().message() << reply.error().name();
}
reply = agentManager->call("RequestDefaultAgent", QVariant::fromValue(QDBusObjectPath(path)));
if (!reply.isValid()) {
qDebug() << reply.error().message() << reply.error().name();
}
QDBusReply<QString> reply_str = agent->call("RequestPinCode", QVariant::fromValue(QDBusObjectPath(path)));
if (reply_str.isValid()) {
pincode = reply_str.value();
} else {
qDebug() << reply_str.error().message() << reply.error().name();
}
agentManager=newqdbusinterface(“org.bluez”、“/org/bluez”、“org.bluez.AgentManager1”、QDBusConnection::systemBus(),this);
代理=新的QDBusInterface(“org.bluez”,“org/bluez/agent”,“org.bluez.Agent1”,QDBusConnection::systemBus(),this);
答复;;
reply=agentManager->call(“RegisterAgent”,QVariant::fromValue(QDBusObjectPath(path)),capability);
如果(!reply.isValid()){
qDebug()好的,现在它可以工作了。中介绍了该方法
实现的详细信息见本问题的最后一个编辑。最后一件事是使用callWithCallback在Device1接口上异步实现“Pair”方法:
void cBluetoothDevice::Pair() {
QList<QVariant> args;
args.clear();
device->callWithCallback("Pair",args, this, SLOT(PairSlot(QDBusMessage)));
}
void cBluetoothDevice::Pair(){
QList-args;
args.clear();
设备->callWithCallback(“Pair”,args,this,SLOT(PairSlot(QDBusMessage));
}
如果设备是QDBusInterface*我正在使用qdbusviewer探索对象,我找不到代理。如果您想实现用户输入pincode或接受连接的UI,您必须实际编写一个D-Bus服务来实现整个org.bluez.Agent1接口。@JussiKukkonen因此,我无法添加interface到已经存在的org.bluez服务?我必须实例化一个全新的服务?现在我正试图弄清楚qt是如何完成这项工作的()。我不能使用qt蓝牙模块,因为我必须使用qt 4.8I,我设法使它工作。:)我刚刚用callWithCallback调用了“Pair”异步
class MyObject : public QObject
{
Q_OBJECT
public:
MyObject();
public Q_SLOTS:
QString RequestPinCode(const QDBusObjectPath &in0);
};
MyObject::MyObject() {
}
QString MyObject::RequestPinCode(const QDBusObjectPath& in0)
{
qDebug() << "MyObject" << in0.path();
QString str = "2974";
return str;
}
class MyQDusAdaptor: public QDBusAbstractAdaptor
{
Q_OBJECT
Q_CLASSINFO("D-Bus Interface", "org.bluez.Agent1")
Q_CLASSINFO("D-Bus Introspection", ""
" <interface name=\"org.bluez.Agent1\">\n"
" <method name=\"RequestPinCode\">\n"
" <arg direction=\"in\" type=\"o\"/>\n"
" <arg direction=\"out\" type=\"s\"/>\n"
" </method>\n"
" </interface>\n"
"")
public:
MyQDusAdaptor(QObject *parent);
virtual ~MyQDusAdaptor();
public: // PROPERTIES
public Q_SLOTS: // METHODS
QString RequestPinCode(const QDBusObjectPath &in0);
};
MyQDusAdaptor::MyQDusAdaptor(QObject* parent) : QDBusAbstractAdaptor(parent) {
setAutoRelaySignals(true);
}
MyQDusAdaptor::~MyQDusAdaptor() {
}
QString MyQDusAdaptor::RequestPinCode(const QDBusObjectPath& in0)
{
qDebug() << "MyQDusAdaptor" << in0.path();
QString out0;
QMetaObject::invokeMethod(parent(), "RequestPinCode", Q_RETURN_ARG(QString, out0), Q_ARG(QDBusObjectPath, in0));
return out0;
}
void cBluetoothDevice::Pair() {
QList<QVariant> args;
args.clear();
device->callWithCallback("Pair",args, this, SLOT(PairSlot(QDBusMessage)));
}