Usando DBUS en una aplicación en C para el Neo

4 messages Options
Embed this post
Permalink
zildjian

Usando DBUS en una aplicación en C para el Neo

Reply Threaded More More options
Print post
Permalink
Hola a todos!
A ver si podeis echarme un cable con el problemilla que tengo.
Estoy desarrollando una aplicación en C para un kernel Linux 2.6. Las pruebas las estoy realizando sobre el Neo Freerunner.
Resulta que tengo que comunicar un proceso cliente con uno servidor, los cuales se mandan mensajes. He leido mucho acerca
de que el Neo soporta el Dbus como método para comunicar procesos pero no soy capaz de echar a andar mi aplicación en el Neo.

Os comento de que va, basandome en un ejemplo muy tonto, pero que no me funciona.
Se tiene una aplicación en C (un demonio), que puede ejecutarse de 2 formas: Como emisor ó como receptor.


Si se ejecuta como receptor, hay que invocarlo de la siguiente manera:
*---------------------------------------------------------------------------------------
>> ./a.out  receive  test.signal.receptor  test.signal.Interfaz  Test     type='signal',interface='test.signal.Interfaz'

Es decir:
Se invoca la aplicación: ./a.out
Se invoca en modo receptor: receive
Se indica el nombre con el que se registra en el DBUS: test.signal.receptor
Se indica el nombre de la interfaz en DBUS: test.signal.Interfaz
Se indica el identificador de la señal: Test
Se indica un parámetro a pasar a la función dbus_bus_add_match: type='signal',interface='test.signal.Interfaz'
*------------------------------------------------------------------------------------------

Si se ejecuta como emisor, hay que invocarlo de la siguiente manera:
*------------------------------------------------------------------------------------------------
>>./a.out  send  test.signal.emisor "Mensaje"  test.signal.Interfaz  /test/signal/Object Test

Es decir:
Se invoca la aplicación: ./a.out
Se invoca en modo emisor: send
Se indica el nombre con el que se registra en el DBUS: test.signal.emisor
Se indica el mensaje a mandar al receptor: "Mensaje"
Se indica el nombre de la interfaz en DBUS: test.signal.Interfaz (Que es la misma que la indicada para el receptor)
Se indica el identidicador de objeto: /test/signal/Object
Se indica el identificador de la señal: Test (El mismo que el indicado para el recepor)
*------------------------------------------------------------------------------------------------


Si compilo la aplicación para la arquitectura Intel de mi PC, me genera el a.out correctamente. Lo invoco una primera vez
en modo receptor, de forma que se queda esperando la llegada de mensajes por el DBus por la interfaz indicada.
Lo invoco una segunda vez como emisor mandando el mensaje por el Dbus por la Interfaz indicada.
El mensaje enviado por el emisor, llega correctamente al receptor porque lo muestra por pantalla.
En Intel todo OK.

El problema viene cuando lo pruebo para la arquitectura ARM de openmoko. Me compila correctamente.
Lo ejecuto en el Neo en modo receptor indicandole el mismo nombre con el que registrarse en Dbus y la misma Interfaz. La
aplicación se queda a la espera de que le lleguen mensajes por el Dbus.
Lo invoco una segunda vez en el Neo en modo emisor, mandando el mensaje por el Dbus por la misma interfaz.
Parece que envia la señal pero no la hace llegar al receptor.

Estoy buscando algun ejemplo parecido que hallan realizado para openmoko, pero no encuentro nada en C.
El problema creo que está en los nombres que indico a mi aplicación para que se registre en Dbus, y el nombre de la interfaz
por la que se deben comunicar.
He visto en la web de openmoko que existen servicios concretos en DBUS que te permiten comunicar una aplicación tuya
con unas ciertas aplicaciones del Neo (org.freesmartphone....).

