2017-03-21 16:54:09 huashibuliao 阅读数 473
  • Linux驱动之USB设备驱动

    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟USB设备交互,得到其所有的各种描述符,并为每个接口都定义成为一个device,之后再加载到usb_bus上,让其去匹配其对应的接口驱动程序。

    2449 人正在学习 去看看 韦东山

0、D-BUS是干啥的?请百度

1、 D-BUS 编译依赖expat, expat干啥的,请百度

2、我的环境:centOS6.8

3、expat版本expat-2.2.0 d-bus版本dbus-1.10.16

4、expat:http://download.csdn.net/detail/huashibuliao/9788765

5、d-bus:http://download.csdn.net/detail/huashibuliao/9788761

6、先编译expat并安装

a、下载expat源码后解压

b、在解压后的源码目录依次执行./configure、make、make install

7、再编译d-bus

a、下载d-bus源码后解压

b、再解压后的源码目录依次执行.configure、make

8、大功告成。


2019-06-21 16:51:53 biu__biu_biu 阅读数 98
  • Linux驱动之USB设备驱动

    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟USB设备交互,得到其所有的各种描述符,并为每个接口都定义成为一个device,之后再加载到usb_bus上,让其去匹配其对应的接口驱动程序。

    2449 人正在学习 去看看 韦东山

前言:

在使用Qt D-Bus编程之前,还需了解Qt 提供的D-Bus工具,Qt IDE环境提供了两个用于D-Bus编程的小工具,分别是Qt D-Bus XML compiler 和 D-Bus Viewer 。灵活运用这两个小工具能快速的实现接口调试和生成。

另:因为D-Bus最初是为Linux设计,目前大部分Linux系统都采用了D-Bus来实现进程通信,所以在Windows系统下要使用D-Bus要自己进行安装D-Bus或编译D-Bus库,博主在网上找到了编译好的D-Bus安装包,如需要更高版本,需要自己编译,下载链接如下:

DBus-Windows-Installer 多版本合辑

Qt D-Bus XML compiler:

该工具,可以用来解析接口描述并生成表示这些接口的静态代码,然后可以用来调用远程对象或实现所述接口,它提供了两个命令,qdbusxml2cpp命令可以产生两种输出:接口(代理)类或适配器类。后者包括一个c++头文件和一个源文件,可以根据需要对其进行编辑和调整。qdbuscpp2xml可以根据提供的接口文件生成XML文件,然后使用qdbusxml2cpp生成接口类和适配器类。

qdbusxml2cpp语法如下:

qdbusxml2cpp [options] xml-or-xml-file [interfaces ...]

Options参数如下:
  -?, -h, --help                    显示帮助信息.
  -v, --version                     显示版本信息.
  -a, --adaptor <filename>          将适配器代码写入<filename>
  -c, --classname <classname>          使用classname作为生成类的类名
  -i, --include <filename>          将#include<filename>添加到包含输出
  -l <classname>                    当生成Adaptor代码时,使用classname作为父类
  -m, --moc                         在cpp文件中包含 #include "filename.moc"语句
  -N, --no-namespaces               不使用名称空间
  -p, --proxy <filename>            将代理代码写入<filename>
  -V, --verbose                     详细信息

例:

解析Book.xml文件 生成Adaptor类,且包含Data.h文件,生成的文件名为BookAdaptor

qdbusxml2cpp Book.xml -i Data.h -a BookAdaptor

解析Book.xml文件生成接口Proxy代理类文件,生成的文件名为 BookInterface

qdbusxml2cpp Book.xml -p BookInterface

qdbuscpp2xml 语法如下:

qdbuscpp2xml [options...] [files...]

Options参数如下:
  -p|-s|-m       只解析可编写脚本的属性、信号和方法(槽)
  -P|-S|-M       解析所有属性、信号和方法(槽)
  -a             输出所有可编写脚本的内容(相当于-psm)
  -A             输出所有内容(相当于-PSM)
  -o <filename>  将输出写入文件<filename>
  -h             显示这个信息
  -V             显示程序版本并退出

例:

解析Book.h接口文件的所有内容并生成Book.xml

qdbuscpp2xml -A Book.h -o Book.xml

