实战Linux_Bluetooth编程

上传人:jiups****uk12 文档编号:40001290 上传时间:2018-05-22 格式:DOC 页数:32 大小:171KB
返回 下载 相关 举报
实战Linux_Bluetooth编程_第1页
第1页 / 共32页
实战Linux_Bluetooth编程_第2页
第2页 / 共32页
实战Linux_Bluetooth编程_第3页
第3页 / 共32页
实战Linux_Bluetooth编程_第4页
第4页 / 共32页
实战Linux_Bluetooth编程_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《实战Linux_Bluetooth编程》由会员分享,可在线阅读,更多相关《实战Linux_Bluetooth编程(32页珍藏版)》请在金锄头文库上搜索。

1、协议栈概述协议栈概述 Sam 一年前在 Linux 下写了一个类似 Windows 下 BTW 的库-BTX。现在需要添加新功能 时发现很多知识点都忘记了。所以决定在这次学习中,把一些 bluez API 记录下来。这几天 又想,这样还不够,不如把 Linux 下的 Bluetooth 编程基础给记录下来吧。前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要 Bluetooth 设备和应用。但在 Linux 下如何对 Bluetooth 编程,一直没有一份很好的中文文档。Sam 结合自己的工作,一 步一步将一些有用的东西记录下来,希望对其它 Linux 下 Bluetooth 编程的朋友有点

2、帮助。一:Bluetooth 基本概念:Bluetooth 是爱立信、诺基亚、东芝、IBM 和 Intel 5 家公司在 1998 年联合推出的一项无线 网络技术。其宗旨是提供一种短距离、低成本的无线传输应用技术。在行业协会筹备阶段, 需要一个极具有表现力的名字来命名这项高新技术。行业组织人员,在经过一夜关于欧洲 历史和未来无限技术发展的讨论后,有些人认为用 Blatand 国王的名字命名再合适不过了。 Blatand 国王将现在的挪威,瑞典和丹麦统一起来;就如同这项即将面世的技术,将标准不 一的短距离无线传输技术统一起来。Intel 负责半导体芯片和传输软件的开发,爱立信负责无线射频和移动电

3、话软件的开发, IBM 和东芝负责笔记本电脑接口规格的开发。蓝牙是无线数据和语音传输的开放式标准,它将各种通信设备、计算机及其终端设备、各 种数字数据系统、甚至家用电器采用无线方式联接起来。它的传输距离为 10cm10m,如 果增加功率或是加上某些外设便可达到 100m 的传输距离。它采用 2.4GHz ISM 频段和调频、 跳频技术,使用权向纠错编码、ARQ、TDD 和基带协议。TDMA 每时隙为 0.625s,基带 符合速率为 1Mb/s。蓝牙支持 64kb/s 实时语音传输和数据传输,语音编码为 CVSD,发射 功率分别为 1mW、2.5mW 和 100mW,并使用全球统一的 48 比特

4、的设备识别码。由于蓝 牙采用无线接口来代替有线电缆连接,具有很强的移植性,并且适用于多种场合,加上该 技术功耗低、对人体危害小,而且应用简单、容易实现,所以易于推广。蓝牙技术的系统结构分为三大部分:底层硬件模块、中间协议层和高层应用。底层硬件部 分包括无线跳频(RF) 、基带(BB)和链路管理(LM) 。无线跳频层通过 2.4GHz 无需授 权的 ISM 频段的微波,实现数据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此 频带正常工作所需要满足的条件。基带负责跳频以及蓝牙数据和信息帧的传输。链路管理 负责连接、建立和拆除链路并进行安全控制。关于 bluetooth 协议栈,接下来再谈。当前

5、已经实现的 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,

6、 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、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

8、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,Han ds- Free,and,Headset,HCRP,HID,OBEX,OPP,PAN,BNEP,PBAP,SAP,SPP,Synchr

9、onization,SyncML, Telephony,XML. 9. BCHS-Bluecore Host Software: 蓝牙芯片 CSR 的协议栈,同时他也提供了一些上层应用 的 Profile 的库,当然了它也是为嵌入式产品了,支持的 Profile 有: A2DP,AVRCP,PBAP,BIP,BPP,CTP,DUN,FAX,FM API,FTP GAP,GAVDP,GOEP,HCRP,Headset,HF1.5,HID,ICP,JSR82,LAP Message Access Profile,OPP,PAN,SAP,SDAP,SPP,SYNC,SYNC ML。10. Windo

10、ws CE:微软给 Windows CE 开发的协议栈,但是 windows ce 本身也支持其它的 协议栈11. BlueLet:IVT 公司 for embedded product 的清量级协议栈。 BlueZ 简介简介 Linux 下 Bluetooth 协议栈的实现. Linux 下开放的蓝牙协议栈主要包括 IBM 公司的BlueDrekar,Nokia 公司的 Affix, Axis 公司的 OpenBT 和官方协议栈 BlueZ。我们主要面对 Bluez 来探讨。BlueZ 基础代码均是由 Maxim Krasnyansky 完成的。包括:HCI,L2CAP,RFCOMM 和基

11、本 socket 的实现。他就职于 Qualcomm(高通)。Marcel Holtmann 开发层的协议和应用,包 括:BNEP, CMTP 等。当然,这些中也有 Maxim Krasnyansky 的参预。有部分代码由 Nokia 提供的。Bluez 是如何实现 Bluetooth 协议栈的呢? 它分 2 部分实现:1.Kernel 层实现:正如上一篇所谈到的,bluetooth 协议栈有多层结构,最底层的硬件协议在硬件中就已经实 现了。 (例如 broadcom 的芯片中,底层硬件协议已经包含于芯片之中了) 。软件级别的协议 实现,从 HCI 这一层起就可以了。 BlueZ 对各层协议的

12、实现是依托于 Socket 的。BlueZ 首 先创建了一个新的 Socket 中的协议-PF_BLUETOOTH (AF_BLUETOOTH=31). (也就是 说,Socket()的第一个参数:domain 必须是:PF_BLUETOOTH ) 。这也意味着,地址 类型需要使用 Bluetooth 所定义的。其实很简单,就是在 net_families(网络协议列表)中添加了 PF_BLUETOOTH 这一项。如果 对 Linux Kernel 有了解的话,就知道这个注册动作一定在 Bluetooth init 部分作的。同样,各个协议层(如:HCI,L2CAP,HID 等)都将自己的行为

13、规范添加到 PF_BLUETOOTH 协议中。2.应用程序层实现:虽然 Kernel 层已经将 Bluetooth 协议栈完全实现了,但如果要使用起来,还是非常不方便 的。毕竟应用程序与 kernel 最方便的交流通道就是 ioctl().这非常不直观。于是,BlueZ 又 提供了一套 API,这个 API 帮助开发者方便的与 Kernel 层协议打交道。当然,这些 API 底 层的实现其就是是 ioctl.BlueZ 的时间,基本就是这样了。下面咱们具体研究如何使用 BlueZ 所提供的这套 API。 HCI 层编程层编程 1. HCI 层协议概述:HCI 提供一套统一的方法来访问 Blue

14、tooth 底层。如图所示:从图上可以看出,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 则比较特殊,它一部分在软件中实现,

15、用来给上层协议和程序提供访问接口 (Bluez 中,hci.c hci_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

16、 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 的连接。OGF_LINK_POLICY :Link Policy。这个 Command Group 中的 Command 允许调整 Link Manager control.OGF

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号