Lo que no se si es posible en Openmoko registrarse en DBUS con un nombre concreto (el que yo quiera) e indicar la interfaz
que yo quiera (lo que estoy intentando hacer), o si hay algun archivo en Openmoko donde puedas indicar las interfazces a usar,
o si sólo puedes usar los servicios concretos que te indican en la web.

Estoy un pelin perdío, a ver si me ayudais a centrarme un poco.

Un saludo y gracias!
jluis

Re: Usando DBUS en una aplicación en C para el Neo

Reply Threaded More More options
Print post
Permalink
El Sunday, 23 de August de 2009 19:37:47 zildjian va escriure:

> Hola a todos!
> A ver si podeis echarme un cable con el problemilla que tengo.
> Estoy desarrollando una aplicación en C para un kernel Linux 2.6. Las
> pruebas las estoy realizando sobre el Neo Freerunner.
> ...
>
> Os comento de que va, basandome en un ejemplo muy tonto, pero que no me
> funciona.
> Se tiene una aplicación en C (un demonio), que puede ejecutarse de 2
> formas: Como emisor ó como receptor.

Entiendo que es un solo mismo programa que puede dar un sevicio en DBus o
(xor) reaccionar a una señal.

>
> Si se ejecuta como receptor, hay que invocarlo de la siguiente manera:
> *--------------------------------------------------------------------------
>-------------
>
> >> ./a.out  receive  test.signal.receptor  test.signal.Interfaz  Test    
> >> type='signal',interface='test.signal.Interfaz'

¿es esta la llamada al  cliente?. Si mal no recuredo en C esto especifiaca el
DBus de sesion que seguramente no este dispnible en el neo via SSH.
> ....
> Si se ejecuta como emisor, hay que invocarlo de la siguiente manera:
> ......
> >>./a.out  send   test.signal.emisor    "Mensaje"  test.signal.Interfaz

¿Como garantizas que el servidor este funcionando el tiempo suficiente para
que el cliente pueda recibir la señal?

>
>...
> En Intel todo OK.
>
>.....
>Parece que envia la señal pero no la hace llegar al receptor.
>
> Estoy buscando algun ejemplo parecido que hallan realizado para openmoko,
> pero no encuentro nada en C.
> El problema creo que está en los nombres que indico a mi aplicación para
> que se registre en Dbus, y el nombre de la interfaz
> por la que se deben comunicar.

Descarta lo de los nombres ( si son los del ejemplo estan bien formados ).

Yo comprobaria que DBus se sesta usado ( system o session) si es session
comprobaria que el identificador esta en el entorno y tanto el servicio como
el cliente corren en el mismo bus.

> He visto en la web de openmoko que existen servicios concretos en DBUS que
> te permiten comunicar una aplicación tuya
> con unas ciertas aplicaciones del Neo (org.freesmartphone....).
>
> Lo que no se si es posible en Openmoko registrarse en DBUS con un nombre
> concreto (el que yo quiera) e indicar la interfaz
> que yo quiera (lo que estoy intentando hacer), o si hay algun archivo en
> Openmoko donde puedas indicar las interfazces a usar,
> o si sólo puedes usar los servicios concretos que te indican en la web.
>
> Estoy un pelin perdío, a ver si me ayudais a centrarme un poco.

Si quieres ejemplos sobre llamadas al dbus en C mira los mensages de  c c en
develop y mira algun programa suyo.

Yo lo unico que estoy haciendo con el DBus es en perl 5.8.9 (quiero recojer
todas las señales) pero de momento creo que solo se puede probar en Debian ya
que no he encontrado Net::DBus en OE ( uso mi propio perl).
#!/usr/bin/perl

use warnings;
use strict;
use Data::Dumper;

use Net::DBus;
use Net::DBus::Reactor;
use Carp qw(confess);

my $nombre = shift;

$SIG{__DIE__} = sub {confess $_[0] };

#Prueba de concepto ( recogemos todas las señales de gsm)

my @device=(
        "CallStatus",#( i:index, s:status, a{sv}:properties )
        "KeypadEvent",#( s:name, b:pressed )
        "IncomingMessage",#( s:address, s:text, a{sv}:properties )
        "IncomingMessageReceipt",#( s:number, s:text, a{sv}:properties )
        "AuthStatus",#( s:status )
        "IncomingStoredMessage",#( i:index )
        "MemoryFull",#()
        "ReadyStatus",#( b:status )
        "CipherStatus",#( s:gsm, s:gprs )
        "IncomingUssd",#( s:mode, s:message )
        "SignalStrength",#( i:strength )
        "Status",#( a{sv}:status )
        "TimeZoneReport",#( i:timezone )
        "IncomingCellBroadcast",#( i:channel, s:data )
        "ContextStatus",#( i:index, s:status, a{sv}:properties )
        "NetworkStatus",#( a{sv}:status )
        );
my @server=(
        "OnlineStatus",# ( s:online )
        "ServiceStatus",#( s:service )
        "HomeZoneStatus",#( s:zone )
);


my $bus = Net::DBus->system;
my $dbus = $bus->get_service("org.freesmartphone.ogsmd");
my $device=$dbus->get_object("/org/freesmartphone/GSM/Device");
my $server=$dbus->get_object("/org/freesmartphone/GSM/Server");

#Montamos los calbacks para las señales

for my $enyal (@device) {
     $device->connect_to_signal($enyal,eval "sub {print
\"$enyal\",Dumper(\@_)}");
    };
for my $enyal (@server) {
    $server->connect_to_signal($enyal,eval "sub {print
\"$enyal\",Dumper(\@_)}");
   };

# Bucle principal

my $reactor = Net::DBus::Reactor->main();
$reactor->run();
exit(0);

_______________________________________________
Local-openmoko-spain mailing list
[hidden email]
http://lists.projects.openmoko.org/mailman/listinfo/local-openmoko-spain
zildjian

Re: Usando DBUS en una aplicación en C para el Neo

Reply Threaded More More options
Print post
Permalink

>Entiendo que es un solo mismo programa que puede dar un sevicio en DBus o
>(xor) reaccionar a una señal.

Cierto, es un programa que puede ejecutarse de dos formas. Si se ejecuta en modo receptor, se queda el proceso esperando a que lleguen mensajes por la interfaz del Dbus. Los mensajes que le llegan los muestra por pantalla. Se queda escuchando al DBus hasta que le llegue un mensaje "exit".
Si se ejecuta en modo emisor, manda el mensaje por la interfaz de DBus al receptor y termina.


>Yo comprobaria que DBus se sesta usado ( system o session) si es session
>comprobaria que el identificador esta en el entorno y tanto el servicio como
>el cliente corren en el mismo bus.

Mmmm.. esto me vendría muy bien, pero lo cierto es que no se como verificar que el identificador está en el entorno y que tanto el servicio como el cliente corren en el mismo bus.
¿Como se comprueba? A lo mas que llego en estos momentos es a verificar que el dbus-daemon se está ejecutando, pero no se como visualizar que servicios estan usando el dbus en un momento dado.

Gracias por la respuesta!








Jose Luis Perez Diez-3

Re: Usando DBUS en una aplicación en C para el Neo

Reply Threaded More More options
Print post
Permalink
El Monday, 24 de August de 2009 18:50:01 zildjian va escriure:

> >Entiendo que es un solo mismo programa que puede dar un sevicio en DBus o
> >(xor) reaccionar a una señal.
>
> Cierto, es un programa que puede ejecutarse de dos formas. Si se ejecuta en
> modo receptor, se queda el proceso esperando a que lleguen mensajes por la
> interfaz del Dbus. Los mensajes que le llegan los muestra por pantalla. Se
> queda escuchando al DBus hasta que le llegue un mensaje "exit".
> Si se ejecuta en modo emisor, manda el mensaje por la interfaz de DBus al
> receptor y termina.
>
> >Yo comprobaria que DBus se sesta usado ( system o session) si es session
> >comprobaria que el identificador esta en el entorno y tanto el servicio
> >como el cliente corren en el mismo bus.
>
> Mmmm.. esto me vendría muy bien, pero lo cierto es que no se como verificar
> que el identificador está en el entorno y que tanto el servicio como el
> cliente corren en el mismo bus.