D-Bus Viewer

Qt D-Bus Viewer是一个总线查看工具,允许您查看D-Bus对象和消息。您可以在系统总线和会话总线之间进行选择。单击左侧列表上的任何服务,查看所有导出的对象。您可以通过双击方法来调用它们。如果方法接受一个或多个参数,则会打开属性编辑器。右键单击要连接到它的信号。所有发出的信号(包括它们的参数)都在窗口下方的message视图中输出

另:在命令行中输入qdbusviewer就会启用该工具或者在QtCreator安装目录下的bin目录下双击qdbusviewer.exe

例:如果Qt安装在E盘下则E:\Qt5.11.3\5.11.3\msvc2015\bin 目录下的qdbusviewer.exe

运行界面如下:

PS:详细操作后面代码分析时会进一步介绍。

2016-12-07 23:41:28 yjwx0018 阅读数 307
  • Linux驱动之USB设备驱动

    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟USB设备交互,得到其所有的各种描述符,并为每个接口都定义成为一个device,之后再加载到usb_bus上,让其去匹配其对应的接口驱动程序。

    2449 人正在学习 去看看 韦东山

简介

D-Bus是一种Linux下常用的进程间通信技术。

参考

和菜鸟一起学linux之DBUS基础学习记录
D-Bus Tutorial

D-BUS
2018-12-08 14:10:52 kyopeng123 阅读数 236
  • Linux驱动之USB设备驱动

    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟USB设备交互,得到其所有的各种描述符,并为每个接口都定义成为一个device,之后再加载到usb_bus上,让其去匹配其对应的接口驱动程序。

    2449 人正在学习 去看看 韦东山

D-BUS 是一个大有前途的消息总线和活动系统,正开始深入地渗透到 Linux® 桌面之中。了解创建它的原因、它的用途以及发展前景。

D-BUS 本质上是 进程间通信(inter-process communication)(IPC)的一个实现。不过,有一些特性使得 D-BUS 远远不是“只是另一个 IPC 实现”。有很多不同的 IPC 实现,因为每一个都定位于解决特定的明确定义的问题。CORBA 是用于面向对象编程中复杂的 IPC 的一个强大的解决方案。DCOP 是一个较轻量级的 IPC 框架,功能较少,但是可以很好地集成到 K 桌面环境中。SOAP 和 XML-RPC 设计用于 Web 服务,因而使用 HTTP 作为其传输协议。D-BUS 设计用于桌面应用程序和 OS 通信。

桌面应用程序通信

典 型的桌面都会有多个应用程序在运行,而且,它们经常需要彼此进行通信。DCOP 是一个用于 KDE 的解决方案,但是它依赖于 Qt,所以不能用于其他桌面环境之中。类似的,Bonobo 是一个用于 GNOME 的解决方案,但是非常笨重,因为它是基于 CORBA 的。它还依赖于 GObject,所以也不能用于 GNOME 之外。 D-BUS 的目标是将 DCOP 和 Bonobo 替换为简单的 IPC,并集成这两种桌面环境。由于尽可能地减少了 D-BUS 所需的依赖,所以其他可能会使用 D-BUS 的应用程序不用担心引入过多依赖。

桌面/操作系统通信

术 语“操作系统”在这里不仅包括内核,还包括系统后台进程。例如,通过使用 D-BUS 的 udev(Linux 2.6 中取代 devfs 的,提供动态 /dev 目录),当设备(比如一个 USB 照相机)插入时会发放出一个信号。这样可以更紧密地将硬件集成到桌面中,从而改善用户体验。

D-BUS 特性

D-BUS 有一些有趣的特性,使其像是一个非常有前途的选择。

协 议是低延迟而且低开销的,设计得小而高效,以便最小化传送的往返时间。另外,协议是二进制的,而不是文本的,这样就排除了费时的序列化过程。由于只面向本 地机器处理的使用情形,所以所有的消息都以其自然字节次序发送。字节次序在每个消息中声明,所以如果一个 D-BUS 消息通过网络传输到远程的主机,它仍可以被正确地识别出来。

从开发者的角度来看,D-BUS 是易于使用的。有线协议容易理解,客户机程序库以直观的方式对其进行包装。

