bluez-5.56源码
https://mirrors.edge.kernel.org/pub/linux/bluetooth/bluez-5.64.tar.xz
0、bluez5开发
bluez5主要提供基于HCI和基于DBUS的接口,基于HCI的接口主要用于更细致控制蓝牙硬件模块,而基于DBUS的接口提供大量的蓝牙上层协议,能更好的管理蓝牙。
不使用glib、dbus开发的话,想要开发周边设备可以借鉴btmgmt.c和btgatt-server.c、btgatt-client.c
使用glib、dbus开发的话,可以参考gatt-service.c
user space
APP:上层应⽤程序
Pluseaudio/pipewire:A2DP的组件
Bluetoothd: 蓝⽛守护进程
Bluez: 包括Bluez tool跟Bluez lib
kernel space
内核代码包含以下⼏部分
driver/bluetooth
net/bluetooth
include/net/bluetooth
在应用层,bluetoothd进程管理蓝牙,bluetooctl提供用户操作命令,通过dbus守护进程进行IPC通信,使用基于dbus的bluez开发主要就是调用bluez提供的dbus接口方法以及属性。
1、bluez5源代码组织架构
BlueZ5源代码中有很多目录和文件:
android/ - 用于替代android中bluedroid的android版本bluez源码。
attrib/ - 包含gatttool 源码以及与gatt attribute相关的代码,gatttool程序入口为gatttool.c。
btio/ - 通过的标准socket接口与BlueZ5 kernel模块通信?。
client/ - bluetoothctl源码,用于与 bluetoothd
交互,程序入口为main.c。
doc/ - BlueZ5 API文档。
emulator/ - 与bluetooth虚拟controller工具相关的代码。从字面意思可以推测出它是用来仿真的,通过阅读代码发现它是仿真controller的,通过btdev_create函数来创建一个虚拟的蓝牙controller设备。 kernel也是支持的,"/dev/vhci"这个设备被虚拟为一个虚拟的蓝牙设备。
gdbus/ - BlueZ5自带的内部gdbus源码。
gobex/ - Blue5自带的内部gobex库源码。
lib/ - libbluetooth.so 源码,提供BlueZ4 API,用来支持某些第三方应用。
monitor/ - btmon源码, 程序入口为main.c,用于监视和调试蓝牙流量。
obexd/ - obexd源码,程序入口为src/main.c。
peripheral/ - 与蓝牙ble的GATT相关的代码?。
plugins/ - BlueZ5插件源码(neard,autopair等插件)。包含 BlueZ 插件的源代码,这些插件扩展了 BlueZ 的功能,例如支持不同的蓝牙协议和配置文件。
profiles/ - BlueZ5蓝牙上层协议(a2dp,hid等)源码。每个子目录实现一个特定的蓝牙配置文件。
src/ - bluetoothd源码,程序入口为main.c,包含核心 BlueZ 守护进程 bluetoothd
的源代码。这里是主要的实现逻辑,包括设备管理、服务发现、配置和连接管理等。
src/shared/ - 包含在多个模块中共享的源代码。
src/adapter - 包含适配器管理相关的代码。
test/ - 测试蓝牙功能的py脚本,通过dbus接口和bluetoothd进行通信。 dbus提供支持python和c语言的接口。
tools/ - Bluez5测试工具集源码。包含各种命令行工具的源代码,例如 hcitool
、gatttool
、btmgmt
等。这些工具用于与蓝牙设备进行交互和调试。也算是使用实列代码,可以参照工具的功能参考源码。
unit/ - PTS测试相关的一些代码?。
README / INSTALL - 配置,编译,安装Bluez5的说明。
Makefile.obexd - 定义obexd编译规则,此文件被include于Makefile.am中。
Makefile.plugins - 定义BlueZ5的plugins(neard,autopair等)的编译规则, 此文件被include于Makefile.am中。
Makefile.tools - 定义BlueZ5测试工具集的编译规则,此文件被include于 Makefile.am中。
Makefile.am - 定义了Bluez5的编译规则。用于automake工具,生成 Makefile.in文件。
Makefile.in - 用于configure脚本,生成最终的Makefile文件。
configure.ac - 用于autoconf工具,生成configure脚本。
configure - 配置编译选项,生成最终的Makefile文件,以及config.h文件。
2、bluez5核心代码分析
bluez核心代码在src目录下,入口函数是main.c,bluez5编译后会生成bluetoothd可执行文件,加载配置文件bluetooth.conf,下面进入main.c函数开始分析(注:bluez源码很多地方是异步操作的,看源码时经常需要根据关键词到处搜索注册的回调函数在哪里被触发)
(1)src/main.c/main函数分析
int main(int argc, char *argv[])
{
……
//glib库函数创建一个死循环线程用于处理事件
event_loop = g_main_loop_new(NULL, FALSE);
//注册信号接收处理ctrl+c等中断信号
signal = setup_signalfd();
……
//gbus总线注册bluez服务端,该函数很重要,后面详细分析
if (connect_dbus() < 0) {
error("Unable to get on D-Bus");
exit(1);
}
……
//bluez控制器初始化,该函数很重要,后面详细分析
if (adapter_init() < 0) {
error("Adapter handling initialization failed");
exit(1);
}
//bluez设备及应用层协议注册
btd_device_init();
btd_agent_init();
btd_profile_init();
……
//开始死循环并处理事件
g_main_loop_run(event_loop);
……
}
(2)src/main.c/connect_dbus函数分析
static int connect_dbus(void)
{
……
//dbus是linux多进程通信的一种方式,bluez在dbus守护进程上注册了一个连接,用于接收其它bluez用户进程的消息,处理后并返回应答消息。具体的dbus实现原理需要同志们自己找资料理解,因为bluez源码依赖dbus编程。
//清除dbus错误标志
dbus_error_init(&err);