linux 蓝牙编程 bluez

合集下载

bluetoothctl 指令

bluetoothctl 指令

bluetoothctl 指令Bluetoothctl是Linux系统中用于管理蓝牙设备和进行蓝牙实验的命令行工具。

它提供了一套交互式的命令行界面,允许用户扫描、配对、连接和操作蓝牙设备。

本文将详细介绍Bluetoothctl的各种指令及其使用方法。

在开始之前,确保您已经在Linux系统中安装了BlueZ软件包。

BlueZ是一个用于管理蓝牙设备的开源软件,包括一些用于操作蓝牙设备的工具和库。

首先,打开终端并输入`bluetoothctl`命令来启动Bluetoothctl。

启动后,您将看到一个蓝牙命令提示符`(bluetooth)`。

您可以在该提示符后输入不同的指令来与蓝牙设备进行交互。

以下是一些常用的Bluetoothctl指令:1. `show`该命令可用于显示蓝牙适配器的当前状态,包括适配器的MAC地址、名称、电源状态等。

2. `power on/off`这些命令用于打开或关闭蓝牙适配器的电源。

3. `devices`该命令将显示已知的蓝牙设备列表。

已知的设备是您之前配对过的设备。

4. `scan on/off`用于开启或关闭蓝牙扫描模式。

在扫描模式下,蓝牙适配器将搜索周围的蓝牙设备。

5. `pairable on/off`这些命令用于设置蓝牙适配器的可配对模式。

在可配对模式下,适配器可以与其他设备进行配对。

6. `pair [设备MAC地址]`此命令用于与特定蓝牙设备进行配对。

您需要提供设备的MAC地址。

7. `trust [设备MAC地址]`该命令用于信任某个蓝牙设备,信任后,该设备可以在未配对的情况下连接到系统。

8. `connect [设备MAC地址]`使用此命令可以连接到已知的蓝牙设备。

您需要提供设备的MAC地址。

9. `disconnect [设备MAC地址]`用于断开连接到特定设备。

10. `info [设备MAC地址]`此命令可用于获取关于蓝牙设备的详细信息,如设备名称、类型、服务、特征等。

Linux蓝牙协议栈OpenBT及其应用程序开发

Linux蓝牙协议栈OpenBT及其应用程序开发

2003.10 电子设计应用 www.eaw.com.cn引言Linux蓝牙协议栈主要有三个:OpenBT、BlueDrekar、BlueZ,其中OpenBT被认为在性价比上超过BlueDrekar和BlueZ,可运行于X86、ARM、MIPS、PowerPC等硬件平台,与任何2.x版本的Linux内核兼容,支持JAVA。

本文介绍了OpenBT的体系结构及其对互操作性的影响,并以客户机/服务器(C/S)实例说明如何在OpenBT上开发蓝牙应用程序。

OpenBT的体系结构使用不同蓝牙协议栈的设备在通信时往往会遇到互操作性问题。

开发者需要了解各种协议栈的体系结构并考虑其差异。

通过分析源码,本文给出了如图1所示的OpenBT的体系结构。

OpenBT包括HCI、L2CAP、SDP、SP、Networking、OpenBT Utility、后台程序、内核接口8个模块,分别解释如下:* HCI模块由Driver、Transport子模块构成。

Driver负责HCI命令、HCI事件和HCI数据接口;Transport提供USB、RS-232、UART的驱动。

* L2CAP模块由State Handle、Security子模块构成。

State Handle负责运行L2CAP的状态机和数据的分段组装;Security负责L2CAP级别安全管理。

* SP模块由RFCOMM、串口仿真子模块组成。

RFCOMM负责完成蓝牙RFCOMM协议中所描述的内容,核心是一个RFCOMM状态机;串口仿真负责提供接口。

* SDP模块负责完成蓝牙SDP协议中所描述的内容,在功能上分为XML文件管理、SDP查询处理和SDP响应处理三部分。

* Networking模块由PPP、Modem Emulation、TCS子模块构Linux蓝牙协议栈OpenBT及其应用程序开发■ 西安交通大学电信学院 马毅华 冯恩信摘 要:本文分析了OpenBT软件体系结构,根据客户机/服务器模型的实例,介绍了OpenBT应用程序的开发,并提出了一种实用的开发模式。

armlinux blue移植

armlinux blue移植

一内核修改------------------------------------------------------------将内核的蓝牙做成模块形式。

并配置如下,用make modules编译模块。

