2016-06-30 3 views
0

Я хочу, чтобы Bluetooth-модем между моим ноутбуком (Debian 8) и моим смартфоном (Android).dbus-send не работает в скрипте оболочки

В Arch Linux вики (https://wiki.archlinux.org/index.php/android_tethering#Tethering_via_Bluetooth) я нашел эту команду: 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'

Когда я исполнить его в обычном терминале все отлично работает. Для моей цели мне нужно вызвать эту команду в приложении QT. Из-за этого я создал сценарий оболочки. Но при выполнении сценария ничего не происходит. Тот же результат при вызове команды внутри новой оболочки (sh).

Есть ли у кого-нибудь идеи, как это работать или по-другому? Мой обычный терминал - это терминал Debian по умолчанию, «Root Terminal».

Спасибо

+1

Я хотел бы начать с проверки окружающей среды скрипт работает в, например, у него есть шина сеанса (которая, как я полагаю, вы используете) и т. д. Если переменная окружения DBUS_SESSION_BUS_ADDRESS не установлена, вы можете использовать какой-либо другой адрес для команды dbus-send или установить переменную до вызова. Если вы запустите его из приложения Qt, посмотрите, как можно скопировать текущую среду в среду, где будет выполнен вызов. – JoGr

+0

Благодарим вас за ответ. Другие команды dbus-send работают. Теперь мне удалось использовать классы и методы QTs DBus. – SteffenH

ответ

0

Я решил использовать его с помощью объекта QDBus. Сначала я создать следующие два метода:

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; 
} 

и

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; 
} 

Наконец я называю:

QString interface = getDBusInterface(); 

QList<QVariant> arguments; 
arguments.append("nap"); 
QDBusMessage response = sendDBus("org.bluez", 
            interface, 
            "org.bluez.Network1", 
            "Connect", 
            arguments); 
Смежные вопросы