dbus的Embedded移植

本文详细介绍了在Linux系统下如何安装和配置dbus和expat,并将它们成功移植到板子上,包括安装步骤、配置细节以及如何在板子上启动dbus-daemon实现消息转发。

一、所需下载安装安装包:

  1dbus-1.8.0.tar.gz

http://www.freedesktop.org/wiki/Software/dbus

  2expat-2.1.0.tar.gz

    http://sourceforge.net/projects/expat/

二、安装步骤

1expat安装

tar -zxvf expat-2.1.0.tar.gz

cd expat-2.1.0/

先进行配置:

./configure --host=arm-none-linux-gnueabi(编译器) --prefix=/home/yjs/expat(安装目录)  

编译源文件:make.

安装:make install.

  2dbus安装

tar -zxvf dbus-1.8.0.tar.gz

cd dbus-1.8.0.tar.gz

配置:

./configure      --prefix=/home/yjs/dbus(安装目录) --host=arm-none-linux-gnueabi  “LIBS=-L/home/yjs/expat/lib”(刚才引用安装的expat的库文件“CPPFLAGS=-I/home/yjs/expat/include”(引用expat的头文件

编译源文件:make

   安装:make install

三、移植到板子上

将编译好的dbus目录复制出来,我们可以看到dbus目录下有binlibvaretcincludesharelibexec目录,我们所需要移植到板子上的只要binetcvar目录,其余的目录都可以删除。

dbus-daemon是一个后台进程,负责消息的转发。它就像个路由器。最常见的基于dbus的程序也是符合C/S结构的。dbus-daemon进程分为两种,一个是属于system的,一个是属于session的。

在板子上通过启动dbus-daemon 。

1session-bus

./dbus-daemon --config-file=../etc/dbus-1/session.conf –print-address

设置环境变量DBUS_SESSION_BUS_ADDRESS,将打印的内容设置成DBUS_SESSION_BUS_ADDRESS的值就可以了,这样session-bus就可以使用了。

如果要通过./dbus-daemon --session或者./dbus-launch来启动dbus-daemonsession-bus则需要第二步安装dbus的目录和移植到板子上的目录要一样,不然可能报找不到某某文件的错误。

实践中发现用session-bus比较麻烦,要连接到session-bus的程序必须知道DBUS_SESSION_BUS_ADDRESS的值,因为DBUS_SESSION_BUS_ADDRESS的值不是唯一的,每次都不一样,每次都要设置DBUS_SESSION_BUS_ADDRESS的环境变量,虽然可以通过./dbus-launch来启动dbus-daemon,并且dbus-launch自带设置DBUS_SESSION_BUS_ADDRESS的环境变量的功能,但由于dbus-launch设置的环境变量只在本进程,而且是本次执行中有效。所以一般要通过eval `dbus-launch --auto-syntax`命令来启动dbus-launch,该命令采用eval来执行两次,第一次执行dbus-lauch --auto-syntax,除了启动dbus daemon之外,还输出了下面的内容:

DBUS_SESSION_BUS_ADDRESS='unix:path=/tmp/dbus-6Z62FMmwf3,guid=5dbd92e4865a3f56880d2120000000d6';
export DBUS_SESSION_BUS_ADDRESS; DBUS_SESSION_BUS_PID=998;

第二次执行时就将环境变量DBUS_SESSION_BUS_ADDRESS暴露出去了。之后你就可以启动要连接到session-bus的程序。

2、system-bus

./dbus-daemon --config-file=../etc/dbus-1/system.conf  --print-address

打印的大致内容是:unix:path=/home/yjs/Desktop/dbus/var/run/dbus/

system_bus_socket,guid=73e31e28f60060659d6ee6005422cb1d

设置环境变量DBUS_SYSTEM_BUS_ADDRESS,只需将打印前半部的内容设置成环境变量DBUS_SYSTEM_BUS_ADDRESS=unix:path=/home/yjs/Desktop/dbus

/var/run/dbus/system_bus_socket,重启设备或source配置文件一下。

 

其中记录一下启动system-bus可能出现的问题的解决方案

 

A、错误:Failed to start message bus: Could not get UID and GID for username  "messagebus"

解决:将dbus目录下/etc/dbus-1/system.conf文件中的 <user>messagebus

</user>改成root或其他系统存在的用户名,也可以添加一个messagebus的用户。

B、错误:Failed to start message bus: The pid file "/home/yjs/Desktop/dbus/var/run/messagebus.pid" exists, if the message bus is not running, remove this file

解决:删除messagebus.pid文件。

 

C、错误:"Connection ":1.69" is not allowed to own the service "com.xxx.test" due to security policies in the configuration file"

解决:修改dbus目录下/etc/dbus-1/system.conf文件的配置下的 <deny own="*"/>改为<allow own=”*”/>

 

参考:

http://blog.youkuaiyun.com/easebone/article/details/7336125

 http://blog.youkuaiyun.com/jack0106/article/details/5588057

 

 

 

将交叉编译好的 **D-Bus** 移植到目标板(如嵌入式Linux设备)需按以下步骤操作: --- ### **1. 准备工作** #### **(1) 确认交叉编译环境** - 交叉编译器已配置(如 `arm-linux-gnueabihf-gcc`) - 编译时使用的 `--host`、`--prefix` 参数与目标板架构匹配(例如:`--host=arm-linux`) #### **(2) 获取交叉编译的D-Bus** - 自行交叉编译的D-Bus库(或从SDK中获取) - 文件通常包含: - 可执行文件:`dbus-daemon`、`dbus-launch` - 库文件:`libdbus-1.so`(动态库)或 `.a`(静态库) - 配置文件:`/etc/dbus-1/session.conf`、`system.conf` - 工具:`dbus-uuidgen`、`dbus-send` --- ### **2. 移植步骤** #### **(1) 拷贝文件到目标板** 将交叉编译生成的目录(如 `--prefix=/opt/dbus`)完整拷贝到目标板,建议路径: ```bash # 在开发机上打包 tar czvf dbus-arm.tar.gz -C /opt/dbus . # 通过scp/uboot/tftp等方式传输到目标板 scp dbus-arm.tar.gz root@target:/opt/ # 在目标板解压 tar xzvf dbus-arm.tar.gz -C /opt/ ``` #### **(2) 部署关键文件** | 文件类型 | 目标板路径 | 说明 | |----------------|--------------------------|------------------------------| | 可执行文件 | `/usr/bin/` | `dbus-daemon`、`dbus-launch` | | 动态库 | `/usr/lib/` | `libdbus-1.so.3`(需符号链接)| | 配置文件 | `/etc/dbus-1/` | `system.conf`、`session.conf`| | 系统服务文件 | `/usr/share/dbus-1/` | 服务定义文件(如有) | #### **(3) 生成机器UUID** 在目标板上运行: ```bash /opt/dbus/bin/dbus-uuidgen > /var/lib/dbus/machine-id ``` #### **(4) 设置环境变量** 在目标板的 `/etc/profile` 或启动脚本中添加: ```bash export PATH=/opt/dbus/bin:$PATH export LD_LIBRARY_PATH=/opt/dbus/lib:$LD_LIBRARY_PATH export DBUS_SYSTEM_BUS_ADDRESS=unix:path=/var/run/dbus/system_bus_socket ``` --- ### **3. 启动测试** #### **(1) 启动系统级D-Bus** ```bash mkdir -p /var/run/dbus dbus-daemon --system --nofork --print-address & ``` #### **(2) 验证功能** ```bash # 检查进程 ps | grep dbus-daemon # 测试通信 dbus-send --system --dest=org.freedesktop.DBus \ --type=method_call --print-reply / \ org.freedesktop.DBus.ListNames ``` --- ### **4. 开机自启动** #### **(1) Systemd服务(推荐)** 创建 `/etc/systemd/system/dbus.service`: ```ini [Unit] Description=D-Bus System Bus After=syslog.target [Service] ExecStart=/opt/dbus/bin/dbus-daemon --system --nofork Restart=on-failure [Install] WantedBy=multi-user.target ``` 启用服务: ```bash systemctl enable dbus ``` #### **(2) Init.d脚本(传统系统)** 在 `/etc/init.d/` 下创建启动脚本,并添加到启动级别。 --- ### **5. 常见问题解决** #### **Q:缺少依赖库?** - 使用 `ldd /opt/dbus/bin/dbus-daemon` 检查缺失库,从工具链拷贝到目标板 `/usr/lib/` #### **Q:权限错误?** - 确保 `/var/run/dbus` 目录可写 - 以root用户运行或配置PolicyKit规则 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值