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