程 序库还设计用于为其他系统所包装。预期,GNOME 将使用 GObject 创建包装 D-BUS 的包装器(实际上这些已经部分存在了,将 D-BUS 集成入它们的事件循环),KDE 将使用 Qt 创建类似的包装器。由于 Python 具有面向对象特性和灵活的类型,已经有了具备类似接口的 Python 包装器。

最后,D-BUS 正在 freedesktop.org 的保护下进行开发,在那里,来自 GNOME、KDE 以及其他组织的对此感兴趣的成员参与了设计与实现。

D-BUS 的内部工作方式

典 型的 D-BUS 设置将由几个总线构成。将有一个持久的 系统总线(system bus),它在引导时就会启动。这个总线由操作系统和后台进程使用,安全性非常好,以使得任意的应用程序不能欺骗系统事件。还将有很多 会话总线(session buses),这些总线当用户登录后启动,属于那个用户私有。它是用户的应用程序用来通信的一个会话总线。当然,如果一个应用程序需要接收来自系统总线的 消息,它不如直接连接到系统总线 —— 不过,它可以发送的消息将是受限的。

一 旦应用程序连接到了一个总线,它们就必须通过添加 匹配器(matchers) 来声明它们希望收到哪种消息。匹配器为可以基于接口、对象路径和方法进行接收的消息指定一组规则(见后)。这样就使得应用程序可以集中精力去处理它们想处 理的内容,以实现消息的高效路由,并保持总线上消息的预期数量,以使得不会因为这些消息导致所有应用程序的性能下降并变得很慢。

对象

本 质上,D-BUS 是一个对等(peer-to-peer)的协议 —— 每个消息都有一个源和一个目的。这些地址被指定为 对象路径。概念上,所有使用 D-BUS 的应用程序都包括一组 对象,消息发送到或者发送自特定对象 —— 不是应用程序 —— 这些对象由对象路径来标识。

另 外,每个对象都可以支持一个或多个 接口(interfaces)。这些接口看起来类似于 Java 中的接口或者 C++ 中的纯粹的虚类(pure virtual classes)。不过,没有选项来检查对象是否实现了它们所声明的接口,而且也没有办法可以调查对象内部以使列出其支持的接口。接口用于名称空间和方法 名称,因此一个单独的对象可以有名称相同而接口不同的多个方法。

消息

在 D-BUS 中有四种类型的消息:方法调用(method calls)、方法返回(method returns)、信号(signals)和错误(errors)。要执行 D-BUS 对象的方法,您需要向对象发送一个方法调用消息。它将完成一些处理并返回一个方法返回消息或者错误消息。信号的不同之处在于它们不返回任何内容:既没有 “信号返回”消息,也没有任何类型的错误消息。

消息也可以有任意的参数。参数是强类型的,类型的范围是从基本的非派生类型(布尔(booleans)、字节(bytes)、整型(integers))到高层次数据结构(字符串(strings)、数组( arrays)和字典(dictionaries))。

服务

服 务(Services) 是 D-BUS 的最高层次抽象,它们的实现当前还在不断发展变化。应用程序可以通过一个总线来注册一个服务,如果成功,则应用程序就已经 获得 了那个服务。其他应用程序可以检查在总线上是否已经存在一个特定的服务,如果没有可以要求总线启动它。服务抽象的细节 —— 尤其是服务活化 —— 当前正处于发展之中,应该会有变化。

用例

尽 管 D-BUS 相对较新,但是却迅速地得到了采用。如前所述,可以构建具有 D-BUS 支持的 udev 以使得当热插拔(hot-plug)设备时它可以发送一个信号。任何应用程序都可以侦听这些事件并当接收到这些事件时执行动作。例如,gnome- volume-manager 可以检测到 USB 存储棒的插入并自动挂载它;或者,当插入一个数码相机时它可以自动下载照片。

一 个更为有趣但很不实用的例子是 Jamboree 和 Ringaling 的结合。Jamboree 是一个简单的音乐播放器,它具有 D-BUS 接口,以使得它可以被告知播放、到下一首歌、改变音量等等。Ringaling 是一个小程序,它打开 /dev/ttyS0(一个串行端口)并观察接收到的内容。当 Ringaling 发现文本“RING”时,就通过 D-BUS 告知 Jamboree 减小音量。最终的结果是,如果您的计算机上插入了一个调制解调器,而且电话铃响,则音乐音量就会为您减小。这 正是计算机所追求的!

