2014-09-28 3 views
0

Я пытаюсь получить статус от omxplayer с NodeJS через DBus, чтобы сделать это я просто пытаюсь execuce сценарий оболочки:NodeJS DBus не работает

#!/bin/bash 
    #set -x 
    OMXPLAYER_DBUS_ADDR="/tmp/omxplayerdbus" 
    OMXPLAYER_DBUS_PID="/tmp/omxplayerdbus.pid" 
    export DBUS_SESSION_BUS_ADDRESS=`cat $OMXPLAYER_DBUS_ADDR` 
    export DBUS_SESSION_BUS_PID=`cat $OMXPLAYER_DBUS_PID` 
    [ -z "$DBUS_SESSION_BUS_ADDRESS" ] && { echo "Must have DBUS_SESSION_BUS_ADDRESS" >&2; exit 1; } 
    duration=`dbus-send --print-reply=literal --session --reply-timeout=500 --dest=org.mpris.MediaPlayer2.omxplayer /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Duration` 
    [ $? -ne 0 ] && exit 1 
    duration="$(awk '{print $2}' <<< "$duration")" 
    position=`dbus-send --print-reply=literal --session --reply-timeout=500 --dest=org.mpris.MediaPlayer2.omxplayer /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Position` 
    [ $? -ne 0 ] && exit 1 
    position="$(awk '{print $2}' <<< "$position")" 
    playstatus=`dbus-send --print-reply=literal --session --reply-timeout=500 --dest=org.mpris.MediaPlayer2.omxplayer /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.PlaybackStatus` 
    [ $? -ne 0 ] && exit 1 
    playstatus="$(sed 's/^ *//;s/ *$//;' <<< "$playstatus")" 
    paused="true" 
    [ "$playstatus" == "Playing" ] && paused="false" 
    echo "Duration: $duration" 
    echo "Position: $position" 
    echo "Paused: $paused" 
    ;; 

с

var exec = require('child_process').exec; 
exec('bash status.sh', function() { 
    console.log(arguments); 
}) 

но он печатает

{ '0': 
     { [Error: Command failed: Failed to open connection to "session" message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken. 
     ] killed: false, code: 1, signal: null }, 
     '1': '', 
     '2': 'Failed to open connection to "session" message bus: Did not receive a reply. Possible causes include: the remote application did not send a reply, the message bus security policy blocked the reply, the reply timeout expired, or the network connection was broken.\n' } 

Когда я запускаю этот скрипт непосредственно в консоли, он работает. NodeJS работает на малине Pi.

UPDATE:

Я также попытался «узел-DBus» и «DBus-родные» модули, но ни один из них не работал для меня, но, может быть, я их неправильно? Для выполнения

dbus-send --print-reply=literal --session --reply-timeout=500 --dest=org.mpris.MediaPlayer2.omxplayer /org/mpris/MediaPlayer2 org.freedesktop.DBus.Properties.Duration 

Я использовал DBus родной

var exec = require('child_process').exec; 
    exec('cat /tmp/omxplayerdbus', function(error, data, stderr) { 
     data = data.replace("\n",''); 
     var dbus = require('dbus-native'); 
     var bus = dbus.sessionBus({ 
      busAddress: data //unix:abstract=/tmp/dbus-7BuZanKhmv,guid=7fafe7baa2d38357478f04ff5429712a 
     }); 
     bus.invoke({ 
      path: '/org/mpris/MediaPlayer2', 
      destination: 'org.mpris.MediaPlayer2.omxplayer', 
      'interface': 'org.freedesktop.DBus.Properties.Position' 
     }, function(err, res) { 
      console.log(arguments); 
     }); 
     //And this 
     var conn = dbus({ 
      busAddress: data 
     }); 
     conn.message({ 
      path:'/org/mpris/MediaPlayer2', 
      destination: 'org.mpris.MediaPlayer2.omxplayer', 
      type: dbus.messageType.methodCall 
     }); 
     conn.on('message', function(msg) { console.log(msg); }).on('error', function() { 
      console.log(arguments); 
     }).on('connect', function() { 
      console.log(arguments); 
     }); 
    }); 

