<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.2180" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Hello,</FONT></DIV>
<DIV><FONT face=Arial size=2>I'm trying to use dbus to send information from one 
process to other, using low level C. The frecuency that this application send 
signal is about 1200 per seconds, and each signal is a struct of 4 or 7 basic 
datas (there are 2 different signals).</FONT></DIV>
<DIV><FONT face=Arial size=2>I think I'm writing signal correctly (at less I can 
monitory them correctly from dbus-monitor utility), but when I'm reading it from 
the other application, I have some loosing data (or not received signal) 
randomly.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>This is my receive method&nbsp;using C</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>void receive()<BR>{<BR>&nbsp;&nbsp; DBusMessage* 
msg, *msgaux;<BR>&nbsp;&nbsp; DBusMessageIter args, item;<BR>&nbsp;&nbsp; 
DBusConnection* conn;<BR>&nbsp;&nbsp; DBusError err;<BR>&nbsp;&nbsp; int 
ret;<BR>&nbsp;&nbsp; unsigned short datox, datoy, datoz;<BR>&nbsp;&nbsp; 
unsigned short datox2, datoy2, datoz2;<BR>&nbsp;&nbsp; unsigned int 
time;</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // initialise the 
errors<BR>&nbsp;&nbsp; dbus_error_init(&amp;err);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;conn = dbus_bus_get(DBUS_BUS_SYSTEM, 
&amp;err);<BR>&nbsp;&nbsp; if (dbus_error_is_set(&amp;err)) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Connection Error (%s)\n", 
err.message);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_error_free(&amp;err);<BR>&nbsp;&nbsp; }<BR>&nbsp;&nbsp; if (NULL == conn) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<BR>&nbsp;&nbsp; }</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // add a rule for which messages we 
want to see<BR>&nbsp;&nbsp; dbus_bus_add_match(conn, 
"type='signal',interface='device.sensors.rawdata'", &amp;err); // see signals 
from the given interface<BR>&nbsp;&nbsp; 
dbus_connection_flush(conn);<BR>&nbsp;&nbsp; if (dbus_error_is_set(&amp;err)) 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Match Error (%s)\n", 
err.message);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<BR>&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp; printf("Match rule sent\n");</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp; // loop listening for signals being 
emmitted<BR>&nbsp;&nbsp; while (true)<BR>&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // non blocking read of the next available 
message<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dbus_connection_read_write(conn, 
-1);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; msgaux = 
dbus_connection_pop_message(conn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while 
(msgaux!= NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; 
&nbsp;&nbsp; msg = msgaux;<BR>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; msgaux = 
dbus_connection_pop_message(conn);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // check if the 
message is a signal from the correct interface and with the correct 
name<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (dbus_message_is_signal(msg, 
"device.sensors.rawdata", "MGData"))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read the 
parameters<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
(!dbus_message_iter_init(msg, 
&amp;args))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
fprintf(stderr, "Message Has No 
Parameters\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_recurse(&amp;args, &amp;item);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datox);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoy);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoz);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;time);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;args);<BR>&nbsp;&nbsp;&nbsp; printf("\n\tMg: %d, %d, 
%d, time: %d\n", datox, datoy, datoz, 
time);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;if (dbus_message_is_signal(msg, 
"device.sensors.rawdata", 
"ACData"))<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp; // read the 
parameters<BR>&nbsp;&nbsp;&nbsp;&nbsp; if (!dbus_message_iter_init(msg, 
&amp;args))<BR>&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr, "Message Has No 
Parameters\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&nbsp;&nbsp;&nbsp;&nbsp; dbus_message_iter_recurse(&amp;args, 
&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; dbus_message_iter_get_basic(&amp;item, 
&amp;datox);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoy);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoz);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datox2);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoy2);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;datoz2);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_get_basic(&amp;item, &amp;time);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;item);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_iter_next(&amp;args);</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp;&nbsp; printf("\n\tAce 1: %d, %d, 
%d \tAce 2: %d, %d, %d, time: %d\n", datox, datoy, datoz, datox2, datoy2, 
datoz2, time);<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // free the 
message<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
dbus_message_unref(msg);<BR>&nbsp;&nbsp; }<BR>}<BR></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV></BODY></HTML>