|
|
|
zildjian
|
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
|
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
|
>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
|
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 |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |