基于BlueZ的C语言蓝牙编程

树莓派蓝牙ble gattlib c语言,树莓派的蓝牙通讯(bluez、gattlib) 目录一.准备工作二.利用蓝牙工具进行调试三.编译使用gattlib一.准备工作我使用的蓝牙模块是大夏龙雀的DX-BT16,支持BLE4.2协议。树莓派的型号为4b,操作系统为64位的ubuntu-18.04。提前说明一下,因为我没有安装桌面,所以很多工具都需要自己手动安装。首先先创建一个root用户,方便以后的系列操作。下面的所有命令都是在root权限下进行的。sudo passwdsubluez... 阅读详情

 基于BlueZ的C语言蓝牙编程


原文出处:
[url=http://people.csail.mit.edu/albert/bluez-intro/c401.html][color=#0000ff]http://people.csail.mit.edu/albert/bluez-intro/c401.html[/color][/url]
第四章 基于BlueZ的C语言蓝牙编程
    有很多理由促使我们选用C替代其他高级语言来例如Python来开发蓝牙应用程序。Python环境可能并不适合于嵌入式系统。因为嵌入式系统对程序的大 小,运行速度,和占用的存储空间有严格的限制,这些都使得像Python之类的解释性语言无法在嵌入式系统上应用。程序员需要对本地的蓝牙适配器进行更好 的控制,或者需要建立一套动态链接库以便于其他应用程序的链接以取代单一的应用程序。就像上述描述的这些,BlueZ是一款强大的蓝牙通信协议栈,它扩展 的API使得用户方便操纵大量的蓝牙资源。但是BlueZ没有官方的描述文档,甚至非官方的文档也寥寥无几。初学者在BlueZ的官方邮件列表上请求相关 的文档,通常的得到的回复是被告知请通过仔细阅读源代码来了解API的功能。阅读BlueZ的源代码对于初学者来说是一项相当费时的
[url=javascript:;][u][b][color=#0000ff]工作[/color][/b][/u][/url]
,在短期内取得的进展是相当有限的,很可能成为很多蓝牙编程初学者的拦路虎。
    本章简要叙述了基于BlueZ的C语言蓝牙编程的方法。本章为C程序员进一步阐述了第二章中涉及的知识点。
4.1 选择一个通信的对象
    Example 4-1是一个查找周边蓝牙设备的简单应用程序。程序首先获取系统的蓝牙设备号,扫描周边的蓝牙设备,然后查找每一个被搜索到的蓝牙设备的名称。后边有对数据结构和函数的详细描述。
Example 4-1. simplescan.c
#include stdio.h>
#include stdlib.h>
#include unistd.h>
#include sys/socket.h>
#include bluetooth/bluetooth.h>
#include bluetooth/hci.h>
#include bluetooth/hci_lib.h>
int main(int argc, char **argv)
{
    inquiry_info *ii = NULL;
    int max_rsp, num_rsp;
    int dev_id, sock, len, flags;
    int i;
    char addr[19] = { 0 };
    char name[248] = { 0 };
    dev_id = hci_get_route(NULL);
    sock = hci_open_dev( dev_id );
    if (dev_id  0 || sock  0) {
        perror("opening socket");
        exit(1);
    }
    len = 8;
    max_rsp = 255;
    flags = IREQ_CACHE_FLUSH;
    ii = (inquiry_info*)malloc(max_rsp * sizeof(inquiry_info));
   
    num_rsp = hci_inquiry(dev_id, len, max_rsp, NULL, &ii, flags);
    if( num_rsp  0 ) perror("hci_inquiry");
    for (i = 0; i  num_rsp; i++) {
        ba2str(&(ii+i)->bdaddr, addr);
        memset(name, 0, sizeof(name));
        if (hci_read_remote_name(sock, &(ii+i)->bdaddr, sizeof(name),
            name, 0)  0)
        strcpy(name, "[unknown]");
        printf("%s %s/n", addr, name);
    }
    free( ii );
    close( sock );
    return 0;
}
4.1.1 编译
     编译需要使用gcc链接libbluetooth这个库。
gcc -o simplescan simplescan.c -lbluetooth
4.1.2. 解释
typedef struct {
uint8_t b[6];
} __attribute__((packed)) bdaddr_t;
蓝牙设备的地址采用结构体bdaddr_t来描述,BlueZ中队蓝牙地址的存储和操纵都使用bdaddr_t结构体,BlueZ提供两个函数来进行字符串到蓝牙地址的转换。
int str2ba( const char *str, bdaddr_t *ba );
int ba2str( const bdaddr_t *ba, char *str );
str2ba把形如XX:XX:XX:XX:XX:XX(XX标识48位蓝牙地址的16进制的一个字节)的字符串转化6字节的bdaddr_t结构, ba2str完成相反的功能。
本地蓝牙适配器被分配一个从0开始的识别号码。程序在分配系统资源时必须指定使用那一个蓝牙适配器,通常的话系统只有一个蓝牙适配器,把参数NULL传给hci_get_route可以获得第一个有效的蓝牙适配器识别号。
int hci_get_route( bdaddr_t *bdaddr );
int hci_open_dev( int dev_id );
[note]将适配器的设备号指定为0是不恰当的,因为它并不总代表第一个可用的蓝牙适配器。例如系统有两个蓝牙适配器,第一个被disable掉了,那么第一个有效的设备号就是2。
如果存在多个蓝牙适配器,选择"01:23:45:67:89:AB"作为蓝牙适配器的地址, 将指示这个地址的指针char *representation传给hci_devid函数,用这个函数替代hci_get_route。
很多蓝牙操作都需要打开一个套接口, hci_open_dev函数可以打开特定资源号的一个套接口,确切的说hci_open_dev打开的套接字建立了一条和本地蓝牙适配器控制器的连接, 而不是和远端蓝牙设备的连接。使用这个套接口发送命令到蓝牙控制器可以实现底层的蓝牙操作,这部分在4.5中有详细的讨论。
选择好本地蓝牙适配器并进行系统资源分配后,程序就可以开始扫描周边的蓝牙设备了,在这个例程中,hci_inquiry函数完成对蓝牙设备的搜寻,并将返回的设备信息数据记录在变量ii中。遇到错误时,它将返回-1并设置errno变量。
int hci_inquiry(int dev_id, int len, int max_rsp, const uint8_t *lap, inquiry_info **ii, long flags);
hci_inquiry 的参数需要使用设备资源号而非套接口,所以我们使用hci_get_route函数的返回值dev_id传递给它。查询时间最长持续1.28 * len秒。max_rsp个设别返回的信息都被存储在变量ii中,这个变量必须有足够的空间来存储max_rsp返回的结果。我们推荐max_rsp取值 255来完成标准10.24秒的查询工作。
如果标志位flag设置为IREQ_CACHE_FLUSH,那么在进行查询操作时会把先前一次查询记录的cache刷新,否则flag设置为0的话,即便先前查询的设备已经不处于有效范围内,先前查询的记录也将被返回。
inquiry_info结构体定义如下
typedef struct {
    bdaddr_t bdaddr;
    uint8_t pscan_rep_mode;
    uint8_t pscan_period_mode;
    uint8_t pscan_mode;
    uint8_t dev_class[3];
    uint16_t clock_offset;
} __attribute__ ((packed)) inquiry_info;
在大多数场合,我们仅用到成员bdaddr,它标识了设备的蓝牙地址。有些场合我们也会用到成员dev_class, 它标识了被检测到的蓝牙设备的一些信息(例如,识别这个设备是打印设备,电话,个人电脑等),详细地对应关系可以参见蓝牙设备分配号[3]。其余的成员在 用于底层通信,一般情况并不常用。感兴趣的读者可以阅读蓝牙内核规范[4]获取更多的信息。一旦周围的蓝牙设备和其蓝牙地址被检测到,程序可以将此设备的 名称提供给用户,hci_read_remote_name函数可以完成这个功能。
int hci_read_remote_name(int sock, const bdaddr_t *ba, int len,
                        char *name, int timeout)
hci_read_remote_name函数在规定的超时时间内使用套接口通过蓝牙地址ba去获取蓝牙设备的名称,成功返回0,并将获取的蓝牙设备名称存入name中;失败时返回-1并设置相应的errno。
Notes
[1]
[url=http://www.bluez.org/lists.html][color=#0000ff]http://www.bluez.org/lists.html[/color][/url]

[2] for the curious, it makes a call to socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI), followed by a call to bind with the specified resource number.

[3]
[url=https://www.bluetooth.org/foundry/assignnumb/document/baseband][color=#0000ff]https://www.bluetooth.org/foundry/assignnumb/document/baseband[/color][/url]

[4]
[url=http://www.bluetooth.org/spec][color=#0000ff]http://www.bluetooth.org/spec[/color][/url]
Bluetooth LE 介绍以及树莓派 (RPi) 如何连接低功耗蓝牙 BLE——分别用命令和C语言实现 蓝牙(Bluetooth)是一种短距离的无线通讯技术,运行在2.4GHz免费频段,可实现固定设备、移动设备之间的数据交换。一般蓝牙3.0之前的 BR/EDR 蓝牙称为经典蓝牙,而将蓝牙4.0规范下的 LE 蓝牙称为低功耗蓝牙(BLE, Bluetooth Low Energy)。BLE 主要用于医疗保健、运动健身、信标、安防、家庭娱乐等邻域的新兴应用。相较经典蓝牙,低功耗蓝牙旨在保持同等通信范围的同时显著降低低功耗和成本。 阅读详情

相关推荐

CC2640R2F BLE5.0 蓝牙协议栈GATTServApp模块

GATTServApp模块 GATT服务器应用程序(GATTServApp)存储和管理应用程序范围的属性表。各种配置文件使用此模块将其特性添加到属性表。蓝牙低功耗协议栈使用此模块来响应GATT客户端的发现请求。例如,GATT客户端可以发送Discover all Primary Characteristics消息。GATT服务器端的蓝牙低功耗协议栈接收到该消息,并使用GATTServApp查

leconiot的博客 4199

【蓝牙通信在C语言中如何实现】

在C语言中,可以使用蓝牙通信的库函数来实现蓝牙通信功能。常用的蓝牙通信库函数包括BlueZ和BlueDevil等。

六月悉茗的博客 5121

【全志T113-S3_100ask】12-3 Linux蓝牙通信实战(基于BlueZ的C语言BLE蓝牙编程)

在网上找了若干篇关于BLE的C语言编程,都不尽人意,可能是分析一下函数、结构体,可能是研究一下启动的流程,可能是用命令行去操作,可能是说一下dbus啥啥啥的。其中,gap_device_data_read 和 gap_user_write_service是我们服务的具体内容(即我们需要去实现它),当用户调用这个服务的时候,我们需要做一些什么。这个功能我研究了很久,他的应用场景很大,设置装置联网就是其一,另一个,在穿戴设备的场景也应用广泛等等,我测试了一下,稳定性很不错,实时性也很强,有待进一步深入研究。

第四维度的博客 4062

蓝牙程序编写例子

#include #include #include #include #include #include #include  int main(int argc, char **argv) {     inquiry_info *ii = NULL;     int max_rsp, num_rsp;     int dev_id, sock, len, flags;     in

gaoxuefeng的专栏 1594

bluez dbus工具bluetoothctl使用/源码介绍

bluetoothctl 是一个命令行工具,用于管理和配置蓝牙设备。它是 BlueZ 蓝牙协议栈的一部分,提供了一个交互式命令行界面,允许用户扫描、配对、连接和管理蓝牙设备。bluetoothctl 是 Linux 系统中常用的蓝牙管理工具,特别适合在没有图形用户界面的环境下使用。

朝气蓬勃 1070

coBlue:使用Linux的bluez蓝牙协议栈进行BLE远程控制和文件传输

coBlue项目是一个旨在提升物联网设备之间通信效率的开源项目,重点在于打造一个轻量级、稳定的蓝牙低功耗(BLE)通信平台。自2019年起,该项目在GitHub上开源,迅速获得了业内开发者的关注,并在全球范围内建立了一个活跃的开发和使用者社区。bluez是Linux系统上使用最广泛的蓝牙协议栈。它负责实现蓝牙协议,并提供了一整套用户空间工具和服务,使得用户可以方便地在Linux环境下进行蓝牙设备的管理、搜索、连接和数据交换。

weixin_42584758的博客 932

linux下bluetooth编程(八)SDP层编程

BlueZ提供的SDP API,常见的如下: <wbr></wbr> 1. sdp_session_t *sdp_create(int sk, uint32_t flags) 参数1:sk: socket 参数2:SDP flags. 取值如下: #define SDP_RETRY_IF_BUSY<wbr>0x01<br> #defin...

mmdev 412

蓝牙开发代码(c语言)

 蓝牙c开发 两个完整的c程序,基于BlueZ的C语言蓝牙编程详细过程和代码

linux c 蓝牙开发环境,基于BlueZ的C语言蓝牙编程

原文出处:第四章 基于BlueZ的C语言蓝牙编程有很多理由促使我们选用C替代其他高级语言来例如Python来开发蓝牙应用程序。Python环境可能并不适合于嵌入式系统。因为嵌入式系统对程序的大 小,运行速度,和占用的存储空间有严格的限制,这些都使得像Python之类的解释性语言无法在嵌入式系统上应用。程序员需要对本地的蓝牙适配器进行更好 的控制,或者需要建立一套动态链接库以便于其他应用程序的链接以...

weixin_35975197的博客 3032

linux下基于Bluez实现蓝牙SPP服务端demo

基于Bluez实现了蓝牙串口通信,用来与手机端,pc端传输数据。蓝牙模块服务多种多样,这个小demo实现了linux下建立蓝牙服务端的demo,并带了一个客户端测试。 使用时,可通过两台设备,分别作为服务端可客户端,连接时填入对方地址即可开启测试。服务端建立后,客户端可通过android或者Qt客户端建立SPP服务访问服务端,并互相传递数据。 客户端并不一定需要用C来实现,只需要根据相关api建立于服务端的连接即可

5分钟快速验证lvgl界面:VScode模拟器极简配置法(免环境变量版)

本文介绍了一种5分钟快速验证LVGL界面的极简配置方法,使用VSCode模拟器免环境变量配置,适合UI设计师和产品经理快速预览界面效果。通过预编译的SDL2库和配置好的VSCode工程模板,实现开箱即用的LVGL界面验证,大幅提升工作效率。

weixin_30790841的博客 314

基于BlueZ的C语言蓝牙编程 (hci_inquiry)

【转】基于BlueZ的C语言蓝牙编程 (hci_inquiry) 2015-03-14 17:06:52 分类:  原文地址:【转】基于BlueZ的C语言蓝牙编程 (hci_inquiry) 作者:gliethttp 基于BlueZ的C语言蓝牙编程     有很多理由促使我们选用C替代其他高级语言来例如Python来开发蓝牙应用程序。Python环境可能

caobai的专栏 5151

Akamai移动端Sensor数据采集与BMP风控机制深度解析

本文深度解析了Akamai在移动端风控中的核心机制,重点阐述了Sensor数据如何通过采集陀螺仪、加速度计等硬件信息,结合设备指纹生成连续且符合物理规律的行为轨迹。详细剖析了数据从采集、加密校验到通过BMP风控三重验证(校验位、时间差、数据逻辑)的完整流程,并提供了从模拟优化到自建风控模型的实用应对思路。

quiet的专栏 281

蓝牙开发利器:C语言与BlueZ库的完美结合

蓝牙开发利器:C语言与BlueZ库的完美结合 【下载地址】蓝牙开发代码C语言 本仓库提供了一个完整的蓝牙开发代码资源,使用C语言编写,基于BlueZ库。该资源包含两个完整的C程序,详细展示了如何进行蓝牙编程的整个过程。无论你是初学者还是有经验的开发者,这些代码都将帮助你更好地理解和掌握蓝牙编程的技巧 ...

gitblog_09758的博客 1334

光猫改桥接后,一根网线搞定IPTV和上网的保姆级教程(附VLAN配置避坑点)

本文详细介绍了光猫改桥接后如何通过单线复用技术实现IPTV和上网功能共存。从VLAN配置原理到具体操作步骤,包括光猫超级管理员权限获取、VLAN绑定设置及路由器IPTV功能配置,提供了全面的保姆级教程。特别针对常见问题如IPTV信号丢失、网速下降等给出了实用解决方案,帮助用户轻松避坑。

weixin_29927965的博客 1733

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分)

在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。

eternal__day的博客 1186

【亲测免费】 蓝牙开发代码(C语言)

蓝牙开发代码(C语言) 【下载地址】蓝牙开发代码C语言 本仓库提供了一个完整的蓝牙开发代码资源,使用C语言编写,基于BlueZ库。该资源包含两个完整的C程序,详细展示了如何进行蓝牙编程的整个过程。无论你是初学者还是有经验的开发者,这些代码都将帮助你更好地理解和掌握蓝牙编程的技巧 ...

gitblog_09710的博客 707

IBM x3650M4服务器更换主板后,导入原有硬盘阵列信息

x3650m4服务器主板坏了,更换好的主板,需要导入原来硬盘的里面的阵列信息 1、开机有提示信息,按C导入配置 2、按Y继续 3、点击start进入阵列卡配置 4、选择configurations 1,点击preview 5、预览硬盘的阵列信息,点击import导入 6、导入成功,可以查看到阵列信息 7、重启服务器,进入操作系统 如果重启找不到操作系统,重启按f12,手动选择从onboard sas controller启动,进入系统一次后面重启就会自动找到并引导系统了。 8、有时候导入阵列

zds00virtue的博客 2万+

bluez的一些网站

BlueZ 的wiki http://wiki.bluez.org/   An Introduction to Bluetooth Programming http://people.csail.mit.edu/albert/bluez-intro/   其中一章的翻译,基于BlueZ的C语言蓝牙编程 (hci_inquiry) http://hi.baidu.com/geni...

Linux Job 176

VS2017配置PCL1.9.1 for win10(超详细)

准备工作 VS2017 自行下载 PCL1.9.1 点击链接跳转Github下载,根据自己的环境选择 win64或win32,作者下载的是:PCL-1.9.1-AllInOne-msvc2017-win64.exepcl-1.9.1-pdb-msvc2017-win64.zip 安装PCL 双击点开PCL-1.9.1-AllInOne-msvc2017-win64.exe,选择Add PCL to the system PATH for all users, 更改安装路径,E:\Progra

malapoa的博客 1144

110、3A 端到端调试:从 ISP register dump 到主观画质的完整调试流程

文章摘要 本文分享了ISP 3A(AE/AWB/AF)端到端调试的实战经验,通过具体案例解析常见问题排查方法。从硬件链路确认、寄存器dump分析、算法闭环验证到主观画质调优,提出了一套系统化调试流程。重点包括:如何通过示波器和寄存器抓包定位时序问题,AWB调试中black level校正的关键作用,AF闭环控制中hall传感器反馈的重要性,以及算法与硬件联调的"三板斧"方法论。作者强调3A调试本质是系统工程,需结合物理层信号测量、数据通路验证和算法状态跟踪,避免陷入局部优化陷阱。

sundong_81的博客 57

蓝牙bluez5的开发方法及入门教程

1 摘要 这篇文章的主要目的是告诉大家应该如何使用bluez进行开发,由于bluez的文档实在太少了,入门门槛实在太高了,很多人无从下手,准备写一个专题记录一下自己学习bluez的过程,分享一下bluez的学习方法,让大家少走一些弯路。我用的平台是君正x2000,蓝牙库使用的是bluez5.54,bluez库是通过buildroot编译出来的。通过BLUEZ我主要开发了一个BLE的串口服务端demo。这个程序我已经上传到了 https://download.youkuaiyun.com/download/huoho

专注嵌入式领域 1万+

ZW3D 二次开发-制作插件

1.Windows 7 SP1 或 Windows 10 或 Windows 11(推荐 Windows 11)2.Visual studio 2017-2022 (或 C/C++的任何其他集成开发环境)(推荐 Visual studio 2022)3.ZW3D 2023 或以上版本(建议使用与 ZW3D 一致的 API 的版本)4.Qt5.9.7(for Windows)博主学习使用环境的是:Windows 11 Version 24H2 + Visual studio 2022 + Qt5.9.7(fo

fhqiwmc的博客 809
上一篇: 蓝牙1.1、1.2、2.0等各版介绍与对比
下一篇: 蓝牙基带数据传输机理分析
SingleCode
博客等级 码龄15年 11粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值