1.下载dbus-1.12.20.tar.gz和expat-2.3.0.tar.bz2,创建文件夹install
lwp@lwp-virtual-machine:~/jz/dbus/dbus-glib-cross-compile-package$ ls
dbus-1.12.20 dbus-glib-0.106.tar.gz expat-2.3.0.tar.bz2 install
dbus-1.12.20.tar.gz expat-2.3.0 glib-2.34.1.tar.xz README
2.进入expat-2.3.0文件夹,执行脚本a.sh
lwp@lwp-virtual-machine:~/jz/dbus/dbus-glib-cross-compile-package/expat-2.3.0$ cat a.sh
#!/bin/bash
./configure CC=/home/lwp/jz/ISVP-T31-1.1.6-20221013/software/sdk/Ingenic-SDK-T31-1.1.6-20221013/resource/toolchain/gcc_540/mips-gcc540-glibc222-64bit-r3.3.0/bin/mips-linux-gnu-gcc --prefix=$PWD/tmp --host=mips-linux-gnu
3.进入dbus文件夹,执行脚本a.sh
lwp@lwp-virtual-machine:~/jz/dbus/dbus-glib-cross-compile-package/dbus-1.12.20$ cat a.sh
#!/bin/bash
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$PWD/../expat-2.3.0/tmp/lib/pkgconfig
./autogen.sh
./configure --host=mips-linux --enable-tests=no --prefix=/usr/local \
CC=/home/lwp/jz/ISVP-T31-1.1.6-20221013/software/sdk/Ingenic-SDK-T31-1.1.6-20221013/resource/toolchain/gcc_540/mips-gcc540-glibc222-64bit-r3.3.0/bin/mips-linux-gnu-gcc \
编译出来的.a文件在linux上使用
4.dbus server
/* server.c */
#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
static DBusHandlerResult
filter_func(DBusConnection *connection, DBusMessage *message, void *usr_data)
{
dbus_bool_t handled = false;
char *word = NULL;
DBusError dberr;
if (dbus_message_is_signal(message, "client.signal.Type", "Test")) {
dbus_error_init(&dberr);
dbus_message_get_args(message, &dberr, DBUS_TYPE_STRING,
&word, DBUS_TYPE_INVALID);
if (dbus_error_is_set(&dberr)) {
dbus_error_free(&dberr);
} else {
printf("receive message %s\n", word);
handled = true;
}
}
return (handled ? DBUS_HANDLER_RESULT_HANDLED : DBUS_HANDLER_RESULT_NOT_YET_HANDLED);
}
int dbus_server_thread(char *argv)
{
DBusError dberr;
DBusConnection *dbconn;
dbus_error_init(&dberr);
dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);
if (dbus_error_is_set(&dberr)) {
printf("Connection Error: %s--%s\n", dberr.name, dberr.message);
dbus_error_free(&dberr);
return -1;
}
if (!dbus_connection_add_filter(dbconn, filter_func, NULL, NULL)) {
printf("ERR 1\n");
return -1;
}
dbus_bus_add_match(dbconn, "type='signal',interface='client.signal.Type'", &dberr);
if (dbus_error_is_set(&dberr)) {
dbus_error_free(&dberr);
printf("ERR 2\n");
return -1;
}
printf("iiiiiiiiii\n");
while(dbus_connection_read_write_dispatch(dbconn, -1)) {
/* loop */
}
printf("iiiiiiiiii\n");
return 0;
}
5.dbus_client
#include <dbus/dbus.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int db_send(DBusConnection *dbconn)
{
DBusMessage *dbmsg;
char *word;
int i;
dbmsg = dbus_message_new_signal("/client/signal/Object", // object name of the signal
"client.signal.Type", // interface name of the signal
"Test"); // name of the signal
if (!dbmsg) {
printf("ERR 00000\n");
return -1;
}
word = "hello";
if (!dbus_message_append_args(dbmsg, DBUS_TYPE_STRING, "hello", DBUS_TYPE_INVALID)) {
printf("000ERR 0\n");
return -1;
}
if (!dbus_connection_send(dbconn, dbmsg, NULL)) {
printf("ERR 1\n");
return -1;
}
dbus_connection_flush(dbconn);
printf("send message %s\n", word);
dbus_message_unref(dbmsg);
return 0;
}
int dbus_client_thread(char *argv)
{
DBusError dberr;
DBusConnection *dbconn;
int i;
dbus_error_init(&dberr);
dbconn = dbus_bus_get(DBUS_BUS_SESSION, &dberr);
if (dbus_error_is_set(&dberr)) {
return -1;
}
printf("client send message\n");
db_send(dbconn);
dbus_connection_unref(dbconn);
return 0;
}
6.测试,服务端可以接收到客户端发送的dbus信息