代码示例

现在,让我们来接触一些使用 D-BUS 代码的示例。

dbus-ping-send.c 每秒通过会话总线发送一个参数为字符串“Ping!”的信号。我使用 Glib 来管理总线,以使得我不需要自己来处理总线的连接细节。

清单 1. dbus-ping-send.c

#include <glib.h>
  #include <dbus/dbus-glib.h>
  
  static gboolean send_ping (DBusConnection *bus);
  
  int
  main (int argc, char **argv)
  {
   GMainLoop *loop;
   DBusConnection *bus;
   DBusError error;
  
   /* Create a new event loop to run in */
   loop = g_main_loop_new (NULL, FALSE);
  
   /* Get a connection to the session bus */
   dbus_error_init (&error);
   bus = dbus_bus_get (DBUS_BUS_SESSION, &error);
   if (!bus) {
    g_warning ("Failed to connect to the D-BUS
 daemon: %s", error.message);
    dbus_error_free (&error);
    return 1;
   }
  
   /* Set up this connection to work in a GLib event loop */
   dbus_connection_setup_with_g_main (bus, NULL);
   /* Every second call send_ping() with the bus as an argument*/
   g_timeout_add (1000, (GSourceFunc)send_ping, bus);
  
   /* Start the event loop */
   g_main_loop_run (loop);
   return 0;
  }
  
  static gboolean
  send_ping (DBusConnection *bus)
  {
   DBusMessage *message;
  
   /* Create a new signal "Ping" on the 
"com.burtonini.dbus.Signal" interface,
    * from the object "/com/burtonini/dbus/ping". */
   message = dbus_message_new_signal 
("/com/burtonini/dbus/ping",
      "com.burtonini.dbus.Signal", "Ping");
   /* Append the string "Ping!" to the signal */
   dbus_message_append_args (message,
                DBUS_TYPE_STRING, "Ping!",
                DBUS_TYPE_INVALID);
   /* Send the signal */
   dbus_connection_send (bus, message, NULL);
   /* Free the signal now we have finished with it */
   dbus_message_unref (message);
   /* Tell the user we send a signal */
   g_print("Ping!/n");
   /* Return TRUE to tell the event loop 
we want to be called again */
   return TRUE;
  }
main 函数创建一个 GLib 事件循环,获得会话总线的一个连接,并将 D-BUS 事件处理集成到 Glib 事件循环之中。然后它创建了一个名为 send_ping 间隔为一秒的计时器,并启动事件循环。

 

 

最近在设计一个linux桌面程序。而进程间的交互准备使用dbus来解决。

介绍:

有那么个组织叫freedesktop,它是专门为linux桌面制定标准的。什么KDE,GNOME都是按他的标准来的。而dbus是其中的桌面消息机制的一个标准。

dbus是一个IPC的管理系统,其实就底层来说就是本地socket通信。但是他是将所有的消息都通过总线的方式来管理分发,易于管理和安全。

dbus一般就是3层结构:

1. libdbus库,允许两个应用相互连接交换消息
2. 一个建立在libdbus上的消息总线守护程序,这个守护程序可以路由消息
3. 封装库,比如libdbus-glib或libdbus-qt。一般都是使用封装库来简化使用dbus的细节。

一般gtk(c语言)开发的话,可以使用gobject-dbus库,qt(c++)的话可以使用dbus-qt库,而python使用python-dbus模块。

还有nodejs的话,我推荐使用node-native模块(配合nodewebkit还是比较好用的)。

还有做dbus相关开发的话,使用一个叫d-feet工具,就可以查看当前所有在使用中的dbus名称及其他属性。

dbus分为两种总线,一种叫SystemBus,一种叫SessionBus。SystemBus就只有一条,SessionBus是一个用户会话时会产生一条。至于这两种的区别,SystemBus一般是用于权限较高的系统级(root)进程与其他进程(可以是普通进程)的通信,而SessionBus是用于普通的用户进程之间的交流。

dbus是单对单的通信,其实和C/S架构差不多,一个server端接收消息和发布信号,多个client端发送消息和接收信号。

dbus通信的话有5个值需要注意:

1. Address:因为dbus也是通过本地socket来通信,所有会有socket文件。你可以直接连接这个sokcet文件的地址来通信,但这个我几乎不用。

2. Bus Name:当你使用总线守护进程时(你看进程表里不是有很多dbus-daemon嘛,3层结构的第二层),你只用通过一个Bus Name就可以直接将消息路由到你想要的地址。所以这么方便,干嘛用上面的。server端想要Bus Name需要向SystemBus或SessionBus申请。如果不申请连接到dbus,它会自动被分配一个唯一的名字,就是1.45之类的,这数字没什么意义,只是为了名字唯一。名字除了路由消息还有第二种用途,就是当一个程序退出,断开连接,消息总线就会提醒其他连接程序该名字失去了所有者。这样就容易管理其他程序了

3. Path:这个路径是指你在进程里的路径,你可以按模块来划分,比如NetwrokManager 有 无线和有线这两模块。

4. Interface:他就像是一组功能的集合名字,你可以按功能来划分。

5. Method/Signals:方法和信号,方法其实就是进程里的函数名,你发消息给这个函数名,这个函数就会被调用,并返回结果。信号就是当server端主动调用这个信号函数的时候,便会发出这个信号(信号名就是函数名),其他连接在同一总线上的程序,如果谁感兴趣就会接收处理。

所以总的来说,其实可以这样理解,Address和Bus Name就相当于你家的城市地址,Path就相当于你家住哪个县哪个区,Interface就相当于你家哪个村哪个路,Method就相当于你家哪个人。dbus则充当了邮局的身份。

那先尝试下发送个消息看看:

d-feet在SystemBus下可以找到org.freedesktop.DBus这个Bus Name,它有个Path叫 “ / ”,“ / ”下面有org.freedesktop.DBus这个Interface,里面有个叫GetId的Methods,可以跟它通信一下。这里使用dbus-send命令来发送。dbus-send是dbus提供的一个命令,可直接向目标发送消息。

~ dbus-send --system --print-reply --dest=org.freedesktop.DBus / org.freedesktop.DBus.GetId

返回打印出了一个值,这个值就是GetId函数的执行结果。

dbus-send使用方法: --system表示是System Bus,--print-reply表示打印回复信息, --desk=[Bus Name] [Path] [Interface].[Method] 表示地址,注意Method是接在Interface后面的。

dbus python示例可以看http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html  比较详细

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

2018-11-24 22:41:13 weixin_35638392 阅读数 121
  • Linux驱动之USB设备驱动

    不管是USB设备还是USB接口,都会被注册到同一个bus上,也就是usb_bus_type,其之间的区别会在match函数中区分,之后再去绑定不同的driver。 当一个USB设备被插入的时候,USB设备驱动,也就是usb_generic_driver会跟USB设备交互,得到其所有的各种描述符,并为每个接口都定义成为一个device,之后再加载到usb_bus上,让其去匹配其对应的接口驱动程序。

    2449 人正在学习 去看看 韦东山

D-Bus介绍

D-Bus是一种进程间通信(IPC)和远程过程调用(RPC)机制,最初是为Linux开发的,目的是用一个统一的协议替代现有的和竞争的IPC解决方案。它还被设计成允许系统级进程(例如打印机和硬件驱动程序服务)和普通用户进程之间进行通信。
它使用了一种快速的二进制消息传递协议,由于其低延迟和低开销,该协议适用于同机通信。它的规范目前由freedesktop.org项目定义,所有各方都可以使用。
通信通常通过称为“总线(bus)”(因此得名)的中央服务器应用程序进行,但是也可以直接进行应用程序到应用程序的通信。当在总线上通信时,应用程序可以查询哪些其他应用程序和服务可用,以及按需激活一个。

The Buses

D-Bus总线用于需要多对多通信时。为了实现这一点,在任何应用程序可以连接到总线之前启动一个中央服务器:该服务器负责跟踪已连接的应用程序,并正确地将消息从源路由到目的地。
此外,D-Bus定义了两个著名的总线,称为系统总线和会话总线。这些总线的特殊之处在于它们具有定义良好的语义:一些服务被定义在这些总线中的一个或两个中。
例如,希望查询附加到计算机上的硬件设备列表的应用程序可能会与系统总线上可用的服务通信,而提供打开用户web浏览器的服务可能会在会话总线上找到。
在系统总线上,还可以期望找到每个应用程序允许提供的服务的限制。因此,可以合理地确定,如果存在某种服务,那么它是由受信任的应用程序提供的。

Concepts

Messages

在底层,应用程序通过D-Bus相互发送消息进行通信。Messages用于中继远程过程调用以及与之相关的应答和错误。当在Bus上使用时,消息有目的地,这意味着它们只被路由到相关方,避免了由于“群集”或广播而造成的拥塞。
但是,一种称为“signal message”的特殊类型的消息(基于Qt的信号和插槽机制的概念)没有预定义的目的地。因为它的目的是在一对多的上下文中使用,所以signal message被设计成通过“选择加入”机制工作。
Qt D-Bus模块将消息的低级概念完全封装为Qt开发人员熟悉的更简单、面向对象的方法。在大多数情况下,开发人员不必担心发送或接收消息。

Service Names

当通过总线通信时,应用程序获得所谓的“Service Names”:这是该应用程序选择由同一总线上的其他应用程序知道的方式。Service Names由D-Bus总线守护进程代理,用于将消息从一个应用程序路由到另一个应用程序。与服务名类似的概念是IP地址和主机名:一台计算机通常有一个IP地址,它可能有一个或多个主机名,根据它向网络提供的服务。
另一方面,如果不使用总线,也不使用服务名称。如果我们再次将其与计算机网络进行比较,这将等同于点到点网络:由于对等点是已知的,因此不需要使用主机名或它的IP地址来查找它。
D-Bus服务名称的格式实际上非常类似于主机名称:它是由字母和数字组成的点分隔序列。通常的做法甚至是根据定义该服务的组织的域名来命名服务名称。
例如,D-Bus服务由freedesktop.org定义,可以在bus上找到服务名称:

org.freedesktop.DBus

Object Paths

与网络主机一样,应用程序通过导出对象向其他应用程序提供特定的服务。这些对象是分层组织的,很像从QObject派生的类所拥有的父子关系。然而,有一个区别是存在“root object”的概念,所有对象都具有最终的父对象。
如果我们继续与Web服务进行类比,则Object Paths等同于URL的路径部分:
在这里插入图片描述
与它们类似,D-Bus中的Object Paths也类似于文件系统中的路径名:它们是斜杠分隔的标签,每个标签由字母、数字和下划线字符(“_”)组成。它们必须以斜杠开始,而不能以斜杠结束.

Interfaces

Interfaces类似于c++抽象类和Java的接口关键字,声明调用者和被调用者之间建立的“契约”。也就是说,它们建立了可用的方法、信号和属性的名称,以及通信建立时双方期望的行为。
Qt在其插件系统中使用了非常类似的机制:c++中的基类通过Q_DECLARE_INTERFACE()宏与惟一标识符相关联。
实际上,D-Bus接口名的命名方式与Qt插件系统所建议的类似:标识符通常由定义该接口的实体的域名构建。

为便于记住命名格式,可使用如下对比表:
在这里插入图片描述

Debugging

在开发使用D-Bus的应用程序时,有时能够看到关于每个应用程序通过总线发送和接收的消息的信息是很有用的。
通过在运行每个应用程序之前设置QDBUS_DEBUG环境变量,可以在每个应用程序的基础上启用该特性。例如,在 D-Bus Remote Controlled Car Example 的例子中,我们只能对小车进行调试,通过控制器和小车的运行方式如下:

examples/dbus/remotecontrolledcar/controller/controller &
QDBUS_DEBUG=1 examples/dbus/remotecontrolledcar/car/car &

有关消息的信息将写到应用程序启动时所在的控制台。

D-BUS基础知识

阅读数 622

D-BUS详解

阅读数 1787

Qt D-Bus介绍

阅读数 149

Qt D-Bus

阅读数 1533

没有更多推荐了,返回首页