编译成功后,与bluetooth相关的模块有如下.drivers/bluetooth/btusb.konet/bluetooth/bluetooth.konet/bluetooth/hidp/hidp.konet/bluetooth/l2cap.konet/bluetooth/rfcomm/rfcomm.konet/bluetooth/sco.ko二.嵌入式蓝牙工具-------------------------------------------------------------------------------2.1 bluez-libs 移植tar xvzf bluez-utils-3.36.tar.gzcd bluez-utils-3.36./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux makemake installbluez-utils 需要依赖几种库dbus(它需要expat)2.1 expat 库移植tar xvzf expat-2.0.1.tar.gzcd expat-2.0.1./configure --host=arm-linux--prefix=$PWD/../../output/arm-linuxmakemake install2.2 dbus库移植用最新的dbus-1.4.0.tar.gz,在头文件上会产生多不同头文件,似乎与bluez-utils的工具配合很差,为了保险,使用dbus-1.2.16来移植tar xvzf dbus-1.2.16.tar.gzcd dbus-1.2.16./configure --host=arm-linux --prefix=$PWD/../../output/arm-linux - -with-x=no --with-xml CPPFLAGS="-I$PWD/../../output/arm-linux/include" LDFLAGS="-L$PWD/../../output/arm-linux/lib -lexpat" makemake install把 dbus-arch-deps.h拷贝到发布目录里cp ../../output/arm-linux/lib/dbus-1.0/include/dbus/* ../../output/ar m-linux/include/dbus-1.0/dbus2.3 glib库移植tar xvjf glib-2.22.0.tar.bz22.2 bluez-utils 移植tar xvzf bluez-utils-3.36.tar.gzcd bluez-utils-3.36./configure --host=arm-linux--prefix=$PWD/../../output/arm-linux DBUS_CFLAGS="-I$PWD/../../outpu t/arm-linux/include/dbus-1.0 -I$PWD/../../output/arm-linux/include/" DBUS_LIBS="-L$PWD/../../output/arm-linux/lib -ldbus-1"--disable-glib BLUEZ_CFLAGS="-I$PWD/../../output/arm-linux/include" BLUEZ_LIBS="-L$PWD/../../output/arm-linux/lib -lbluetooth"--enable-alsa=nomakemake install。

蓝牙bluez的编程CC++

蓝牙bluez的编程CC++

蓝⽛bluez的编程CC++蓝⽛ bluez 的编程 C C++简介bluez⽬录有⼀个libbluetooth.a⽂件有⼀个⽬录 lib⽬录⾥⾯存储这⽹络连接的部分代码基于库的代码编程.在linux下如果⾃带了蓝⽛,可以通过gcc **.c -lbluetooth 直接编出⼀个可执⾏⽂件.参考⽂献下⾯的连接提供了⼀个测试代码.另外,关于 ble 使⽤库的⽅式⼀直出现失败的情况,是因为,没有设置ble的相关参数,具体可以参考中的enable_advertising函数int device_id = hci_get_route(NULL);int device_handle = 0;if ((device_handle = hci_open_dev(device_id)) < 0) {perror("Could not open device");exit(1);}le_set_advertising_parameters_cp adv_params_cp = { 0 };adv_params_cp.min_interval = htobs(advertising_interval);adv_params_cp.max_interval = htobs(advertising_interval);adv_params_cp.chan_map = 7;uint8_t status;struct hci_request rq = { 0 };rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISING_PARAMETERS;rq.cparam = &adv_params_cp;rq.clen = LE_SET_ADVERTISING_PARAMETERS_CP_SIZE;rq.rparam = &status;rq.rlen = 1;int ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}le_set_advertise_enable_cp advertise_cp = { 0 };advertise_cp.enable = 0x01;memset(&rq, 0, sizeof(rq));rq.ogf = OGF_LE_CTL;rq.ocf = OCF_LE_SET_ADVERTISE_ENABLE;rq.cparam = &advertise_cp;rq.clen = LE_SET_ADVERTISE_ENABLE_CP_SIZE;rq.rparam = &status;rq.rlen = 1;ret = hci_send_req(device_handle, &rq, 1000);if (ret < 0) {hci_close_dev(device_handle);fprintf(stderr, "Can't send request %s (%d)\n", strerror(errno), errno);return (1);}。

Linux下Bluez的编程实现

Linux下Bluez的编程实现

(转自:/index.html)Linux下Bluez的编程实现1、蓝牙的各个协议栈的简介 (2)1.1、蓝牙技术 (2)1.1、蓝牙协议栈 (2)1.2、蓝牙技术的特点 (4)1.2.1、蓝牙协议栈体系结构 (4)1.2.2、蓝牙协议栈低层模块 (4)1.2.3、软件模块 (5)1.3、蓝牙的一些Profile (6)2、Bluez和D-Bus (7)2.1、Bluez和D-Bus体系结构 (7)2.2、D-Bus介绍 (9)2.3、Bluez的安全接口 (13)2.4、Bluez适配器接口 (15)2.5、Bluez配对 (16)2.6、Bluez绑定 (17)3、Bluez编程实现 (18)3.1、蓝牙开发关键技术剖析 (18)3.1.1、连接机制分析 (18)3.1.2、自动连接 (18)3.1.3、时钟设计 (19)3.1.4、配对列表管理 (20)3.1.5、蓝牙文件传输模式 (20)3.2、hci层介绍 (20)3.2.1、hci层介绍 (20)3.2.2、hci层编程 (21)3.3、L2CAP层编程 (25)3.3.1、L2CAP协议简介 (25)3.3.2、L2CAP编程方法 (26)3.4、SDP协议简介 (27)4、Openobex (28)4.1、Openobex简介 (28)4.2、Openobex与bluez编程实现 (29)5、Obexftp (32)5.1、obexftp简介 (32)5.2、基于Obexftp的应用程序开发 (32)6、参考资料 (32)1.1、蓝牙技术蓝牙(Bluetooth)技术是由Ericsson、IBM、Intel、Nokia和T oshiba公司于1998年5月共同提出开发的,并联合成立了蓝牙特殊利益小组(S IG),负责开发无线协议规范并设定交互操作的需求。

其本质是设备间的无线链接,意在于代替有线电缆。

1.1、蓝牙协议栈协议栈是指一组协议的集合,举个例子,把大象装到冰箱里,总共要3步。

Bluez的编译过程与方法

Bluez的编译过程与方法

编译前的目录位置说明
• • • • 1、指定安装位置 /home/hdl/autobuild/hdl/Bluetooth/lib 2、Linux-2.6.28内核之include /home/hdl/autobuild/hdl/test/kernel/Linux2.6.28/include
编译过程与方法
• 解决办法: • bluez-4.48\network\Makefile中去掉`-fvisibility=hidden'
编译过程遇到问题及解决办法
• • • • • • • • • • • • • • • 编译bluez-4.48 CC main.lo CC manager.lo CC server.lo CC bridge.lo CC connection.lo CC common.lo CCLD Making all in serial CC main.lo cc1: error: unrecognized option `-fvisibility=hidden' make[2]: *** [main.lo] Error 1 make[1]: *** [all-recursive] Error 1 make: *** [all] Error 2 [hdl@vsserver1 bluez-4.48]$
编译前说明及注意事项
• 1、四种方案均可,所选库根据编译器及库 之间的兼容性而定,库版本并不唯一 • 2、所选各库版本尽量偏低,避免带来意想 不到的错误,导致无法编译通过 • 3、dbus库可依赖expat或libxml,默认是 expat,建议用expat • 4、glib库版本过高,可能会用到zlib库 • 5、bluez-4.x以上版本,编译时需要用到 linux内核中的/include/linux/sockios.h

Linux下蓝牙测试软件包和命令介绍

Linux下蓝牙测试软件包和命令介绍

Linux下蓝牙测试软件包和命令介绍一、关于蓝牙耳机的配置1.关于蓝牙蓝牙是爱立信提出的一个近距离的无限通讯协议,由于没有INTEL的支持,它的发展一直都不是很快,在蓝牙不多的应用中,用得最多的就是无线HEADSET。

其他应用还有MOUSE,CAMERA。

蓝牙耳机主要有PROFILE。

一般用的都是Headset profile它是单声道的音频,质量只能用于作打电话。

新的Advance Audio Distribution Profile支持立体声,用来听音乐没有问题。

Bluetooth的Linux的STACK主要有两个:Affix和BlueZ。

二、蓝牙测试相关包与常用命令1.蓝牙相关概念与协议BT Hand-free:协议和二级装置服务,单声道A2DP:立体声音频传输服务,立体声AVRCP:音频/视频远程控制profileHCI:Host Controller Interfacehost与bt device的HCI主要有三种数据包交互:command packet,event packet,data packet。

L2CAP:Logical Link Control and Adaptation Protocol蓝牙的网络层协议,主要在linux中由驱动来实现。

RFCOMM:Radio Frenquency Communication protocol:在L2CAP提供的模拟串口接口。

OBEX:Object Exchange,会话层协议Service Discovery Protocol:SDP,提供服务协商协议。

蓝牙通讯过程:发现(Discover)->搜索(search)->配对(Pair)->联接(connect)。

蓝牙文件传送协议。

2.蓝牙测试相关软件包linux向蓝牙耳机播放声音的三个条件:需要linux有alsa音频驱动;snd_bt_sco驱动;btsco/bluez应用程序。

linux蓝牙连接的原理

linux蓝牙连接的原理

linux蓝牙连接的原理
Linux蓝牙连接的原理涉及到蓝牙协议栈、硬件和软件之间的
交互。

首先,蓝牙连接是通过蓝牙协议栈实现的,该协议栈包括物
理层、链路层、基带控制器、主机控制器接口(HCI)、逻辑链路控
制与适配层(L2CAP)、RFCOMM、SDP等组成。

物理层负责传输数据,链路层管理连接和数据包的传输,基带控制器控制无线电信号的调
制解调,HCI则负责主机和控制器之间的通信。

在Linux系统中,蓝牙连接的实现依赖于BlueZ蓝牙协议栈,
它提供了一组工具和库,用于管理蓝牙设备和连接。

当用户在
Linux系统中启用蓝牙功能时,BlueZ会与系统内置的蓝牙适配器进
行通信,通过HCI命令与蓝牙硬件进行交互,启动蓝牙适配器并监
听周围的蓝牙设备。

要建立蓝牙连接,首先需要进行设备的配对和绑定。

一旦设备
配对成功,就可以通过RFCOMM或L2CAP协议在设备之间建立通信通道。

RFCOMM提供了一种类似串口的数据传输方式,而L2CAP则提供
了基于数据包的通信服务。

一旦通道建立,设备之间就可以进行数
据传输。

在Linux系统中,可以使用工具如bluetoothctl和hcitool来管理蓝牙设备和连接。

通过这些工具,用户可以扫描周围的蓝牙设备、配对设备、建立连接、发送和接收数据等操作。

总的来说,Linux蓝牙连接的原理涉及到蓝牙协议栈、硬件和软件之间的协同工作,通过协议栈和相关工具,实现了蓝牙设备的管理和连接的建立,从而实现蓝牙通信功能。

linux bluetoothctl ble用法

linux bluetoothctl ble用法

linux bluetoothctl ble用法摘要:1.Linux 蓝牙概述2.蓝牙低功耗(BLE)技术简介3.Linux 中bluetoothctl ble 用法详解4.常见问题与解决方法5.总结正文:1.Linux 蓝牙概述Linux 系统下,蓝牙技术被广泛应用。

它提供了一种短距离无线通信的方式,使得设备之间可以方便地进行数据传输和通信。

在Linux 系统中,有多种蓝牙相关的命令和工具,如bluetoothctl、bluez 等,用户可以通过这些工具对蓝牙设备进行管理和操作。

2.蓝牙低功耗(BLE)技术简介蓝牙低功耗(BLE,Bluetooth Low Energy)技术是一种基于蓝牙技术的低功耗通信技术。

相较于传统蓝牙技术,BLE 具有更低的功耗、更远的通信距离以及更高的传输速率等特点。

BLE 技术在物联网、可穿戴设备等领域有着广泛的应用。

3.Linux 中bluetoothctl ble 用法详解在Linux 系统中,可以通过bluetoothctl 命令来管理和操作BLE 设备。

以下是一些常用的bluetoothctl ble 用法:(1)查看当前BLE 设备状态:```bluetoothctl ble status```(2)开启BLE 设备:```bluetoothctl ble enable```(3)关闭BLE 设备:```bluetoothctl ble disable```(4)查看当前连接的BLE 设备:```bluetoothctl ble devices```(5)连接指定的BLE 设备:```bluetoothctl ble connect <设备地址> ```(6)断开与指定BLE 设备的连接:```bluetoothctl ble disconnect <设备地址>```(7)发送数据到指定BLE 设备:```bluetoothctl ble send <设备地址> <数据>```4.常见问题与解决方法在使用bluetoothctl ble 命令过程中,可能会遇到一些问题。

BlueZ学习

BlueZ学习

BlueZ学习BLUEZ学习BlueZ是Linux官⽅蓝⽛协议栈。

它是⼀个基于GNU General Public License (GPL)发布的开源项⽬,从Linux2.4.6开始便成为Linux 内核的⼀部分。

BlueZ⽀持蓝⽛核⼼层和协议,它灵活、⾼效,以模块化⽅式实现,具有以下特点:完整的模块化实现均衡的多处理安全⽀持多线程数据处理⽀持多个蓝⽛设备硬件抽象向所有层提供标准socket接⼝提供设备和服务级安全保证BlueZ包含多个相互独⽴的模块:Linux内核蓝⽛⼦系统核⼼L2CAP 和 SCO ⾳频内核层RFCOMM, BNEP, CMTP 和 HIDP内核实现HCI UART, USB, PCMCIA 和虚拟设备驱动通⽤蓝⽛和SDP库和守候进程配置和测试⼩⼯具协议解码和分析⼯具BlueZ内核模块,程序开发库和⼩⼯具能在⽀持Linux的多种硬件架构系统上运⾏,既⽀持单核也⽀持多核处理器。

BlueZ主要⽀持以下系统平台:Intel and AMD x86AMD64 and EM64T (x86-64)SUN SPARC 32/64bitPowerPC 32/64bitIntel StrongARM and XScaleHitachi/Renesas SH processorsMotorola DragonBall现在市⾯上的很多Linux发⾏版都⽀持BlueZ,基本上任何⼀个Linux系统都兼容BlueZ,如:Debian GNU/LinuxUbuntu LinuxFedora Core / Red Hat LinuxOpenSuSE / SuSE LinuxMandrake LinuxBlueZ的源代码可以从/doc/9284b341b90d6c85ed3ac603.html /download/下载,其中Linux 2.4 and 2.6系列内核已经包含BlueZ内核模块源程序,因此要使⽤BlueZ只需下载最新稳定的Linux内核源码就⾏了。

bluetoothctl 指令

bluetoothctl 指令

bluetoothctl 指令你好!在这篇文章中,我们将详细介绍`bluetoothctl`指令。

`bluetoothctl`是一个用于控制蓝牙设备的命令行工具。

通过使用这个指令,我们可以管理和配置蓝牙设备、连接和配对其他设备、扫描周围的蓝牙设备等等。

它是Linux操作系统上非常常用的一个工具,因为Linux通常没有图形用户界面的蓝牙管理器。

无论您是普通用户还是开发人员,了解`bluetoothctl`指令将非常有益。

文章将分为以下几个章节:1. 安装和启动`bluetoothctl`2. 扫描周围的设备3. 配对和连接设备4. 管理已配对设备5. 操作属性和服务就让我们一起开始吧!1. 安装和启动`bluetoothctl`首先,我们需要确保在Linux系统上安装了`bluez`软件包。

您可以使用包管理器来安装该软件包,如`apt`、`yum`或`dnf`等等。

使用以下命令之一安装`bluez`:sudo apt install bluez 对于基于Debian的系统sudo yum install bluez 对于基于Red Hat的系统安装完成后,我们就可以使用`bluetoothctl`命令了。

打开终端窗口,输入以下命令启动`bluetoothctl`:bluetoothctl2. 扫描周围的设备在`bluetoothctl`控制台中,我们可以执行许多操作。

首先,让我们来扫描周围的蓝牙设备。

输入`scan on`来开始扫描:[bluetooth] scan on您将看到类似以下的输出:Discovery started[CHG] Controller XX:XX:XX:XX:XX:XX Discovering: yes[NEW] Device YY:YY:YY:YY:YY:YY Device_Name在输出中,`XX:XX:XX:XX:XX:XX`是您的蓝牙控制器的MAC地址,`YY:YY:YY:YY:YY:YY`是扫描到的设备的MAC地址和名称。

python蓝牙编程示例

python蓝牙编程示例

Python蓝牙编程示例1.引言蓝牙技术是一种无线通信技术,经常用于设备之间的数据传输和通信。

Python作为一种流行的编程语言,提供了多种库和模块来支持蓝牙编程。

本文将介绍如何使用Python进行蓝牙编程,并通过示例代码解释其使用方法和注意事项。

2.Python蓝牙编程环境配置在开始编写蓝牙程序之前,我们需要先配置Python蓝牙编程环境。

以下是一些常用的Python蓝牙库和模块,您可以选择其中之一来完成配置:2.1 BlueZ BlueZ是Linux上广受认可的蓝牙协议栈,可以在终端中使用命令行工具进行操作。

您可以使用pip命令安装pybluez库来实现对BlueZ的Python编程访问。

2.2 PyBluez PyBluez是一个用于Python的蓝牙开发库,它提供了在各种操作系统上访问蓝牙功能的接口。

您可以使用pip命令安装PyBluez库。

2.3 LightBlue LightBlue是一个基于Python的跨平台蓝牙库,它提供了易于使用的API,用于与蓝牙设备进行交互。

您可以使用pip命令安装LightBlue库。

3.连接到蓝牙设备一旦环境配置完成,我们可以开始编写程序以连接到蓝牙设备。

以下是一个简单的示例代码,演示如何连接到一个蓝牙设备并与其进行通信:import bluetoothbd_addr = "00:01:02:03:04:05" # 蓝牙设备的区域信息sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)sock.connect((bd_addr, 1)) # 打开蓝牙设备区域信息并连接print("连接成功")# 在此处添加与设备进行通信的代码sock.close() # 关闭与蓝牙设备的连接在上述示例代码中,我们首先指定了要连接的蓝牙设备的区域信息。

我们使用bluetooth.BluetoothSocket()函数创建了一个蓝牙套接字,并使用sock.connect()函数连接到指定的蓝牙设备。

linux bluetoothctl ble用法

linux bluetoothctl ble用法

linux bluetoothctl ble用法`bluetoothctl` 是Linux 系统下的一个命令行工具,用于与蓝牙设备进行交互。

在`bluetoothctl` 中,你可以执行一系列命令来管理蓝牙设备,包括BLE(低功耗蓝牙)设备。

以下是一些在`bluetoothctl` 中使用BLE 的基本用法:1. 启动Bluetooth 服务:在终端中运行以下命令启动`bluetoothctl`:```bashbluetoothctl```2. 开启蓝牙:在`bluetoothctl` 命令行中,使用`power on` 命令来开启蓝牙:```bashpower on```3. 启用扫描:使用`scan on` 命令来启用蓝牙扫描,以便发现附近的BLE 设备:```bashscan on```4. 停止扫描:当你发现目标设备后,使用`scan off` 命令停止扫描:```bashscan off```5. 列出已发现的设备:使用`devices` 命令列出已发现的蓝牙设备,找到你需要连接的BLE 设备的MAC 地址:```bashdevices```6. 连接BLE 设备:使用`connect` 命令并提供BLE 设备的MAC 地址来连接设备:```bashconnect <BLE_DEVICE_MAC_ADDRESS>```7. 断开BLE 设备连接:使用`disconnect` 命令断开与BLE 设备的连接:```bashdisconnect```8. 退出`bluetoothctl`:使用`quit` 命令退出`bluetoothctl`:```bashquit```这些是`bluetoothctl` 中使用BLE 的一些基本命令。

请注意,具体的操作可能会因蓝牙硬件和驱动程序的不同而有所差异。

在使用这些命令之前,请确保你的蓝牙硬件和驱动程序支持BLE,并查阅相关文档以获取更详细的信息。

linux下bluez的移植

linux下bluez的移植

linux下bluez的移植~bluez的移植可以用两个字概括:麻烦!原因是它不是单纯的bluez的编译,它还需要其他很多的库的支持,下面先列举一下这些库的麻烦依赖关系吧:bluez-libs-3.36(不需要其他库)bluez-utils-3.36:glib-2.16.5dbus-1.0.2:libxml2-2.7.4libsndfile-1.0.17libusb-0.1.12前面两个必须的,后两个看你的配置,bluez4也一样;下面开始编译:Bluez移植到arm s3c2410上搞了好几天的蓝牙协议栈(bluez)的移植,现在终于有点小成就了,写下来和大家分享。

以下介绍Bluez移植的基本步骤。

一,linux内核的配置Linux 2.6版本之后的内核一般都有蓝牙模块的配置,所以你不用再打补丁了。

由于我也是处于摸索阶段,所以我暂时用的是开发板上自带的内核。

#tar zxvf linux.2.6.*解压缩内核,进入内核目录。

在名令行输入# make disclean/make clean/make rmproper,选择这三个中的任意一个对内核进行清理,关于这三个命令的区别你可以google一下,然后自己去区分。

#make menuconfig/make config /make oldconfig /make xconfig输入如这三个命令中的任何一个,对内核进配置,这几条命令的区别,请你自己google。

推荐使用make menuconfig 。

进入内核配置界面之后,根据你的自己的需要进行选择。

关于内核的配置请单独查看内核配置方面的文档。

#make zImage ARCH=arm CROSS_COMPILE=arm-linux-到此内核镜像就已经做好了。

二,编译bluez协议栈。

移植过蓝牙协议栈的人,肯定会觉得,Bluez协议栈的编译是最麻烦的一件事情。

其实,如果你能理清楚bluez-utils所依赖的一些库,你就能很快的cross-compile交叉编译出一套能在开发板上跑起来的程序。

基于Bluez的应用程序的开发

基于Bluez的应用程序的开发

Linux下Bluez的编程实现1、蓝牙的各个协议栈的简介 (2)1.1、蓝牙技术 (2)1.1、蓝牙协议栈 (2)1.2、蓝牙技术的特点 (3)1.2.1、蓝牙协议栈体系结构 (3)1.2.2、蓝牙协议栈低层模块 (4)1.2.3、软件模块 (5)1.3、蓝牙的一些Profile (5)2、Bluez和D-Bus (7)2.1、Bluez和D-Bus体系结构 (7)2.2、D-Bus介绍 (8)2.3、Bluez的安全接口 (12)2.4、Bluez适配器接口 (15)2.5、Bluez配对 (16)2.6、Bluez绑定 (16)3、Bluez编程实现 (17)3.1、蓝牙开发关键技术剖析 (17)3.1.1、连接机制分析 (17)3.1.2、自动连接 (18)3.1.3、时钟设计 (18)3.1.4、配对列表管理 (19)3.1.5、蓝牙文件传输模式 (20)3.2、hci层介绍 (20)3.2.1、hci层介绍 (20)3.2.2、hci层编程 (20)3.3、L2CAP层编程 (25)3.3.1、L2CAP协议简介 (25)3.3.2、L2CAP编程方法 (25)3.4、SDP协议简介 (26)4、Openobex (28)4.1、Openobex简介 (28)4.2、Openobex与bluez编程实现 (29)5、Obexftp (31)5.1、obexftp简介 (31)5.2、基于Obexftp的应用程序开发 (31)6、参考资料 (32)1、蓝牙的各个协议栈的简介1.1、蓝牙技术蓝牙(Bluetooth)技术是由Ericsson、IBM、Intel、Nokia和Toshiba公司于1998年5月共同提出开发的,并联合成立了蓝牙特殊利益小组(SIG),负责开发无线协议规范并设定交互操作的需求。

其本质是设备间的无线链接,意在于代替有线电缆。

1.1、蓝牙协议栈协议栈是指一组协议的集合,举个例子,把大象装到冰箱里,总共要3步。

蓝牙驱动及Bluez使用流程分析

蓝牙驱动及Bluez使用流程分析

Tech蓝牙驱动分析 及Bluez使用流程分析GuideRevision HistoryDate <01/11/2010> Issue <0.5> First draft Description Author Wylhistory目录1. 2. 3. ABSTRACT .................................................................................................................................................. 4 INTRODUCTION ........................................................................................................................................ 4 蓝牙驱动介绍 ............................................................................................................................................... 4 3.1 串口驱动介绍 ........................................................................................................................................ 5 32 初始化.................................................................................................................................................... 5 . 3.2.1 模块上电 ........................................................................................................................................ 5 3.2.2 PSKEY的设置 ................................................................................................................................. 6 3.3 HCIATTACH的工作原理 .......................................................................................................................... 7 3.3.1 Hci_uar和bcsp层的加入 ................................................................................................................. 9 3.3.2 hci层的加入.................................................................................................................................. 10 3.3.3 hci_attach的内核处理 .................................................................................................................. 11 4. 数据在驱动的传递流程.............................................................................................................................. 13 4.1 4.2 4.3 4.4 4.5 5. UART层的数据接收.............................................................................................................................. 13 HCI_UART的数据接收 .......................................................................................................................... 14 BCSP层的处理 ...................................................................................................................................... 15 HCI层及以上的处理............................................................................................................................. 15 数据流程的总结 .................................................................................................................................. 17扫描过程的分析 ......................................................................................................................................... 18 5.1 用户使用例子 ...................................................................................................................................... 18 5.2 用HCITOOL扫描时的逻辑 ..................................................................................................................... 18 5.2.1 上层逻辑 ...................................................................................................................................... 18 5.2.2 内核层逻辑 .................................................................................................................................. 19 5.3 通过DBUS触发的逻辑 .......................................................................................................................... 21 5.3.1 上层逻辑之adapter dbus方法的建立 ........................................................................................... 21 5.3.2 上层扫描方法的调用 ................................................................................................................... 22 5.3.3 Dbus触发的扫描对应于内核层的处理 ........................................................................................ 25 5.3.4 上层的扫描数据收集 ................................................................................................................... 26 5.3.5 Hci_send_frame的讨论 ................................................................................................................. 286.A2DP的使用过程........................................................................................................................................ 28 6.1 如何使用.............................................................................................................................................. 28 6.2 服务的激活 .......................................................................................................................................... 29 6.3 设备的创建 .......................................................................................................................................... 30 6.3.1 ............................................................................................................................................................. 33 6.3.2 ............................................................................................................................................................. 33 6.3.3 ............................................................................................................................................................. 33 6.3.4 ............................................................................................................................................................. 33 6.4 设备的连接 .......................................................................................................................................... 33 ©Tech, 2010-1-11 Page 2 of 466.4.1 6.4.2 6.4.3 6.4.4 6.4.5 6.4.6 7.L2cap的连接................................................................................................................................. 34 AVDTP_DISCOVER的发送逻辑................................................................................................... 35 AVDTP_GET_CAPABILITIES命令的发送.................................................................................... 36 AVDTP_SET_CONFIGURATION的逻辑 ...................................................................................... 37 AVDTP_OPEN函数逻辑 ............................................................................................................... 38 AVDTP_START的逻辑 .................................................................................................................. 40HANDSFREE的使用过程 .......................................................................................................................... 42 7.1 7.2 7.3 7.4 使用流程.............................................................................................................................................. 42 HEADSET的连接.................................................................................................................................... 42 SCO的打开 ........................................................................................................................................... 45 数据的流动 .......................................................................................................................................... 468. 9.总结 ............................................................................................................................................................. 46 未讨论 ......................................................................................................................................................... 46©Tech, 2010-1-11Page 3 of 461. 2.Abstract介绍一下bluez的驱动架构以及上层的使用流程.Introduction主要分成几个部分: Bluez驱动整体框架, 数据在驱动的传递流程, A2dp的上层逻辑, Handsfree的上层逻辑 主要软硬件配置如下: 内核:2.6.21 硬件:pxa310 蓝牙芯片:CSR BC4 BlueZ:3.223.蓝牙驱动介绍从整体上来说,我们的蓝牙是一个模块,它需要和CPU通讯以交换信息,所以它需要一个接口,在 我们的平台上它用的UART口, 当然还有USB接口的, 我没做过, 所以不讨论; 另外一方面蓝牙还要和modem 这边传递数据,比如传递语音,这也要一个接口才行,因为我们的蓝牙芯片只提供了PCM接口,所以或者 是modem的输出就是数字接口,或者就需要把modem输出的数字接口经过一定的转化,比如引入一个中间 的codec把模拟接口转化成数字接口,再接到我们的蓝牙芯片,我们的板子就是后一种实现方案;而蓝牙 驱动要做哪些事呢?在我刚接手的时候,也是一头雾水,蓝牙驱动这说法,太抽象了,因为我们用的是蓝 牙模块,并非是独立的芯片,它所该有的功能都有了;从协议层的角度来说radio层,BB层,LC,LM层, HCI层都不需要我们去管, 都应该是已经被实现在蓝牙模块里面了,需要我们关注的本质就是cpu和蓝牙模 块之间的接口, 以及在这个接口上传递的数据格式, 也就是说数据包的格式, 数据包的处理, 而后者在linux 驱动层里面是已经有完整实现的,只需要在配置的时候选上: HCI UART driver BCSP protocol support 就可以了,不过有时候模块供应商会做一些修改,也可以用他们已经修改过的代码; 对于前者,也就是接口的问题,对我来说本质上就是串口的驱动,这个显然linux的代码里面早就已经实现 了的,也不需要我去操心,看看下面这个图就明白了:©Tech, 2010-1-11Page 4 of 46上面写明了internal ROM,也即是说是蓝牙模块内部的事情了,那我也就不管了; 经过这一番分析之后,剩下的事情就是初始化蓝牙模块了,那肯定少不了的上电,然后是模块重启, 还缺点什么呢? 蓝牙驱动和别的驱动一样,也要设一些寄存器,差别在于,它的寄存器被称为PSKEY,也就是说有 一步是PSKEY设置,这步是通过bccmd来完成的; 好像完了,但是还差一步,这步估计不好想到,仔细想想,假设现在蓝牙模块以及就绪了,数据从 蓝牙模块通过串口传递到了主板,但是这些数据是如何传递到蓝牙的协议层的呢?有点奇怪啊?这步是通 过hciattach来完成的; 总结一下,蓝牙驱动的三个步骤: 1, 串口驱动必须要先就绪,这是cpu和蓝牙模块之间的桥梁,没有这步,后面的都无法进行,包括 PSKEY的设置,数据的传递都是通过串口的,所以这步是根本; 2, 初始化,包括模块上电,PSKEY的设置; 3, 通过hciattach建立串口和蓝牙协议层之间的数据连接通道; 下面分别介绍! 3.1串口驱动介绍串口驱动本身很复杂,请参阅附录里面的文档“串口驱动分析”,这里可以简单介绍一下: 从上到下就是: TTY层 Uart层 Uart对应的Port层 对蓝牙来说, 数据先从串口驱动上来通过ldisc进入到蓝牙的hci_uart层, 然后交给更上面的协议层了; 这个过程后面会详细介绍;32 .初始化模块上电在我们的平台上是通过一个GPIO来控制的,在函数lin2008_poweron_wifibt_board里面会进 ©Tech, 2010-1-11 Page 5 of 463.2.1行上电的操作以及对应的reset动作,当然这步得需要看spec,通常是先高再低再高; 函数如下: static int wifibt_power_status; int lin2008_poweron_wifibt_board(void) { if (!wifibt_power_status) { pxa3xx_mfp_set_configs(lin2008_wifibt_pins, ARRAY_SIZE(lin2008_wifibt_pins)); pxa3xx_gpio_set_direction(MFP_WIFI_V18_ENABLE, GPIO_DIR_OUT); pxa3xx_gpio_set_direction(MFP_WLAN_RESETN, GPIO_DIR_OUT); pxa3xx_gpio_set_level(MFP_WIFI_V18_ENABLE, 1); pxa3xx_gpio_set_level(BT_RESET_GPIO, 1); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 1); mdelay(1); pxa3xx_gpio_set_level(BT_RESET_GPIO, 0); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 0); // bt need > 5 ms to reset mdelay(5); pxa3xx_gpio_set_level(BT_RESET_GPIO, 1); pxa3xx_gpio_set_level(MFP_WLAN_RESETN, 1); wifibt_power_status++; return 0; } wifibt_power_status++; return 1; } 因为用的是wifi和蓝牙合体的模块,所以里面也包含了对wifi的初始化; 3.2.2 PSKEY的设置 它的原理就是通过串口(前面已经建立起来的)发送命令给蓝牙模块,对于串口必须要知道的是要 能通讯,必须得设好波特率,另外一方面蓝牙模块的晶振频率也必须要设,否则它不知道该怎么跳 了;当然不同的芯片可能初始化的过程也不一样,也许还要下载firmware等等;在我们的平台上这步 是通过bccmd来完成的,比如下面这些设置: // PSKEY_ANA_FREQ &01fe = 9C40 // PSKEY_UART_BAUD_RATE &01be = 0EBF关于pskey的设置,请看附录“pskeys.html”,里面有更加全面的介绍; 下面来看看bccmd的工作过程: 我们调用的命令为: bccmd -t bcsp -d /dev/ttyS1 psload -r csr.psr 它的流程如下:©Tech, 2010-1-11Page 6 of 46从这个图可以看出,它的原理就是打开/dev/ttyS1然后根据用户传入的命令调用不同的处理函数,比 如对于psload就是读入配置文件并解析,再根据蓝牙芯片所识别的包类型(在这里是bcsp)拼凑发送 给底层的数据包,最后通过ubcsp_poll函数把数据发送出去; 经过这步的设置基本上蓝牙模块以及可以正常工作了; 但是还没有和上面的协议层建立纽带关系,也就是说从uart1收到的数据还没有传给hci层;3.3Hciattach的工作原理如何把uart1也就是蓝牙模块传上来的数据交给hci层,在驱动里面是通过一个叫做disc的机制完成 的,这个机制本意是用来做过滤或者限制收上来的字符的,但是在蓝牙驱动里面则直接把数据传给了蓝牙 协议层,再也不回到串口的控制了; 调用的命令为: hciattach -s 921600 /dev/ttyS1 bcsp 921600 下面看看这句话到底是什么意思? 先看上层的使用逻辑:©Tech, 2010-1-11Page 7 of 46最最关键的就是这两个ioctl了,那就是参数为TIOCSETD和HCIUARTSETPROTO的ioctl,下面需要看看内核 里面对于这两个ioctl的处理逻辑, 不过看这个逻辑之前需要先理一下驱动的逻辑架构, 否则你就会晕头转向, 请看下图:©Tech, 2010-1-11Page 8 of 46这是数据的流动过程,最底层的也就是和硬件打交道的是uart层了,它的存在和起作用是通过串口 驱动来保证的,这个请参阅附录,但是其它的层我们都不知道什么时候work的,下面来看看: 3.3.1 Hci_uar和bcsp层的加入 如图所示:©Tech, 2010-1-11Page 9 of 46Hci_uart层做的事情其实很简单。

Linux下基于Bluez

Linux下基于Bluez

Linux下基于Bluez硬件:Moto H670 蓝⽛⽿机(CSR chip)/ Broadcom v2.0 adapter软件:bluez-4.26 / bluez-gnome-1.8 / linux kernel 2.6.281)蓝⽛⽿机配对,打开你的蓝⽛⽿机,进⼊配对模式,我是⽤blue-wizard,就是blue-gnome这个东西来配对,实在是找不到其它⽅法。

以前bluez-3.x 在/var/lib/bluetooth/xx/pincodes⾥直接写pincode就可以了,现在好像不⾏了,⽽且在配对前,最好把那个pincodes删掉,⾄少要把跟你蓝⽛⽿机地址相关的那条pincode去掉。

2)运⾏ bluetoothd第⼀次使⽤,可以在后⾯加 -n -d 看调试信息3)在HOME⽬录下,建⽴ .asoundrc这个⽂件,如下:pcm.headset {type bluetoothdevice "00:1A:0E:1A:0E:90"profile "voice"}4)测试蓝⽛⽿机aplay -D headset demo.wav 或者在Skype ⾥选择headset就可以了NOTE:在配置中,我的蓝⽛⽿机,就是播放的时候,死在那⾥,怎么都不出声⾳,你可以在bluetoothd的调试信息⾥看到 " State changed/org/bluez/19016/hci0/dev_00_1A_0E_1A_0E_90: HEADSET_STATE_CONNECT_IN_PROGRESS ->HEADSET_STATE_CONNECTED" 也能从HEADSET_STATE_CONNECTED 到 HEADSET_STATE_PLAYING" 就是不出声⾳。

这时候,你要看看是不是你的蓝⽛适配器有问题,我的Broadcom就是如此。

bluez gatt api的用法

bluez gatt api的用法

bluez gatt api的用法Bluez GATT API是用于在Linux系统上进行Bluetooth Low Energy(BLE)通信的工具。

通过使用Bluez GATT API,开发人员可以轻松地创建和管理GATT (通用属性)配置文件、服务和特征,以及与BLE设备之间的数据交换。

Bluez GATT API的用法非常简单,下面将介绍一些基本的用法和示例:1. 获取GATT服务:使用`gatt_get_service`函数可以获取指定设备上的GATT 服务。

例如,以下代码片段可以获取BLE设备上的“Heart Rate”服务:```bashserviceUUID = "0000180d-0000-1000-8000-00805f9b34fb" # Heart Rate service UUIDdevice = pydbus.SystemBus().get(BLUEZ_SERVICE_NAME, device_path)service = device.GattService1.GetService(serviceUUID)```2. 读取特征值:使用`gatt_characteristic_read_value`函数可以读取GATT特征的当前值。

下面的示例演示了如何读取一个特征值:```bashcharacteristicUUID = "00002a37-0000-1000-8000-00805f9b34fb" # Heart Rate Measurement characteristic UUIDcharacteristic = service.GetCharacteristic(characteristicUUID)value = characteristic.ReadValue({})```3. 写入特征值:使用`gatt_characteristic_write_value`函数可以向GATT特征写入新的数值。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

linux蓝牙编程bluez 收藏从别的地方转了一篇蓝牙编程的,感觉比较详细,接下来自己慢慢验证一下。

实战Linux Bluetooth编程实战Linux Bluetooth编程(一)协议栈概述前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要Bluetooth设备和应用。

但在Linux 下如何对Bluetooth编程,一直没有一份很好的中文文档。

Sam结合自己的工作,一步一步将一些有用的东西记录下来,希望对其它Linux下Bluetooth编程的朋友有点帮助。

一:Bluetooth基本概念:Bluetooth是爱立信、诺基亚、东芝、IBM和Intel 5家公司在1998年联合推出的一项无线网络技术。

其宗旨是提供一种短距离、低成本的无线传输应用技术。

在行业协会筹备阶段,需要一个极具有表现力的名字来命名这项高新技术。

行业组织人员,在经过一夜关于欧洲历史和未来无限技术发展的讨论后,有些人认为用Blatand国王的名字命名再合适不过了。

Blatand国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将面世的技术,将标准不一的短距离无线传输技术统一起来。

Intel负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电话软件的开发,IBM 和东芝负责笔记本电脑接口规格的开发。

蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各种数字数据系统、甚至家用电器采用无线方式联接起来。

它的传输距离为10cm~10m,如果增加功率或是加上某些外设便可达到100m的传输距离。

它采用2.4GHz ISM频段和调频、跳频技术,使用权向纠错编码、ARQ、TDD和基带协议。

TDMA每时隙为0.625μs,基带符合速率为1Mb/s。

蓝牙支持64kb/s实时语音传输和数据传输,语音编码为CVSD,发射功率分别为1mW、2.5mW和100mW,并使用全球统一的48比特的设备识别码。

由于蓝牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。

蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。

底层硬件部分包括无线跳频(RF)、基带(BB)和链路管理(LM)。

无线跳频层通过2.4GHz无需授权的ISM频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。

基带负责跳频以及蓝牙数据和信息帧的传输。

链路管理负责连接、建立和拆除链路并进行安全控制。

关于bluetooth协议栈,接下来再谈。

当前已经实现的Bluetooth栈有以下各种:1. Widcomm: 第一个windows上的协议栈,由Widcomm公司开发,也就是现在的Broadcom.2. Microsoft Windows stack: Windows XP SP2中包括了这个内建的协议栈,开发者也可以调用其API开发第三方软件。

3. Toshiba stack: 它也是基于Windows的,不支持第三方开发,但它把协议栈授权给一些laptop商(sony,asus等,我的本本上就是Toshiba的)。

它支持的Profile有:SPP, DUN, FAX, LAP, OPP, FTP, HID, HCRP, PAN, BIP, HSP, HFP , A2DP, AVRCP, GAVDP)4. BlueSoleil: 著名的IVT公司的产品.该产品可以用于桌面和嵌入式,他也支持第三方开发,DUN, FAX,HFP, HSP, LAP, OBEX, OPP, PAN SPP, AV, BIP, FTP, GAP, HID, SDAP, and SYNC。

5. Bluez: Linux官方协议栈,该协议栈的上层用Socket封装,便于开发者使用,通过DBUS 与其它应用程序通信。

6. Affix: NOKIA公司的协议栈,在Symbian系统上运行.7. BlueDragon:东软公司产品,好像2002年6月就通过了蓝牙的认证,支持的Profile:SDP、Serial-DevB、AVCTP、AVRCP-Controller、AVRCP-Target、Headset-AG、Headset-HS、OPP-Client、OPP-Server、CT-GW、CT-Term、Intercom、FT-Server、FT-Client、GAP、SDAP、Serial-DevA、AVDTP、GAVDP、A2DP-Source、A2DP-Sink.8. BlueMagic:美国Open Interface 公司for portable embedded divce的协议栈,iphone(apple),nav-u(sony)等很多电子产品都用该商业的协议栈,BlueMagic 3.0是第一个通过bluetooth 协议栈1.1认证的协议栈,那么我现在就在用它,那么该栈用起来简单,API清晰明了。

实现了的profile有:HCI,L2CAP,RFCOMM,A/V,Remote,Control,A/V,Streaming,BIP,BPP,DUN,FAX,FTP,GAP,Hands-Free,and,Headset,HCRP,HID,OBEX,OPP,PAN,BNEP,PBAP,SAP,SPP,Synchronization,SyncML,Telephon y,XML.9. BCHS-Bluecore Host Software: 蓝牙芯片CSR的协议栈,同时他也提供了一些上层应用的Profile的库,当然了它也是为嵌入式产品了,支持的Profile有:A2DP,AVRCP,PBAP,BIP,BPP,CTP,DUN,FAX,FM API,FTPGAP,GAVDP,GOEP,HCRP,Headset,HF1.5,HID,ICP,JSR82,LAP Message AccessProfile,OPP,PAN,SAP,SDAP,SPP,SYNC,SYNC ML。

10. Windows CE:微软给Windows CE开发的协议栈,但是windows ce本身也支持其它的协议栈11. BlueLet:IVT公司for embedded product的清量级协议栈。

实战Linux Bluetooth编程(二)BlueZ简介Linux下Bluetooth协议栈的实现. Linux下开放的蓝牙协议栈主要包括IBM公司的BlueDrekar,Nokia公司的Affix, Axis公司的OpenBT和官方协议栈BlueZ。

我们主要面对Bluez来探讨。

BlueZ基础代码均是由Maxim Krasnyansky完成的。

包括:HCI,L2CAP,RFCOMM和基本socket 的实现。

他就职于Qualcomm(高通)。

Marcel Holtmann开发层的协议和应用,包括:BNEP, CMTP等。

当然,这些中也有MaximKrasnyansky的参预。

有部分代码由Nokia提供的。

Bluez是如何实现Bluetooth协议栈的呢?它分2部分实现:1.Kernel层实现:正如上一篇所谈到的,bluetooth协议栈有多层结构,最底层的硬件协议在硬件中就已经实现了。

(例如broadcom的芯片中,底层硬件协议已经包含于芯片之中了)。

软件级别的协议实现,从HCI 这一层起就可以了。

BlueZ对各层协议的实现是依托于Socket的。

BlueZ首先创建了一个新的Socket中的协议--PF_BLUETOOTH (AF_BLUETOOTH=31). (也就是说,Socket()的第一个参数:domain必须是:PF_BLUETOOTH )。

这也意味着,地址类型需要使用Bluetooth所定义的。

其实很简单,就是在net_families(网络协议列表)中添加了PF_BLUETOOTH这一项。

如果对Linux Kernel有了解的话,就知道这个注册动作一定在Bluetooth init部分作的。

同样,各个协议层(如:HCI,L2CAP,HID等)都将自己的行为规范添加到PF_BLUETOOTH协议中。

2.应用程序层实现:虽然Kernel层已经将Bluetooth协议栈完全实现了,但如果要使用起来,还是非常不方便的。

毕竟应用程序与kernel最方便的交流通道就是ioctl().这非常不直观。

于是,BlueZ又提供了一套API,这个API帮助开发者方便的与Kernel层协议打交道。

当然,这些API底层的实现其就是是ioctl.BlueZ的实现,基本就是这样了。

下面咱们具体研究如何使用BlueZ所提供的这套API。

实战Linux Bluetooth编程(三)HCI层编程1. HCI层协议概述:HCI提供一套统一的方法来访问Bluetooth底层。

如图所示:从图上可以看出,Host Controller Interface(HCI) 就是用来沟通Host和Module。

Host通常就是PC,Module则是以各种物理连接形式(USB,serial,pc-card等)连接到PC上的bluetooth Dongle。

在Host这一端:application,SDP,L2cap等协议都是软件形式提出的(Bluez中是以kernel层程序)。

在Module这一端:Link Manager, BB, 等协议都是硬件中firmware提供的。

而HCI则比较特殊,它一部分在软件中实现,用来给上层协议和程序提供访问接口(Bluez 中,hci.chci_usb.c,hci_sock.c等).另一部分也是在Firmware中实现,用来将软件部分的指令等用底层协议明白的方式传递给底层。

居于PC的上层程序与协议和居于Modules的下层协议之间通过HCI沟通,有4种不同形式的传输:Commands,Event, ACL Data, SCO/eSCO Data。

1.1. HCI Command:HCI Command是Host向Modules发送命令的一种方式。

HCI Command Packet结构如下:OpCode用来唯一标识HCI Command.它由2部分组成,10bit的Opcode Command. 6bit的Opcode Group。

1.1.1: OpCode Group:Linux Kernel(BlueZ)中,~/include/net/bluetooth/hci.h中定义了OpCode Group。

#define OGF_LINK_CTL 0x01#define OGF_LINK_POLICY 0x02#define OGF_HOST_CTL 0x03#define OGF_INFO_PARAM 0x04#define OGF_STATUS_PARAM 0x05它们代表了不同的Command Group:OGF_LINK_CTL: Link control,这个Command Group中的Command允许Host控制与其它bluetooth device 的连接。

相关文档
最新文档