оба этих метода бросает мне эту ошибку:

events.js:72 
      throw er; // Unhandled 'error' event 
       ^
    Error: write EPIPE 
     at errnoException (net.js:904:11) 
     at Object.afterWrite (net.js:720:19) 

UPDATE 2

Теперь я использую модуль «dbus-native» и все еще получаю ошибку «EPIPE». Я проверил "Handshake.js" и есть все в порядке, поэтому я бросил стандартный ввод и стандартный вывод сообщений:

{stdin}AUTH EXTERNAL 30 

    {stdout}OK df028c4a159a4db39ccc41c0542b9e3b 

    {stdin}BEGIN 

    {stdin}lmo/org/freedesktop/DBussorg.freedesktop.DBussHellosorg.freedesktop.DBus 
    PuTTY{stdin}l5�o/org/mpris/MediaPlayer2sorg.freedesktop.DBus.PropertiessGets org.mpris.MediaPlayer2.omxplayegss org.mpris.MediaPlayer2.omxplayePosition 

{стандартный вывод} - стандартный вывод сообщений линия {STDIN} - STDIN линия сообщение

, а затем "EPIPE".

UPDATE 3

Я обнаружил, что ошибка "EPIPE" является забросил сразу после первого Dbus "DATA" команды, в данном случае это

lmo/org/freedesktop/DBussorg.freedesktop.DBussHellosorg.freedesktop.DBus PuTTY{stdin}l5�o/org/mpris/MediaPlayer2sorg.freedesktop.DBus.PropertiessGets org.mpris.MediaPlayer2.omxplayegss org.mpris.MediaPlayer2.omxplayePosition

Я новичок в связь через dbus, но согласно DBus protocol, сообщения должны быть отправлены DATA <data in hex encoding>, но dbus-native отправляет сообщения без DATA имя команды.

+0

Вы пытались использовать существующие библиотеки узлов (я автор одного, dbus-native)? –

+0

Спасибо за ваш ответ, я обновил свой вопрос. – Luke

+0

Похоже, он не может подключиться к этому адресу. Попробуйте проверить с помощью socat как 'echo -e '\ 0AUTH ANONYMOUS \ r \ n" | socat abstract-client:/tmp/dbus-7BuZanKhmv -' –

ответ

0

Вы пытаетесь прочитать свойства объекта dbus, используя properties api. Обратите внимание, что последний параметр dbus-send - interface.member, поэтому отправляемое сообщение будет

var bus = dbus.sessionBus({ busAddress: fs.readFileSync('/tmp/omxplayerdbus', 'ascii').trim()}) 
bus.invoke({ 
    path: "/org/mpris/MediaPlayer2", 
    interface: "org.freedesktop.DBus.Properties", 
    member: "Get", 
    destination: "org.mpris.MediaPlayer2.omxplayer", 
    signature: "ss", 
    body: [ 
    "org.mpris.MediaPlayer2.omxplayer", 
    "Position" 
    ] 
}, function(err, position) { 
    console.log(err, position); 
}); 
+0

Спасибо, для пояснения, но я все еще продолжаю получать ошибку «EPIPE» при использовании метода invoke. Ошибка возникает из 'abstractsocket/node_modules/exec_stream/index.js child.stdin.on ('error')' event. В Handshake.js есть все нормально, он выполняет 'AUTH EXTERNAL 30' и получает' OK'. Я обновил свой вопрос, добавил более подробную информацию (см. «Обновление 2»). – Luke

+0

выглядит как соединение dbus-капель во время рукопожатия, не знаю почему. –

+0

Когда я прокомментирую метод отправки сообщений, соединения остаются живыми навсегда, никаких ошибок. Но после отправки первого сообщения он выдает ошибку. – Luke

Смежные вопросы