当前位置:首页 > 芯闻号 > 充电吧
[导读]通信数据的设置和获取前篇主要是有讲一些相对高层的概念,比如 object,interface,method 之类的,对于这些“C 本来没有的东西”,如何在 DBus 中表现的确实很让我迷惑了一阵。但通


通信数据的设置和获取

前篇主要是有讲一些相对高层的概念,比如 object,interface,method 之类的,对于这些“C 本来没有的东西”,如何在 DBus 中表现的确实很让我迷惑了一阵。但通信数据的发送可能比前面那些名称好理解得多。因为这些概念都是很本来就是底层的,很 C 的。

DBus 提供了一个 DBusMessageIter 的类型,使用这个类型的变量,我们就可以向 DBusMessage 中很容易地加入数据,也可以很容易地从中取出数据。

DBusMessage* msg;DBusMessageIter args; // msg... dbus_message_iter_init_append(msg, &args);dbus_uint32_t my_data = 10;if(!dbus_message_iter_append_basic(&args, DBUS_TYPE_UINT32, &my_data)) {    printf("Out of memoryn");    return RES_FAILED;} dbus_connection_flush(conn);dbus_message_unref(msg);

第 2 行的代码声明了一个 DBusMessageIter 的对象 args,第 6 行的代码处,对 args 进行初始化,这可以让一个 DBusMessageIter 对象与对应的 DBusMessage 关联起来,后面再对 DBusMessageIter的时候(设置或者取得数据),就是对相应的 DBusMessage 进行处理。然后使用第8行的函数,将一个 uint32 的数据 my_data 追加到 msg 中了。如果还要追加新的参数的话,只需要继续调用该函数,并传入适当的参数就可以了。

dbus_bool_t dbus_message_iter_append_basic(DBusMessageIter * iter,                                                          inttype,                                           const void *      value                                           )

这个函数可以用来向 DBusMessageIter 中追加一些“基本类型”(basic)的数据,所谓基本类型的数据,在 DBus 中是这么定义的:

Conventional Name

Encoding

Alignment

BYTE

A single 8-bit byte.

1

BOOLEAN

As for UINT32, but only 0 and 1 are valid values.

4

INT16

16-bit signed integer in the message's byte order.

2

UINT16

16-bit unsigned integer in the message's byte order.

2

INT32

32-bit signed integer in the message's byte order.

4

UINT32

32-bit unsigned integer in the message's byte order.

4

INT64

64-bit signed integer in the message's byte order.

8

UINT64

64-bit unsigned integer in the message's byte order.

8

DOUBLE

64-bit IEEE 754 double in the message's byte order.

8

STRING

UINT32 indicating the string's length in bytes excluding its terminating nul, followed by non-nul string data of the given length, followed by a terminating nul byte.

4

(for the length)

OBJECT_PATH Exactly the same as STRING except the content must be a valid object path (see below).

4

(for the length)

(参考 DBus 的在线 API 的 Marshaling (Wire Format) 一节)

有 basic type,当然也就有更复杂的不是 basic 的类型,但这和基本概念的关系不大,在这篇文章中就不多介绍了。(请参考我其它的 DBus 博文)

到现在为止,我已经知道如何把数据入到一个 DBusMessage 中了,那么,如何从一个 DBusMessage 中取出数据呢?比如,我在 A 进程使用上面的代码把 my_data 加到 DBusMessage 中了,现在 B 进程取到了 DBusMessage,如何把数据取出来呢?

DBusMessage* msg;DBusMessageIter args; // get a DBusMessage from process A if(!dbus_message_iter_init(msg, &args)) {    printf("dbus_message_iter_init error, msg has no arguments!n");}else if (DBUS_TYPE_UINT32 != dbus_message_iter_get_arg_type(&args)){    printf("not a uint 32 type !n");}else {    dbus_uint32_t my_age = 0;    dbus_message_iter_get_basic(&args, &my_age);    printf("Got signal with value %dn", my_age);}

很简单,一样的先使用 dbus_messge_iter_init 先把 DBusMessage 对象和从 DBus 总线中取到的 msg 关联起来。这样,使用第 9 行的函数先取得第一个通信数据中第一个参数的类型,如果类型无误的话可以进而使用第 14 行的函数取得参数值本身。

这样,一个简单的数据如何入到 DBusMessage 中,又如何从 DBusMessage 中取出来就明白了。那么如何将 DBusMessage 在进程之间传递呢?

消息的发送和获取

消息的发送其实比较简单,当进程 A 准备申请好一个 DBusMessage对象,设置好它的“类型”(就是各种名字),放好需要通信的数据,之后,使用下面的代码就可以将数据发送到总线上:

dbus_uint32_t serial = 0; if(!dbus_connection_send(conn, msg, &serial)) {    printf("Out of memory");    return RES_FAILED;}dbus_connection_flush(conn);

这很简单,只是 dbus_connection_flush 这个函数有点突兀,它的作用是“Blocks until the outgoing message queue is empty.”,可以简单地理解为调用这个函数可以使用得发送进程一直等消息发送完了才能继续运行。

接受方的代码也很简单:

dbus_connection_read_write(conn, 0);msg = dbus_connection_pop_message(conn); if(NULL == msg) {    sleep(1);    continue;}

使用 1 和 2 行的代码就可以取出发送到本进程的消息,之后就可以使用 msg (如果 msg 不是 NULL 的话)来获取通信数据了。

 

到这里,基本概念就有了。后面,应该对 DBus 的细节再深入的探索。

 

Sample 代码:

发送方进程(my_client):

My_Client.cpp #include 

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