Eso es facil en el source has declarar el bus que vas a usar a no ser que sea
el defecto de la libreria que uses.

> ¿Como se comprueba? A lo mas que llego en estos momentos es a verificar que
> el dbus-daemon se está ejecutando, pero no se como visualizar que servicios
> estan usando el dbus en un momento dado.

Normalmente enviando mensages a org.freedesktop.DBUS:
# session en mi debian PC
$ dbus-send --print-reply --dest=org.freedesktop.DBus /\  
org.freedesktop.DBus.ListNames
method return sender=org.freedesktop.DBus -> dest=:1.30 reply_serial=2
 array [
      string "org.freedesktop.DBus"
      string ":1.30"
   ]
# system en el mismo sistema
$ dbus-send --system --print-reply --dest=org.freedesktop.DBus   /\  
org.freedesktop.DBus.ListNames
method return sender=org.freedesktop.DBus -> dest=:1.38 reply_serial=2
   array [
      string "org.freedesktop.DBus"
      string ":1.7"
      string ":1.8"
      string ":1.9"
      string "org.freedesktop.Avahi"
      string ":1.21"
      string "org.bluez"
      string ":1.11"
      string ":1.23"
      string ":1.24"
      string ":1.0"
      string ":1.1"
      string ":1.37"
      string ":1.2"
      string "org.freedesktop.Hal"
      string ":1.38"
      string ":1.3"
      string ":1.4"
      string ":1.5"
      string ":1.19"
      string ":1.6"
   ]

En las distros basadas en FSO tienes mdbus ( un programita en python) que
muestra dbus los servicios de un DBUS , los objetos de un servicio o para un
objeto las interficies con sus metodos señales.

En las distros basadas en OE puedes recogjer los identificadores de dbus con:
grep -r DBUS /proc/*/environ

grep  DBUS /proc/*/environ
/proc/1486/environ:HALD_RUNNER_DBUS_ADDRESS=unix:abstract=/var/run/hald/dbus-TRJoj3U7rc,guid=4b5350aef6749af019f52f334a93840a
/proc/1524/environ:DBUS_STARTER_ADDRESS=unix:path=/var/run/dbus/system_bus_socket,guid=f9ce3e2284ba246260cdb0cf4a938409
/proc/1524/environ:DBUS_STARTER_BUS_TYPE=system
/proc/1613/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1617/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1619/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1623/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1624/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1625/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1626/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/1661/environ:DBUS_STARTER_ADDRESS=unix:path=/var/run/dbus/system_bus_socket,guid=f9ce3e2284ba246260cdb0cf4a938409
/proc/1661/environ:DBUS_STARTER_BUS_TYPE=system
/proc/2339/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424
/proc/2344/environ:DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,guid=b33b1ab6d109e682de0659c74a938424

Y usar un la variable de entorno para ver que servicios correm en el bus de la
sesion grafica del neo:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-MQMkrubmGp,\
guid=b33b1ab6d109e682de0659c74a938424 mdbus
Using **pending_return in dbus_connection_send_with_reply_setup() without
pending_setup is deprecated and strongly discouraged
Using **pending_return in dbus_connection_send_with_reply_setup() without
pending_setup is deprecated and strongly discouraged
:1.0
:1.1
:1.2
:1.3
org.enlightenment.wm.service
org.freedesktop.DBus
org.gnome.GConf



> Gracias por la respuesta!

De N'a


_______________________________________________
Local-openmoko-spain mailing list
[hidden email]
http://lists.projects.openmoko.org/mailman/listinfo/local-openmoko-spain