目录
1,Linux 和蓝牙架构
2,D-Bus 相关概念
2.1 Message Buses
2.2 Client, Server and Connections
2.3 Object, Interface, Methods, Signals and Properties
2.3.1 Object, Interface, Methods
2.3.2 Signal
2.3.3 Properties
3,Standard Interface
4,bluez 及依赖包
蓝牙低功耗堆栈分为两个主要的架构块,称为主机和控制器。主机和控制器部分的堆叠和层分布为如下图所示:
下图描述了使用z时Linux上蓝牙的体系结构。正如我们所看到的,Bluez实现蓝牙LE栈的主机层(Host),控制器通常驻留在芯片, 是计算机的一个组成部分,就像树莓派这样的设备一样或者在外围设备(如USB蓝牙加密狗)中实现。在 Bluez 文档和代码中,蓝牙控制器被称为适配器。
主机上的bluez和底层蓝牙栈之间的通信,是通过称为主机控制器接口的标准逻辑接口进行的,简称HCI(Host Controller Interface)。支持HCI并允许将HCI命令从主机传递到控制器,并将HCI事件从控制器传递到主机,这是标准HCI传输之一,也在核心规范中定义。
D-Bus进程间通信以消息总线为中心。消息由一个进程放置在总线上,并沿着总线传输,以传递到连接到同一总线的一个或多个其他进程。Bluez使用D-Bus系统总线传递的消息:
D-Bus 通信需要进程连接到消息总线,连接到总线的进程称为客户端。监听并接受连接的进程称为服务器。当一个应用程序连接到总线时,它将被分配一个唯一的连接名称,该名称以冒号开头,例如 :1.16
对象实现由一系列一个或多个函数或方法组成的接口,接口具有类似于域名的点分隔名称,例如,org.freedesktop.DBus.Introspectable and org.bluez.GattManager1.
应用程序可以通过发送特殊消息来调用与D-Bus连接的另一个应用程序所拥有的对象的方法。消息沿着总线并通过连接传递到拥有目标对象的应用程序。对象必须向D-Bus守护进程注册,以允许其他应用程序调用它们的方法。每个对象都有一个唯一的标识符,该标识符采用路径的形式。例如,表示蓝牙设备的对象的路径标识符可能为/org/bluez/hci0/dev_4C_D7_64-CD_22_0A
对象及其路径的注册使D-Bus守护进程能够通过适当的连接将寻址到对象标识路径的消息路由到所属应用程序。请注意,路径具有层次结构,路径中较早的部分包含或拥有路径末尾的部分。在我们的示例路径中:
(/org/bluez/hci0/dev_4C_D7_64_CD_22_0A),设备dev_4C_D7_64_CD_22_0A由蓝牙适配器对象拥有,该蓝牙适配器对象是D-Bus守护进程通过路径标识符/org/bluez/hci0/已知的。
一个Object 的 Interface 可以发出 Signal。Signal 是对象可以在未经提示的情况下发出的消息,可以将其比作事件。应用程序可以订阅或注册感兴趣的Signal。一个给定的应用程序可以注册多个信号,信号的副本将被传递到每个注册的应用程序(如上图2所示)。一些信号被传送到连接到总线的所有应用程序。
对象可以具有 Properties。Properties是一种属性,其值可以使用get操作检索或使用set操作更改。Properties 由名称引用,并且可以通过对象实现的接口进行访问。
bluetoothd
应用程序可以注册一个可以用来寻址它们的名称,而不是使用系统分配的连接名称(如:1.16)。Bluetooth 守护进程 bluetoothd 是一个D-Bus服务器,拥有众所周知的名称 org.bluez,而蓝牙meshd守护程序拥有名称org.bluez.mesh。
已经存在许多标准接口,并且在使用BlueZ时经常使用这些接口。例如 org.freedesktop.DBus.ObjectManager
此接口定义信号 InterfacesAdded 和 InterfaceRemoved。当BlueZ发现新设备时,会发出InterfacesAdded 信号,当设备不再被BlueZ感知到时,会发出 InterfacesRemoved 信号。它还定义了方法 GetManagedObjects,这允许应用程序发现D-Bus 总线上连接进程所拥有的所有对象。
org.freedesktop.DBus.Properties,该接口定义了允许检索或设置属性值的方法,以及当对象的属性更改时发出的信号 PropertiesChanged,例如,BlueZ设备对象(形式上是实现org.BlueZ.Device1接口的D-Bus对象)实现Properties接口,并在信号强度(RSSI)等属性发生变化时发出PropertiesChanged信号。
github bluez目录,目前是针对 arm 版本的编译是成功的,编译器为 arm-himix-200-gcc