logo资料库

Linux Bluetooth编程原理和实践.doc

第1页 / 共58页
第2页 / 共58页
第3页 / 共58页
第4页 / 共58页
第5页 / 共58页
第6页 / 共58页
第7页 / 共58页
第8页 / 共58页
资料共58页,剩余部分请下载后查看
Linux电源管理
版本历史
目录
术语与缩写解释
1Bluetooth基本概念
1.1Bluetooth简介
1.2bluetooth协议栈
2BlueZ简介
2.1Linux下的bluetooth协议栈
2.2Kernel层实现
2.3应用程序层实现
3HCI编程
3.1HCI层协议概述
3.1.1HCI Command【Host2Modules】
3.1.1.1OpCode Group
3.1.1.2Opcode Command
3.1.2HCI Event【Modules2Host】
3.1.2.1Command complete Event命令完成事件
3.1.2.2Command States Event命令状态事件
3.1.2.3Command Subsequently Completend命令延后完成
3.1.3HCI ACL与SCO数据
3.1.3.1 l2cap通过HCI ACL传输数据
3.1.3.2 l2cap包传递流程
3.2HCI protocol的实现
3.3HCI层的编程
3.3.1基于Host sokect的ioctl编程
3.3.1.1socket的概念
3.3.1.2分配一个空间给 hci_dev_list_req(蓝牙设备列表)
3.3.1.3打开HOST对应的HCI socket
3.3.1.4获得所有dongle的Device ID
3.3.1.5根据Device ID获得蓝牙设备信息
3.3.1.6蓝牙设备的UP和Down
3.3.2基于本地蓝牙设备Sokcet的HCI编程接口API
3.3.2.1打开一个蓝牙设备对应的HCI Socket
3.3.2.2关闭一个蓝牙设备对应的HCI Socket
3.3.2.3发送request(Host2Modules)
3.3.2.4几个更基础的function
3.3.2.5得到指定Dongle BDAddr
3.3.2.6读写Dongle Name
3.3.2.7得到HCI Version
3.3.2.8得到已经UP的Dongle BDaddr
3.3.2.9得到Dongle Info
3.3.2.10从hciX中得到X
3.3.2.11得到BDADDR不等于参数bdaddr的Dongle Device ID
3.3.2.12将BDADDR转换为字符串
3.3.2.13将自串转换为BDADDR
3.3.3 基于远程蓝牙设备Sokcet的HCI编程接口API
3.3.3.1inquiry 远程Bluetooth Device:
3.3.3.2得到指定BDAddr的reomte device Name:
3.3.3.3读取连接的信号强度:
4L2CAP层的编程
4.1L2CAP协议简介
4.1.1 L2CAP
4.1.2通道(channel) 
4.1.3 协议栈中的位置
4.1.4 L2CAP可发送Command
4.2L2CAP编程方法
4.2.1创建L2CAP Socket
4.2.2绑定
4.2.3连接
4.2.4发送数据到Remote Device
4.2.5接收数据
4.3L2CAP层编程实例
4.3.1编程背景及实践注意事项
4.3.2例一:发送Signaling Packet
4.3.3例二:任意PSM的L2CAP连接间数据的传输
5SDP层编程
5.1SDP服务发现协议 
5.1.1SDP定义
5.1.2sdptool 工具
5.1.3服务的品质
5.1.4SDP server与SDP client
5.1.5Service Record(Service 条目)
5.1.6Service Attribute(Service 属性)
5.2
5.2.1sdp_create
5.2.2sdp_is_local
5.2.3sdp_connect_local
5.2.4sdp_connect_l2cap
5.2.5sdp_connect
5.2.6sdp_uuid16_create
5.2.7sdp_list_append
5.2.8sdp_service_search_attr_req
5.2.9sdp_close
6 bluetooth与socket
6.1理解Socket
6.2Socket的相关概念及其在Bluetooth中使用
6.2.1域(domain)
6.2.2 类型(type)
6.2.3 协议(protocol)
6.3Socket地址
6.3.1通用的地址结构
6.3.2AF_INET(IPV4族)的地址结构sockaddr_in
6.3.3PF_BLUETOOTH(Bluetooth协议族)的地址结构sockaddr_l2
6.4Bluetooth Socket的建立和地址绑定
6.5理解网络字序
7
7.1前言
7.2HCI简介
7.3Inquiry过程(调查)
7.3.1inquiry过程
7.3.1.1主机给蓝牙设备下达扫描命令三步骤
7.3.1.2蓝牙扫描结果反馈
7.3.1.3结束扫描
7.3.2inquiry过程分析
7.3.2.1HCI_LE_Set_Scan_Enable指令
7.3.2.2Write_Inquiry_Transmit_Power_Level指令
7.4HCI_Inquiry过程
7.4.1HCI_inquiry的三个过程
7.4.1.1step1主机发送HCI_Inquiry命令
7.4.1.2Step 2主机控制器开始查询过程
7.4.1.3Step 3a主设备结束查询过程
7.4.1.4Step 3b控制器返回完成事件给主设备
7.4.2HCI_inquiry过程分析
7.4.2.1HCI_Inquiry格式
7.4.2.2主机给控制器的HCI_Inquiry命令数据
7.4.2.3控制器给host的response
7.4.2.4HCI_Inquiry_Result_With_RSSI
7.4.2.5HCI_Inquiry_Cancel
7.4.2.6Inquiry_Cancel_Complete
7.5连接过程
7.5.1异步链接的创建过程
7.5.1.1Step 1主设备发送HCI_Create_Connection命令给控制器
7.5.1.2Step 2 LM特性信息交换(可选)
7.5.1.3Step 3发送LMP_host_connection_req请求
7.5.1.4Step 4a如果远程设备拒绝连接,连接过程结束
7.5.1.5Step 4b远程设备接收这个连接
7.5.1.6Step 4c远程设备接收连接,并请求为Master
7.5.1.7Step 5 发送LMP_set_AFH 和LMP_channel_classification_r
7.5.1.8Step 6:请求Link Key
7.5.1.9Step 7a:无link key所需的pairing过程
7.5.1.10Step 7b:有link key则直接授权
7.5.1.11Step 8:一旦完成配对和授权,就会开始加密
7.5.1.12Step 9:各自向host发送LMP_setup_complete事件
7.5.1.13断开链接
7.5.2同步链接的创建过程
7.5.3L2CAP层次建立的连接
7.6L2CAP通道的建立
7.6.1SDP获取信息前L2CAP层次连接通道建立过程
7.6.2Connection Request数据包格式
8Co
8.1准备工作
8.1.1设计文档svn路径
8.1.1.1设置名称和版本
Linux 电源管理 版本历史 版本 0.1 作者 何志福 审批者 发布日期 2017-4-10 修改内容 目录 云眼 Openstack 版本实践 ....................................................................................... 错误!未定义书签。 版本历史 ................................................................................................................................................1 目录 ....................................................................................................................................................... 1 术语与缩写解释 .....................................................................................................................................1 1 Contrail3.0 安装包说明 ....................................................................................... 错误!未定义书签。 2 Contrail3.0 无依赖部署实践 ................................................................................ 错误!未定义书签。 3 相关问题说明 ..................................................................................................... 错误!未定义书签。 4 云眼配置管理 ..................................................................................................... 错误!未定义书签。 4.1 设计文档 svn 路径 ........................................................................................... 错误!未定义书签。 4.1.1 Opencontrail 资料 ..........................................................................................错误!未定义书签。 4.1.1.1 Third_party ..................................................................................................错误!未定义书签。 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 1/1
术语与缩写解释 缩写、术语 ACPI SDP 解释 表示高级配置和电源管理接口(Advanced Configuration and Power Management Interface) Service Discovery Protocol 服务发现协议(SDP 或 Bluetooth SDP)提供一种能 力,让应用程序有方法发现哪种服务可用以及这种服务的特性。 Host Control Interface 主机控制接口 HCI 实战 Linux Bluetooth 编程 http://blog.csdn.net/wanggongzhen1983/article/details/5556736 蓝牙核心技术概述 1 蓝牙核心技术概述 2 linux 下 bluetooth 编程 http://blog.csdn.net/xubin341719/article/details/38145507 http://blog.csdn.net/xubin341719/article/details/38228705 http://blog.csdn.net/wangzhen209/article/details/50058869 https://wiki.archlinux.org/index.php/Bluetooth_(简体中 文)#.E5.AE.89.E8.A3.85 F:\人脸识别模组\oLock_F\filetran\bluez-5.37\client bluetoothctl 源码 1 Bluetooth 基本概念 前言:随着嵌入式系统的飞速发展,很多嵌入式平台上需要 Bluetooth 设备和应用。但在 Linux 下如 何对 Bluetooth 编程,一直没有一份很好的中文文档。本文结合实际工作,一步一步将一些有用的东西记 录下来,希望对其它 Linux 下 Bluetooth 编程的朋友有点帮助。 1.1 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 频段的微波,实现数 据位流的过滤和传输,本层协议主要定义了蓝牙收发器在此频带正常工作所需要满足的条件。基带负责跳 频以及蓝牙数据和信息帧的传输。链路管理负责连接、建立和拆除链路并进行安全控制。 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 1/57
1.2 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,Telephony,X ML. 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. Windows CE:微软给 Windows CE 开发的协议栈,但是 windows ce 本身也支持其它的协议栈 11. BlueLet:IVT 公司 for embedded product 的清量级协议栈。 2 BlueZ 简介 2.1 Linux 下的 bluetooth 协议栈 IBM 公司的 BlueDrekar; Linux 下 Bluetooth 协议栈的实现. Linux 下开放的蓝牙协议栈主要包括: 1 2 Nokia 公司的 Affix; 3 Axis 公司的 OpenBT; 4 官方协议栈 BlueZ。 我们主要面对 Bluez 来探讨。 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 2/57
BlueZ 基础代码均是由 Maxim Krasnyansky 完成的。包括:HCI,L2CAP,RFCOMM 和基本 socket 的实现。他就职于 Qualcomm(高通)。Marcel Holtmann 开发层的协议和应用,包括:BNEP, CMTP 等。 当然,这些中也有 Maxim Krasnyansky 的参预。有部分代码由 Nokia 提供的。 Bluez 是如何实现 Bluetooth 协议栈的呢? 它分 2 部分实现:Kernel 层实现和应用程序层实现 2.2 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.3 应用程序层实现 虽然 Kernel 层已经将 Bluetooth 协议栈完全实现了,但如果要使用起来,还是非常不方便的。毕竟应 用程序与 kernel 最方便的交流通道就是 ioctl().这非常不直观。于是,BlueZ 又提供了一套 API,这个 API 帮助开发者方便的与 Kernel 层协议打交道。当然,这些 API 底层的实现其就是是 ioctl. BlueZ 的时间,基本就是这样了。下面咱们具体研究如何使用 BlueZ 所提供的这套 API。 3 HCI 编程 3.1 HCI 层协议概述 HCI 提供一套统一的方法来访问 Bluetooth 底层。如图所示: 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 3/57
从图上可以看出,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.c hci_usb.c,hci_sock.c 等).另一部分也是在 Firmware 中实现,用来将软件部分的指令等用底层协议明白 的方式传递给底层。 居于 PC 的上层程序与协议和居于 Modules 的下层协议之间通过 HCI 沟通,有 4 种不同形式的传输: 1 Commands 2 Event 3 ACL Data 4 SCO/eSCO Data 3.1.1 HCI Command【Host2Modules】 HCI Command 是 Host 向 Modules 发送命令的一种方式。HCI Command Packet 结构如下: OpCode 用来唯一标识 HCI Command.它由 2 部分组成,10bit 的 Opcode Command. 6bit 的 Opcode Group。 3.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 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 4/57
#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_HOST_CTL: Control and Baseband. 3.1.1.2 Opcode Command 用来在同一个 Group 内唯一识别 Command。~/include/net/bluetooth/hci.h 中定义。 3.1.2 HCI Event【Modules2Host】 Modules 向 Host 发送一些信息,使用 HCI Event。Event Packet 结构如下: HCI Event 分 3 种: 1 Command complete Event:命令完成事件 2 Command States Event:命令状态事件 3 Command Subsequently Completend:命令延后完成 3.1.2.1 Command complete Event 命令完成事件 Command complete Event: 如果 Host 发送的 Command 可以立刻有结果,则会发送此类 Event。也 就是说,如果发送的 Command 只与本地 Modules 有关,不与 remote 设备打交道,则使用 Command complete Event。例如:HCI_Read_Buffer_Size. 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 5/57
3.1.2.2 Command States Event 命令状态事件 Command States Event:如果 Host 发送的 Command 不能立刻得知结果,则发送此类 Event。Host 发送的 Command 执行要与 Remote 设备打交道,则必然无法立刻得知结果,所以会发送 Command States Event.例如:HCI Connect。 3.1.2.3 Command Subsequently Completend 命令延后完成 Command Subsequently Completend:Command 延后完成 Event。例如:连接已建立。 下图是一个 Command-Event 例子: 从这里可以看出,如果 Host 发送的 Command 是与 Remote device 有关的,则会先发送 Command States Event 。等动作真正完成了,再发送 Command Subsequently Completend。 3.1.3 HCI ACL 与 SCO 数据 3.1.3.1 l2cap 通过 HCI ACL 传输数据 HCI ACL 与 SCO 数据,这里就不多讲了。只需要明白,l2cap 数据是通过 ACL 数据传输给 remote device 的。 3.1.3.2 l2cap 包传递流程 下图很明白的展示了 l2cap 数据如何一步一步转化为 USB 数据并传递给底层协议的。 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 6/57
很明显,一个 l2cap 包会按照规则先切割为多个 HCI 数据包。HCI 数据包再通过 HCI-usb 这一层传递 给 USB 设备。每个包又通过 USB driver 发送到底层。 3.2 HCI protocol 的实现 (省略) 3.3 HCI 层的编程 正如上一节所说,HCI 是沟通上层协议以及程序与底层硬件协议的通道。所以,通过 HCI 发送的 Command 都是上层协议或者应用程序发送给 Bluetooth Dongle 的。它命令 Bluetooth Dongle(或其中的硬 件协议)去做什么何种动作。 3.3.1 基于 Host sokect 的 ioctl 编程 如何获得 Host 上插入 Dongle 数目以及 Dongle 信息? 3.3.1.1 socket 的概念 我们先复习一下 socket 的概念: 使用函数 socket()建立一个 Socket,就如同你有一部电话.bind()则是把这个电话和某个电话号码(网络 地址)对应起来。 类似的,我们可以把 Host 理解为一个房间,这个房间有多部电话(Dongle)。 当使用 socket() 打开一个 HCI protocol 的 socket,表明得到这个房间的句柄。HOST 可能会有多个 Dongle。换句话说,这个房间可以有多个电话号码。所以 HCI 会提供一套指令去得到这些 Dongle。 3.3.1.2 分配一个空间给 hci_dev_list_req(蓝牙设备列表) // 0. 分配一个空间给 hci_dev_list_req。这里面将放所有 Dongle 信息。 汉柏科技有限公司 www.opzoon.com 客服热线:400-706-8366 7/57
分享到:
收藏