2016-06-30 24 views
0

Ich möchte Bluetooth Tethering zwischen meinem Laptop (Debian 8) und meinem Smartphone (Android).dbus-send funktioniert nicht im Shell Skript

Am Arch Linux Wiki (https://wiki.archlinux.org/index.php/android_tethering#Tethering_via_Bluetooth) fand ich diesen Befehl ein: bus-send --system --type=method_call --dest='org.bluez' '/org/bluez/hci0/dev_C0_EE_FB_20_D7_00' org.bluez.Network1.Connect string:'nap'

Wenn ich es im normalen Terminal funktioniert alles einwandfrei auszuführen. Für meinen Zweck muss ich diesen Befehl in einer QT-Anwendung aufrufen. Aus diesem Grund habe ich ein Shell-Skript erstellt. Aber beim Ausführen des Skripts passiert nichts. Gleiches Ergebnis beim Aufruf des Befehls innerhalb einer neuen Shell (sh).

Hat jemand eine Idee, wie man das funktioniert oder anders geht? Mein normales Terminal ist das Standard-Debian-Terminal, 'Root Terminal'.

Vielen Dank

+1

ich mit der Überprüfung der Umwelt das Skript in läuft beginnen würde, z.B. Hat es einen Session-Bus (von dem ich annehme, dass Sie ihn verwenden) usw. Wenn die Umgebungsvariable DBUS_SESSION_BUS_ADDRESS nicht gesetzt ist, könnten Sie eine andere Adresse für den Befehl dbus-send verwenden oder die Variable vor dem Aufruf setzen. Wenn Sie es in einer Qt-App ausführen, sehen Sie, wie Sie die aktuelle Umgebung beispielsweise in die Umgebung kopieren können, in der der Anruf stattfinden soll. – JoGr

+0

Vielen Dank für Ihre Antwort. Andere dbus-send Befehle funktionieren gefunden. Ich habe es jetzt mit QTs DBus Klassen und Methoden geschafft. – SteffenH

Antwort

0

Ich löste es mit dem QDBus-Objekt. Erstellen Sie zunächst i die folgenden zwei Methoden:

QString MainWindow::getDBusInterface(){ 
    QString interface = "/org/bluez/hci0/dev"; 
    QStringList macParts = ui->selectedMac->text().toUpper().split(":"); 
    for (int i = 0; i < macParts.length(); i++){ 
     interface.append("_").append(macParts[i]); //MAC address to connect to from GUI 
    } 
    return interface; 
} 

und

QDBusMessage MainWindow::sendDBus(QString destination, QString path, QString interface, QString method, QList<QVariant> arguments){ 
    QDBusMessage response; 


    QDBusConnection system = QDBusConnection::systemBus(); 
    if (!system.isConnected()) 
    { 
     qFatal("Cannot connect to the D-Bus session bus."); 
     return response; 
    } 

    QDBusMessage message2 = QDBusMessage::createMethodCall(destination, path, interface, method); 

    message2.setArguments(arguments); 


    // synchronous call (not recommended, blocking) 
    response = QDBusConnection::systemBus().call(message2); 
    qDebug() << "response is: " << response; 

    return response; 
} 

Schließlich nenne ich:

QString interface = getDBusInterface(); 

QList<QVariant> arguments; 
arguments.append("nap"); 
QDBusMessage response = sendDBus("org.bluez", 
            interface, 
            "org.bluez.Network1", 
            "Connect", 
            arguments);