BlueZ 开发学习指南(一) — D-Bus介绍
一、 BlueZ与D-Bus简介
Linux使用的蓝牙协议栈是Blue Z,不同于我们以往的开发方式,Blue Z提供的API 并不是通过头文件这样的形式, 而是通过D-Bus的方式来提供的。
Blue Z提供的是Host端的协议栈,Control端的协议往往由专门的芯片厂提供。Host和Control通过HCI接口来通讯。HCI接口可以是UART、USB、SD卡,也可以是虚拟的。
下图是应用通过D-Bus与Blue Z进行通讯的过程。D-Bus最初是作为一种标准的基于消息的通信系统创建的,以促进个人计算机上X-Windows桌面环境中组件之间的互操作性。但D-Bus比设计桌面GUI组件的通信具有更广泛的实用性。 自Blue Z 5.52版本以来,它已经成为Linux上运行的蓝牙应用程序与BlueZ本身之间的标准接口。了解如何使用D-Bus是再Linux下做BlueZ相关开发的关键。
BlueZ中提供的API都在代码仓库的doc目录中,也可以通过下面链接查看: https://git.kernel.org/pub/scm/bluetooth/bluez.git/tree/doc
BlueZ应用程序不直接调用BlueZ函数,也不直接从BlueZ中接收回调。 无需根据BlueZ头文件编译应用程序代码。 D-Bus将应用程序与BlueZ完全解耦, 因此蓝牙应用程序开发工作,主要涉及使用D-Bus API发送或接收消息。
二、 D-Bus的基本概念
消息总线
D-Bus 进程间通信以消息总线为中心。 消息由一个进程放置在总线上,然后沿着总线传输到连接到同一总线的一个或多个其他进程。
有两种类型的消息总线,分别是系统总线和会话总线。
- 系统总线只有一个实例,BlueZ 使用的就是系统总线。
- Linux 中每个用户登录会话都存在一个会话总线
客户端、 服务端、 连接
D-Bus 通信需要将进程连接到消息总线, 连接到总线的进程称为客户端,监听并接受连接的进程称为服务端。 客户端和服务端只针对建立连接的