当前位置: 首页 > news >正文

Ubuntu 环境下控制蓝牙适配器

目录

    • Ubuntu 环境下控制蓝牙适配器的的方法
    • BlueZ 的DBUS 接口实现蓝牙适配器的操作方法
      • 使用DBUS 调用BlueZ 接口的概念
      • 使用DBUS 调用BlueZ 接口的注意事项
    • 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必须与参数的结构相同。

void g_variant_get (GVariant *value, const gchar *format_string, ...);

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

字符C 类型说明
bgboolean布尔值
yguint8无符号8位整数
ngint16有符号16位整数
qguint16无符号16位整数
igint32有符号32位整数
uguint32无符号32位整数
xgint64有符号64位整数
tguint64无符号64位整数
dgdouble双精度浮点数
sconst gchar*字符串 (必须以null结尾)
oconst gchar*对象路径字符串
gconst gchar*类型签名字符串
vGVariant*variant 容器
a数组后面需要跟数组元素类型
mmaybe/nullable 类型后面需要跟实际类型
(开始元组
)结束元组
{开始字典条目
}结束字典条目

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

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

BlueZ 相关接口的API文档

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

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

http://www.xdnf.cn/news/103933.html

相关文章:

  • 【CSS】层叠,优先级与继承(三):超详细继承知识点
  • 如何在编译命令中添加灰度标识
  • 局部最小实验--用最小成本确保方向正确
  • Python实现孔填充与坐标转换
  • 基于STM32、HAL库的MCP42010T数字电位器驱动程序设计
  • 机器学习算法-朴素贝叶斯(附带拉普拉斯平滑处理)
  • 【JAVA】读取windows的串口信息
  • SqlSugar与Entity Framework (EF)的SWOT分析
  • Inxpect 新推高性价比版毫米波安全雷达:以经济实用护航工业安全
  • 游戏开发核心技术解析——从引擎架构到攻防体系的完整技能树
  • 阿里云 AI 搜索开放平台:RAG智能化工作流助力 AI 搜索
  • 【C语言】C语言中的字符函数和字符串函数全解析
  • Pingora vs. Nginx vs. 其他主流代理服务器性能对比
  • 2024从Maven-MySQL-Nginx部署
  • LeetCode热题100--283.移动零--简单
  • Linux中进程的属性:状态
  • 3.4 Agent的生命周期管理:任务分解、状态管理与反馈机制
  • leetcode-排序
  • 迅为RK3562开发板ARM四核A53核心板多种系统适配全开源
  • C++学习-入门到精通-【0】计算机和C++简介
  • C++学习:六个月从基础到就业——C++学习之旅:STL迭代器系统
  • 网站架构演进之路:从单体到垂直,再到缓存优化
  • Python爬虫(2)Python爬虫入门:从HTTP协议解析到豆瓣电影数据抓取实战
  • day31 学习笔记
  • DB-Day11笔记-函数和存储过程面试题讲解
  • 操作系统 : Linux库制作与原理
  • PNG透明免抠设计素材大全26000+
  • DCAN,ECAN和MCAN的区别
  • Vue3 + TypeScript 实现二维码生成与展示
  • 开源AI客户端Cherry Studio本地化部署自建大模型服务在线平台