Ubuntu 环境下控制蓝牙适配器

目录

    • [Ubuntu 环境下控制蓝牙适配器的的方法](#Ubuntu 环境下控制蓝牙适配器的的方法)
    • [BlueZ 的DBUS 接口实现蓝牙适配器的操作方法](#BlueZ 的DBUS 接口实现蓝牙适配器的操作方法)
      • [使用DBUS 调用BlueZ 接口的概念](#使用DBUS 调用BlueZ 接口的概念)
      • [使用DBUS 调用BlueZ 接口的注意事项](#使用DBUS 调用BlueZ 接口的注意事项)
    • [BlueZ 相关接口的API文档](#BlueZ 相关接口的API文档)

主要简述使用 BlueZ 的DBUS 接口如何实现蓝牙适配器的连接

Ubuntu 环境下控制蓝牙适配器的的方法

  • 使用bluetoothctl 工具工具去控制蓝牙适配器
    该方案可以用调试链接蓝牙设备,使用代码去操控不方便。
  • 使用BlueZ 的底层HCI 接口去控制蓝牙适配器
    基于HCI 接口去控制蓝牙适配器,由于没有上层的HOST 协议栈的存在,将会导致一些上层的服务无法正常使用,如:A2DP、AVRCP 等
  • 使用BlueZ 的DBUS 接口控制蓝牙适配器
    使用DBUS 接口调用BlueZ 的上层接口,连接完成后自动配置上层服务,如A2DP、AVRCP等
  • 直接关闭蓝牙服务,然后使用Zephyr 或其他的蓝牙HOST协议栈控制蓝牙适配

BlueZ 的DBUS 接口实现蓝牙适配器的操作方法

使用DBUS 调用BlueZ 接口的概念

DBus(Desktop Bus)是 Linux 系统中用于​​进程间通信(IPC)​​的核心机制,可以通过DBus 实现与蓝牙服务进程进行交互。

通过DBUS 接口可以去调用BlueZ 的API 函数接口,DBUS 接口可以用于注册 蓝牙信号回调函数、调用蓝牙API、设置相关的属性。

如果使用DBUS 注册蓝牙信号 相关回调函数,则回调函数是通过 g_main_loop_run() 函数内部执行信号分发,注意g_main_loop_run() 函数阻塞后续的程序执行,建议单独建立一个线程去执行g_main_loop_run() 函数。

DBUS 调用BlueZ 的API 接口时,参数传递方式是从GVariant 容器中提取数据,来读写参数的。

使用 g_variant_get 函数可以用来从GVariant 对象读取参数。注意提供的 format_string必须与参数的结构相同。

c 复制代码
void g_variant_get (GVariant *value, const gchar *format_string, ...);

format_string字符串中的每个字符对应一个要提取的类型:

字符 C 类型 说明
b gboolean 布尔值
y guint8 无符号8位整数
n gint16 有符号16位整数
q guint16 无符号16位整数
i gint32 有符号32位整数
u guint32 无符号32位整数
x gint64 有符号64位整数
t guint64 无符号64位整数
d gdouble 双精度浮点数
s const gchar* 字符串 (必须以null结尾)
o const gchar* 对象路径字符串
g const gchar* 类型签名字符串
v GVariant* variant 容器
a 数组 后面需要跟数组元素类型
m maybe/nullable 类型 后面需要跟实际类型
( 开始元组
) 结束元组
{ 开始字典条目
} 结束字典条目

使用DBUS 调用BlueZ 接口的注意事项

  1. 当前操作系统运行时可能有其它的进程在使用Dbus 调用BlueZ 的蓝牙接口,这样当前程序在调用BlueZ 蓝牙接口时可能会产生冲突或一些异常
  2. 使用DBUS 调用BlueZ 的蓝牙扫描接口时会将扫描到的蓝牙设备信息缓存到一个列表中,而不是每次扫描到就上报。 缓存蓝牙设备信息的列表会定时刷新(可能3-5s 刷新一次或者关闭扫描重新启动扫描时刷新一次)。 需要注意这个列表中的设备可能已经退出配对模式了,所以要通过蓝牙连接已确定这个设备是否还是处于配对状态。

BlueZ 相关接口的API文档

BlueZ 支持的Dbus 交互接口(信号、方法、属性),支持哪些参数,可以通过D-feet 工具进行查看。

进一步的细节的文档暂时没有找到,等后续补充

相关推荐
RisunJan2 分钟前
Linux命令-php(PHP语言的命令行接口)
linux·php
A_humble_scholar3 分钟前
Linux(八) 进程内存全景:环境变量、main 函数参数与虚拟地址空间全链路深度解析
linux·运维·服务器
longforus8 分钟前
linux上播放音乐的终极解决方案
linux·音频·折腾
xcLeigh10 分钟前
鸿蒙PC平台 Shotwell 照片管理器适配实战:从 Linux GNOME 到 鸿蒙PC 的 Electron 迁移
linux·electron·harmonyos·鸿蒙·shotwell·照片管理器
Lang-121030 分钟前
CentOS Linux服务器完整迁移方案
linux·服务器·centos
TCW112133 分钟前
Linux操作系统系列.动态加载
linux·服务器
lisanmengmeng41 分钟前
gitlab 免密配置
linux·服务器·gitlab
与代码不die不休1 小时前
RTX5060显卡torch和torch_radon库安装避坑指南(仅linux系统)
linux·图像处理·python·深度学习
vortex51 小时前
深入探讨 Linux/Unix 传统设计哲学
linux·运维·unix
不吃土豆的马铃薯1 小时前
C++ 正则表达式入门详解
linux·服务器·网络·数据库·c++·正则表达式