基于Bluez的应用程序的开发 下载本文

使用dbus daemon,所有的应用程序都是client,daemon监听所有的连接,应用程序初始化连接到daemon。dbus地址指明server将要监听的地方,client将要连接的地方,例如,地址:unix:path=/tmp/abcdef表明 server将在/tmp/abcdef路径下监听unix域的socket,client也将连接到这个socket。一个地址也可以指明是TCP /IP的socket,或者是其他的。

当使用bus daemon时,libdbus会从环境变量中

(DBUS_SESSION_BUS_ADDRESS)自动认识“会话daemon”的地址。如果是系统 daemon,它会检查指定的socket路径获得地址,也可以使用环境变量(DBUS_SESSION_BUS_ADDRESS)进行设定。当dbus中不使用daemon时,需要定义哪一个应用是server,哪一个应用是client,同时要指明server的地址,这不是很通常的做法。

D-bus工作原理

Calling a Method – Behind the Scenes

在dbus中调用一个方法包含了两条消息,进程A向进程B发送方法调用消息,进程B向进程A发送应答消息。所有的消息都由daemon进行分派,每个调用的消息都有一个不同的序列号,返回消息包含这个序列号,以方便调用者匹配调用消息与应答消息。调用消息包含一些参数,应答消息可能包含错误标识,或者包含方法的返回数据。 方法调用的一般流程:

1.使用不同语言绑定的dbus高层接口,都提供了一些代理对象,调用其他进程里面的远端对象就像是在本地进程中的调用一样。应用调用代理上的方法,代理将构造一个方法调用消息给远端的进程。

2.在DBUS的底层接口中,应用需要自己构造方法调用消息(method call message),而不能使用代理。 3.方法调用消息里面的内容有:目的进程的bus name,方法的名字,方法的参数,目的进程的对象路径,以及可选的接口名称。 4.方法调用消息是发送到bus daemon中的。

5.bus daemon查找目标的bus name,如果找到,就把这个方法发送到该进程中,否则,daemon会产生错误消息,作为应答消息给发送进程。

6.目标进程解开消息,在dbus底层接口中,会立即调用方法,然后发送方法的应答消息给daemon。在dbus高层接口中,会先检测对象路径,接口,方法名称,然后把它转换成对应的对象(如GObject,QT中的QObject等)的方法,然后

再将应答结果转换成应答消息发给daemon。

7.bus daemon接受到应答消息,将把应答消息直接发给发出调用消息的进程。 8.应答消息中可以包容很多返回值,也可以标识一个错误发生,当使用绑定时,应答消息将转换为代理对象的返回值,或者进入异常。

bus daemon不对消息重新排序,如果发送了两条消息到同一个进程,他们将按照发送顺序接受到。接受进程并需要按照顺序发出应答消息,例如在多线程中处理这些消息,应答消息的发出是没有顺序的。消息都有一个序列号可以与应答消息进行配对。

Emitting a Signal – Behind the Scenes

在dbus中一个信号包含一条信号消息,一个进程发给多个进程。也就是说,信号是单向的广播。信号可以包含一些参数,但是作为广播,它是没有返回值的。 信号触发者是不了解信号接受者的,接受者向daemon注册感兴趣的信号,注册规则是”match rules”,记录触发者名字和信号名字。daemon只向注册了这个信号的进程发送信号。 信号的一般流程如下:

1.当使用dbus底层接口时,信号需要应用自己创建和发送到daemon,使用dbus高层接口时,可以使用相关对象进行发送,如Glib里面提供的信号触发机制。 2.信号包含的内容有:信号的接口名称,信号名称,发送进程的bus name,以及其他参数。

3.任何进程都可以依据”match rules”注册相关的信号,daemon有一张注册的列表。 4.daemon检测信号,决定哪些进程对这个信号感兴趣,然后把信号发送给这些进程

5.每个进程收到信号后,如果是使用了dbus高层接口,可以选择触发代理对象上的信号。如果是dbus底层接口,需要检查发送者名称和信号名称,然后决定怎么做。

2.3、Bluez的安全接口

pin_helper concept has been removed starting with bluez-utils 3.X. and has been replaced with a feature called passkey agents. An application that wants to handle passkey requests must use the \security interface to register a passkey agent. Currently, two types of passkey agents are supported: default and device specific. A \a default handles all requests for which a specific agent was not found. \passkey agents are useful to address pre-defined passkey values or environments where the user interaction is not allowed/difficult.

When the CreateBonding method is called the \is a link key stored in the file system. If it is available an error is returned, and if not, a D-Bus message is sent to the registered passkey agent asking for a passkey.

Each Passkey Agent is represented by a D-Bus object path. The \distinguishes the agents based on their unique bus names and their object paths. Pin_help的理念在bluez-util 3.x时已经被移除,并被密钥代理所代替。任何想处理密钥请求的应用程序必须使用hcid安全接口来注册密钥代理。现在支持两种类型的密钥代理:默认和设备特定。一个\特定\的密钥代理处理所有远端的密钥请求,一个默认的密钥代理,处理特定的代理所没有发现的所有密钥请求。\特定\的密钥代理对处理那些和用户交互困难或者不允许用户交互的设备的预定义的密钥值或环境非常有用。

当CreateBonding方法被调用时,hcid守护进程将确认当前的文件系统中是否保存了链接密钥,若可以找到,就返回一个错误。若找不到,D-Bus消息将被发出来为密钥请求的设备,注册一个密钥代理。每个密钥代理被D-Bus对象路径所体现,hcid依据唯一的总线名称和对象路径来区分代理。 Architecture

? ? ?

Step 1: Represents the passkey agent registration Step 2: Represents a client calling CreateBonding Step 3: Represents the hcid asking for a passkey valu

体系结构

? 第一步:表示密钥代理注册

? 第二步:表示客户调用CreateBonding ? 第三步:代表hcid请求密钥值。

Message Flow

In the following figure, the \method call is hidden. The \Request\In this case \Request\

在下面得图表中,CreateBonding方法的调用被隐藏。当没有一个可用链接时,\Request\层事件被产生,在这种情况下,\Key Request Negative Reply\命令被发送来回应\事件。

Step 1: Represents the D-Bus message sent to register the default/device specific passkey agent.

? Step 2: Represents the HCI \Controller.

? Step 3: Represents the D-Bus message sent to the default/device speficic passkey agent requesting a passkey.

? Step 4: Represents the \Response Timeout\

? Step 5: Represents the \? Step 6: Represents the D-Bus message sent to release the passkey agent: basically sent when the hcid exits.

?

? 第一步:D-Bus发送消息来注册默认的或者特定的密钥代理。 ? 第二步:蓝牙主机控制器发送HCI 层\事件。

? 第三步:D-Bus发送消息到默认的或者特定的密钥代理,请求密钥。

? 第四步:\Complete\完成事件,如果这种状态包含\Response Timeout\。

? 第五步:hcid发出“Cancel”命令给D-Bus。

? 第六步:当hcid退出时,D - Bus的信息发送到释放密钥代理

2.4、Bluez适配器接口

Description?

The \devices, pairing and search for services.

This interface is considered stable and no change is planned.

For each available adapter the hcid register an adapter object instance provided in the path \

适配器接口提供,启动适配器、搜索设别、配对、和搜索服务的方法。这个接口被认为是稳定的,没有改变计划。对每个可用的适配器,hcid为其注册一个适配器对象实例,在路径 \里。