bluetooth_bluetoothctl 用法 - CSDN
bluetooth 订阅
蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。 [1]  蓝牙使今天的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网。 [1] 展开全文
蓝牙技术是一种无线数据和语音通信开放的全球规范,它是基于低成本的近距离无线连接,为固定和移动设备建立通信环境的一种特殊的近距离无线技术连接。 [1]  蓝牙使今天的一些便携移动设备和计算机设备能够不需要电缆就能连接到互联网,并且可以无线接入互联网。 [1]
信息
频    段
2.4—2.485GHz的ISM波段
创始人
爱立信公司
外文名
bluetooth
释    义
一种短距离无线通信技术
中文名
蓝牙
性    质
无线技术标准
蓝牙概述
蓝牙,是一种支持设备短距离通信(一般10m内)的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换。利用“蓝牙”技术,能够有效地简化移动通信终端设备之间的通信,也能够成功地简化设备与因特网Internet之间的通信,从而数据传输变得更加迅速高效,为无线通信拓宽道路。 [2]  蓝牙作为一种小范围无线连接技术,能在设备间实现方便快捷、灵活安全、低成本、低功耗的数据通信和语音通信,因此它是目前实现无线个域网通信的主流技术之一。与其他网络相连接可以带来更广泛的应用。是一种尖端的开放式无线通信,能够让各种数码设备无线沟通,是无线网络传输技术的一种,原本用来取代红外。 [3]  蓝牙技术是一种无线数据与语音通信的开放性全球规范,它以低成本的近距离无线连接为基础,为固定与移动设备通信环境建立一个特别连接。其实质内容是为固定设备或移动设备之间的通信环境建立通用的无线电空中接口(Radio Air Interface),将通信技术与计算机技术进一步结合起来,使各种3C设备在没有电线或电缆相互连接的情况下,能在近距离范围内实现相互通信或操作。简单的说,蓝牙技术是一种利用低功率无线电在各种3C设备间彼此传输数据的技术。蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.15协议。作为一种新兴的短距离无线通信技术,正有力地推动着低速率无线个人区域网络的发展。 [2] 
收起全文
精华内容
参与话题
  • 蓝牙协议栈(Bluetooth stack)简介

    万次阅读 2016-12-05 19:06:41
    1 前言 本文只要对蓝牙协议栈做一个简单介绍,包含hci层、acl链路、l2cap层,sdp服务及几个常见的profile,让初学蓝牙协议栈的人对整个蓝牙协议栈有一个整体框架的了解。 2 HCI层2.1 Hci命令及应答的控制由于不同的...

    1 前言

     本文只要对蓝牙协议栈做一个简单介绍,包含hci层、acl链路、
    

    l2cap层,sdp服务及几个常见的profile,让初学蓝牙协议栈的人
    对整个蓝牙协议栈有一个整体框架的了解。

    2 HCI层

    2.1 Hci命令及应答的控制

    由于不同的hci命令对结果有不同的处理,有的不需要结果,有些需要
    

    等待结果后才能执行下一步动作,有些在一定状态下才有效,对这
    样在hci层,都有一套机制,每发送一个命令,都会先检查当前是否
    可以发送该命令(有时hci controller当前不能接收命令时,也不能
    发送),若命令可以发送,检查该命令是否一定需要等待结果,并
    且等待结果的超时时间是多少,然后启动一个定时器监测该命令的
    返回结果,若超时还没有结果,就执行命令超时处理。

    2.2 hci分组

    《蓝牙协议及其源代码分析》 208页
    《bluetooth_Core_v4.2.pdf》779页
    《蓝牙协议及其源代码分析》该书可以购买或从网上下载,这里标
    志的是网上下载的版本,非完整版本,若对不上号,自己找对应位
    置。
    《bluetooth_Core_v4.2.pdf》下载地址:
    https://www.bluetooth.org/DocMan/handlers/DownloadDoc.ashx?doc_id=286439

    2.3 HCI CONFIGURATION PARAMETERS

    《bluetooth_Core_v4.2.pdf》787页

    2.4 链路控制指令

    《蓝牙协议及其源代码分析》 214页
    《bluetooth_Core_v4.2.pdf》813页

    2.5 链路策略命令

    《蓝牙协议及其源代码分析》 216页
    《bluetooth_Core_v4.2.pdf》926页

    2.6 主机控制器和基带命令

    《蓝牙协议及其源代码分析》 216页
    《bluetooth_Core_v4.2.pdf》951页

    2.7 信息参数命令

    《蓝牙协议及其源代码分析》 218页
    《bluetooth_Core_v4.2.pdf》1097页

    2.8 状态参数命令

    《蓝牙协议及其源代码分析》 218页
    《bluetooth_Core_v4.2.pdf》1110页

    2.9 测试命令

    《蓝牙协议及其源代码分析》 218页
    《bluetooth_Core_v4.2.pdf》1138页

    2.10 事件

    《蓝牙协议及其源代码分析》 219页
    《bluetooth_Core_v4.2.pdf》1152页

    2.11 BLE控制器命令

    《bluetooth_Core_v4.2.pdf》1271页

    3 ACL链路

    L2CAP的通信是基于ACL链路的,两个蓝牙设备之间只有一条ACL链
    

    路,由Connect Handle标识。在进行L2CAP的任何通信之前,都
    需要先建立ACL链路,两个蓝牙设备的配对,先建立一条ACL通
    码。ACL链路建立后,就会进行L2CAP的一些交互,获取信息,但
    需要基于SDP profile获取信息时,L2CAP就会建立一条SDP逻辑链
    路(由Channel ID标识),SDP的交互就在L2CAP建立的Channel
    上进行,SDP交互完成后,会断开SDP的逻辑链路,若后面没有其
    它再需要交互的,ACL链路也会断开,但由于已经配对过,上层会
    保存ACL配对的信息。

    4 L2CAP层

    4.1 l2cap层位置

    这里写图片描述

    4.2 L2CAP包

    《bluetooth_Core_v4.2.pdf》1737页
    这里写图片描述

    L2CAP包的类型有CID(Channel ID)确定:
    0x0000 Null identifier(不使用)
    0x0001 L2CAP Signaling channel(信令信道)
    0x0002 Connectionless channel(无连接信道,用于广播)
    0x0003 AMP Manager Protocol
    0x0004 Attribute Protocol(BLE)
    0x0005 Low Energy L2CAP Signaling channel(BLE信令信道)
    0x0006 Security Manager Protocol(BLE)
    0x0007 BR/EDR Security Manager
    0x0008-0x001F Reserved
    0x0020-0x003E Assigned Numbers
    0x003F AMP Test Manager
    0x0040-0xFFFF Dynamically allocated(建立连接后动态分配的信道,承载profile数据)

    4.3 CONNECTION-ORIENTED CHANNELS IN BASIC

    这里写图片描述
    L2CAP面向连接的基本帧封包

    4.4 CONNECTIONLESS DATA CHANNEL IN BASIC

    这里写图片描述
    L2CAP无连接的帧封包

    4.5 CONNECTION-ORIENTED CHANNEL IN RETRANSMISSION/FLOW CONTROL/STREAMING

    这里写图片描述
    L2CAP面向连接的重传、流控帧封包

    4.6 CONNECTION-ORIENTED CHANNELS IN LE CREDIT BASED FLOW CONTROL

    这里写图片描述
    L2CAP面向连接信道(BLE使用)

    4.7 L2CAP信令封包

    《bluetooth_Core_v4.2.pdf》1749页
    这里写图片描述
    L2CAP信令封包,其中infromation payload的内容格式如下:
    这里写图片描述
    Code值:
    这里写图片描述
    这里写图片描述

    4.8 L2CAP层的状态

    《bluetooth_Core_v4.2.pdf》1802页
    • CLOSED – channel not connected.
    • WAIT_CONNECT – a connection request has been received, but only a
    connection response with indication “pending” can be sent.
    • WAIT_CONNECT_RSP – a connection request has been sent, pending a
    positive connect response.
    • CONFIG – the different options are being negotiated for both sides; this
    state comprises a number of substates, see Section 6.1.3 on page 114
    • OPEN – user data transfer state.
    • WAIT_DISCONNECT – a disconnect request has been sent, pending a
    disconnect response.
    • WAIT_CREATE – a channel creation request has been received, but only a
    response with indication “pending” can be sent. This state is similar to
    WAIT_CONNECT.
    • WAIT_CREATE_RSP – a channel creation request has been sent, pending
    a channel creation response. This state is similar to WAIT_CONNECT_RSP.
    • WAIT_MOVE – a request to move the current channel to another Controller
    has been received, but only a response with indication “pending” can be
    sent.
    • WAIT_MOVE_RSP – a request to move a channel to another Controller has
    been sent, pending a move response
    • WAIT_MOVE_CONFIRM – a response to the move channel request has
    been sent, waiting for a confirmation of the move operation by the initiator
    side
    • WAIT_CONFIRM_RSP – a move channel confirm has been sent, waiting for
    a move channel confirm response.

    各种状态下收到不同事件的处理,L2CAP的重点。
    

    5 Service Discovery Protocol(SDP)

    5.1 SDP 协议数据单元( PDU )

    《bluetooth_Core_v4.2.pdf》1926页
    每一SDP 协议数据单元( PDU )都由PDU 头和PDU 指定参数组
    成。报文头包含三个域:协议数据单元ID、事务ID 和参数长度
    ParameterLength,参数包括一个后续状态参数。
    这里写图片描述

    5.2 SDP 连接建立过程

    这里写图片描述

    5.3 Service Record

    这里写图片描述

    Each service attribute describes a single characteristic of a service. Some
    examples of service attributes are:
    这里写图片描述

    5.4 常见SDP获取的信息

    这里写图片描述
    PnP Information:有的蓝牙耳机没有实现这部分;
    这里写图片描述

    5.5 UUID定义

    https://www.bluetooth.com/specifications/assigned-numbers/service-discovery

    6 通用访问配置文件(Generic Access Profile, GAP)

    GAP是所有其他配置文件的基础,它定义了在蓝牙设备间建立基带链
    路的通用方法.除此之外,GAP还定义了下列内容:
    必须在所有蓝牙设备中实施的功能
    发现和链接设备的通用步骤
    基本用户界面术语.
    这里写图片描述
    GAP处理未连接的两个设备间的发现和建立连接过程,GAP确保了
    两个蓝牙设备可通过蓝牙技术交换信息。对于GAP的操作,直接由
    HCI命令分组控制。

    7 RFCOMM协议

    7.1 RFCOMM数据封包格式

    这里写图片描述
    Frame Structure for Basic option
    这里写图片描述
    一个封包内的各部分内容
    这里写图片描述
    UIH frames with P/F-bit = 1 and credit based flow control used.
    这里写图片描述
    这里写图片描述

    8 AUDIO/VIDEO CONTROL TRANSPORT PROTOCOL(AVCTP)

    Audio/Video Control Transport Protocol (AVCTP), which is used to transport command and response
    

    messages for controlling Audio Video features in conformant
    devices. This protocol enables a device to support more than
    one control profile at the same time; each supported profile
    shall define its own message formatting and/or usage rules.

    8.1 AVCTP所处的位置

    这里写图片描述
    AVCTP协议封包
    这里写图片描述
    这里写图片描述

    9 AUDIO/VIDEO REMOTE CONTROL PROFILE(AVCRP)

     This profile defines the requirements for Bluetooth® devices necessary for the support of the
    

    Audio/Video Remote Control usage case. The requirements
    are expressed in terms of end-user services, and by defining
    the features and procedures that are required for
    interoperability between Bluetooth devices in the
    Audio/Video Remote Control usage case.

    9.1 AVRC

    这里写图片描述

    10 Generic Audio/Video Distribution Profile (GAVDP)

      This profile defines the requirements for
    

    Bluetooth® devices necessary to set up streaming channels
    used for support of audio/video distribution. The
    requirements are expressed in terms of services provided to
    applications, and by defining the features and procedures
    that are required for interoperability between Bluetooth
    devices in the Audio/Video Distribution usage model.

    10.1 GAVDP协议位置

    这里写图片描述

    11 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(AVDTP)

     This protocol defines A/V stream negotiation, 
    

    establishment, and transmission procedures. Also specified
    are the message formats that are exchanged between such
    devices to transport their A/V streams in A/V distribution
    applications.

    11.1 AVDTP

    这里写图片描述

    11.2 AVDTP一些交互例子

    这里写图片描述

    12 ADVANCED AUDIO DISTRIBUTION PROFILE (A2DP)

    12.1 A2DP协议位置

    这里写图片描述
    这里写图片描述

    13 Hand s-Free Profile(HFP)

     The Hands-Free Profile (HFP) 1.7.1 specification
    

    defines a set of functions such that a Mobile Phone can be
    used in conjunction with a Hands-Free device (e.g., installed
    in the car or represented by a wearable device such as a
    headset), with a Bluetooth Link providing a wireless means
    for both remote control of the Mobile Phone by the Hands-
    Free device and voice connections between the Mobile
    Phone and the Hands-Free device.

    13.1 HFP协议位置

    这里写图片描述
    这里写图片描述

    14 HEADSET PROFILE(HSP)

     This profile defines the requirements for 
    

    Bluetooth® devices necessary to support the Headset use
    case. The requirements are expressed in terms of end-user
    services, and by defining the features and procedures that are
    required for interoperability between Bluetooth devices in the
    Headset use case.

    14.1 HSP协议位置

    这里写图片描述
    HSP(手机规格)– 提供手机(移动电话)与耳机之间通信所需的基
    本功能。
    HFP(免提规格)– 在 HSP 的基础上增加了某些扩展功能,原来只
    用于从固定车载免提装置来控制移动电话。
    A2DP(高级音频传送规格)– 允许传输立体声音频信号。 (相比用
    于 HSP 和 HFP 的单声道加密,质量要好得多)。
    AVRCP(音频/视频遥控规格)–用于从控制器(如立体声耳机)向
    目标设备(如装有 Media Player 的电脑)发送命令(如前跳、暂停
    和播放)。

    15 Human Interface Device (HID) Profile

     This profile defines how devices with Bluetooth  
    

    wireless communications can use the HID Specification
    initially to discover the feature set of a Bluetooth HID device,
    and then communicate with the Bluetooth HID device. This
    profile further defines how a device with Bluetooth wireless
    communications can support HID services over the Bluetooth
    protocol stack using the Logical Link Control and Adaptation
    Protocol (L2CAP) layer.

    15.1 HID协议位置

    这里写图片描述

    15.2 HID head message

    这里写图片描述

    16 Serial Port Profile(SPP)

     This profile defines the requirements for  
    

    Bluetooth® devices necessary for setting up emulated serial
    cable connections using RFCOMM between two peer devices. The requirements are expressed in terms of services
    provided to applications, and by defining the features and
    procedures that are required for interoperability between
    Bluetooth devices.

    16.1 SPP协议位置

    这里写图片描述
    这里写图片描述

    展开全文
  • 蓝牙Bluetooth

    2020-07-30 23:32:00
    将系统的蓝牙库CoreBluetooth进行二次封装,提供了如下功能 1).单利的初始化方式。 2).自动重连。 3).自定义筛选连接和重连条件。 4).后台模式
  • 蓝牙基础知识整理

    千次阅读 多人点赞 2018-12-29 22:15:30
    1、背景 上一次蓝牙过的比较匆忙,这次下定决心要把蓝牙的基础知识和应用搞清楚。 1.1 参考资料 蓝牙版本发展概述 http://blog.sina.com.cn/s/blog_d2db96110102xnj6.html ...BLE 协议系列之...

    1、背景

    上一次蓝牙过的比较匆忙,这次下定决心要把蓝牙的基础知识和应用搞清楚。

    1.1 参考资料

    蓝牙版本发展概述 http://blog.sina.com.cn/s/blog_d2db96110102xnj6.html

    深入浅出低功耗蓝牙(BLE)协议栈 https://blog.csdn.net/shunfa888/article/details/80140475

    BLE 协议系列之(一) 蓝牙介绍 https://blog.csdn.net/zwc1725/article/details/80703326

    2、蓝牙基础知识

    蓝牙协议也是通信协议的一种,目的就是把复杂的问题简单化,任何通信协议都具有层次性,特点如下:

    1、从下到上分层,通过层层封装,每一层只需要关心特定的、独立的功能,易于实现和维护

    2、在通信实体内部,下层向上层提供服务,上层是下层的用户。

    3、在通信实体之间,协议仅针对每一层。实体间的通信,就像每一层之间的通信一样,这样有利于交流、理解、标准化。

    当前的蓝牙协议包括BR/EDR(Basic Rate/Enhanced Data Rate)、AMP(Alternate MAC/PHYs)、LE(Low Energy)三种技术。

    2.1当前蓝牙技术特点---蓝牙协议版本看

    蓝牙历史我不追究,就从V4.0版本蓝牙开始。蓝牙4.0版本包括3个子规范,即传统蓝牙技术、高速蓝牙和低功耗蓝牙技术。

    目前移动设备上适用的蓝牙大多是V4.0以上,经典V4.0是传统的3.0蓝牙升级而成,向下兼容。而BLE4.0 是新的分支,不向下兼容。经典蓝牙模块,一般用于数量比较大的传输:如语音、音乐等较高数据量传输。经典蓝牙模块可细分为传统蓝牙模块和高速蓝牙模块。低功耗蓝牙模块是指支持蓝牙协议4.0或更高的模块,特点是成本和功耗的降低,应用于实时性要求比较高的产品中。

    蓝牙4.0有诸如低成本、跨厂商互操作性、3毫秒低延时、100米以上超长距离、AES-128加密等特点外,有效传输距离有所提升。

    蓝牙4.0 主打的是省电,蓝牙V4.1主打的是IOT(物联网)。

    蓝牙V4.1 以“internet of things”为目标对V4.0进行软件升级,在连接性进行提升(在硬件层面V4.0无需任何改动即可使用V4.1)。

    表现在:1、V4.1标准下蓝牙设备可以同时作为发射方(bt smart,v4.0上贴着的)和接收方(bt smart Ready),并且可以连接到多个设备上。 (主从一体,如智能手环作为主 和防丢器连接,同时也可以作为从 和智能手机相连)

    2、长期睡眠下的自动唤醒功能(离开则断开,回来则直接连上); 3、通过IPV6建立网络连接???? -----即蓝牙芯片设备可以取得互联网上的唯一标记,与其他的联网设备进行通信,即蓝牙V4.1连上可上网的设备后,就可以直接利用IPV6连接网络了,实现和WIFI模块相同的功能,但在兼容性上还在做改进,加油吧,骚年。

    蓝牙V4.2改善了数据传输速度和隐私保护程度,并接入了该设备将可直接通过IPv6和6LoWPAN接入互联网。 速度提高2.5,数据包容量相当于之前的10倍。低功耗从260kbps---》650Kbps,全功耗仍为2.1Mbps。新标准为固件升级提供了支持

    V4.1 和V4.2都在规格书上添加对无线共存项的测试,因此在4G共存上确保与其的共存性。

    当前蓝牙协议包括BR/EDR、AMP、LE三种技术。

    2.2蓝牙模块分类标准

    1、按支持的蓝牙协议分

    单模蓝牙模块:支持蓝牙某一种协议的模块;

    双模蓝牙模块:同时支持经典蓝牙(BT)和低功耗蓝牙(BLE)协议的模块。

    2、按应用分

    蓝牙数据模块:一般多使用BLE低功耗蓝牙模块

    蓝牙音频模块:音频需要大码流的数据传输更适合使用BT经典蓝牙模块。

    低功耗蓝牙和传统蓝牙实际上有很大的不同,低功耗蓝牙是nokia的wibree标准上发展起来的。在功耗上,传统蓝牙有3个级别的功耗,class1、class2、class3分别支持100m、10m、1m的传输距离;低功耗蓝牙没有功耗级别,一般发送功率在7dbm。

    3 低功耗蓝牙协议栈

    3.1 协议栈架构

    BLE工作在免许可的2.4G ISM射频端,它一开始就设计为高低功耗无线技术。

    BLE协议可分为2大部分:BLE Application BLE Core;而BlueTooth core有包括BLE controller BLE Host 2部分。

    BLE Core 包括Controller 到Host的L2CAP层,以及相关的核心profile.

    BlueTooth Application 包括各种各样的profile(规范),如HOGP、A2DP、HFP、OOP等。

     

    上图为BLE协议栈整体架构(application+core),要想实现一个BLE应用,首先需要一个支持BLE射频的芯片,然后还需要提供一个与此芯片配套的BLE协议栈,最后再协议栈上开发自己的应用。因此BLE协议栈是连接芯片和应用的桥梁,是实现整个 BLE应用的关键。

    图上的BlueTooth Core 和BlueTooth Application  Host Controller,都是指"逻辑实体"。所谓“逻辑实体”,需要和日常生活中的"物理实体"区分开。如一块蓝牙芯片、主控CPU,就是指物理实体。而蓝牙协议所描述的这些“逻辑实体”,不一定会和物理实体一一对应。如在实际应用中,host和Bluetooth Application可能会位于同一物理实体中(主控CPU),而Controller单独位于另一个物理实体中(蓝牙芯片)。

    蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议和(Buletooth Core)蓝牙应用层协议(Bluetooth Application).蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,定义出各种各种的策略,如FTP,文件传输,局域网等。

    Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。

    在一个系统中,Host只有一个,但Controller可以是一个,或多个。如:单独的LE Controller,单独的BR/EDR Controller,单独的LE+BR/EDR Controller;在单独的BR/EDR  Controller或LE+BR/EDR Controller基础上,增加一个或多个AMP Controller。

    3.2 通信实体内从下到上各层分析

    3.2.1 物理层PHY

    任何一个通信系统,首先要确定的是通信介质(通信通道,Physical Channel)

    Physical Layer(PHY)  ----PHY层用来指定BLE所用的无线频段、调制解调方式和方法。

    具体描述:由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400~2.4835GHz);为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称为RF Channel。--------BLE的物理通道   频点为f=2402+K*2 MHz  k=0~39,带宽为2MHz的40个RF Channel。

    除了物理通道之外,Physical Layer还需要定义RF收发双方的而一些其他特性:

    RF发射相关的特性(Transmitter Characteristics),包括发射功率(Transmission power、调制方式(Modulation),高斯频移键控(Gaussian Frequency Shift Keying ,GFSK)、Spurious Emissions、Radio Frequency Tolerance等等。(不影响本文后续的讨论,不用深究);

    RF接收相关的特性(Receiver Characteristics),包括接收灵敏度等。

    3.2.2、Link Layer 链路层

    主要功能:在Physical Channel(即40个RF Channel)上可靠收发数据。需要控制RF收发相关的参数以及解决Physical Channel的共享问题,还需要(对于两个通信实体),有一条独享的传输通道(即logical Link,逻辑链路)。另外,由于Physical Channel是不可靠的,Link Layer需要提供校验、重传等机制,确保数据传输的可靠性。

    解决问题1:Physical  Channel的共享问题

    1、数据量比较少、发送不频繁、对时延不很敏感的场景

    ----Link Layer采用 广播通信,从40个RF Channel中选取3个,作为广播通道(advertising  channel);即所有参与者,共享同一个逻辑传输通道(广播通道)

    2、数据量大、发送频率高、对时延较敏感的场景

    -----从Link Layer剩余的37个RF Channel中,选取一个,为这种场景里面的通信双方建立独立的通道(data channel)------这是连接的过程。

    ----注意,为了增加对4G(2.4G 频段)的抗干扰能力,采用跳频技术(Hopping)。即在多个channel之间随机但有规律的切换。

    解决问题2:如何建立独享的逻辑链路----状态和角色定义

    BLE协议在Link Layer抽象出5中状态:

    Standby Stae、Advertising State、Scanning State、Initiating State、Connection State。 同一时刻设备只能处于一种状态。

     注意双向箭头和单向箭头

    Link Layer 状态机变化图

    1、Standby状态是初始状态,即不发送数据,也不接受数据。根据上层实体的CMD(如位于Host软件中GAP),可由其他任何一种状态进入,也可以切换至出Connection状态外的任何一种状态。

    2、Advertising状态是可以通过广播通道发送数据的状态,有Standby状态进入。Advertiser广播的数据可以由处于Scanning或者Initiating状态的实体接收。上层实体可通过命令将Advertising状态切换回Standby状态。另外,连接成功后,可切换至Connection状态。

    3、Scanning状态是可以通过广播通道接收数据的状态,由Standby状态进入。上层实体可通过命令将Scanning状态切换回Standby状态。

    4、Initiating状态和Scanning状态类似,不过是一种特殊的接受状态,由Standby状态进入,只能接受Adverstiser广播的connectable的数据,并在接收到数据后,发送连接请求,以便和Advertiser建立连接。当连接成功后,Initiater和对应的Adverstiser都会切换至Connection状态,

    5、Connection状态是和某个实体建立了单独通道的装填,在通道建立之后,由Initiating或Advertising自动切换而来。通道断开后,会重新回到Standby状态。

    在通道建立后,处于Connection状态的双方,有两种角色Master和Slave。

    对于Initiater方称作Master;  Advertiser方为Slave。   主机从机两种角色。

    解决问题3:可靠性---空中点对点通信协议

    1、在某一状态下,和其他实体对应状态之间的数据交换机制;2、根据上层实体的指令,以及当前的实际情况,负责状态间切换。---------由空中接口协议(Air Interface Protocol)处理。

    两种类型的Physical Channel(advertising channel 和data channel)统一使用一种packet format。

    Preamble(1 octet)   Access Address(4 octets) PDU(2~257 octets)  CRC(3 octets)   octets 8位字节

    数据报格式特别说明:

    注1:

    Access Address 接入地址: 用于是被是数据包还是广播包

    PDU,BLE在Link Layer的PDU长度最大为257 octets

    Link Layer 总长度在9~264bytes(1+8 ~257+8)?????

    注2:

    数据链路层link Layer 有5种状态,每种状态下所传输的功能不尽相同,因此,定义了多种PDU类型。

    以白名单(White List)的形式定义数据链路层的数据过滤机制-------针对广播通道

    数据控制协议(Link Layer Control),用于管理、控制两个Link Layer实体间所建立的这个Connection。主要功能:

    1、更新Connection相关的参数

    2、更新该链接所使用的调频图谱(即使用哪些Physical Channels)

    3、执行链路加密(Encryption)有关的过程。

    3.2.3 HCI

    定义Host和Controller(通常是两颗IC,ESP32可以在一颗上)之间的通信协议,可基于Uart、USB和软件模拟。

    3.2.4 L2CAP Protocol

     

    3.2.5 ATT Protocol

    BLE的初衷是用于物联网,物联网中最重要、最广泛的应用是信息采集。基于信息采集的需求,BLE抽象出一个协议:Attribute protocol。这个协议将这些信息以"Atributte(属性)"的形式抽象出来,并提供一些方法,供远端设备remote devece 读取、修改这些属性的值(Attribute Value).

    ATT(Attribute Protocol) 属性层是GATT和GAP的基础,它定义了BLE协议栈上层的数据结构和组织方式。

    属性概念是ATT层的核心,定义了属性的内容,规定了访问属性的方法和权限。----类似于编程的数据结构

    属性包括三种类型:服务项、特征值和描述符。三者之间存在树状包含关系,服务项包含一个或多个特征值,特征值包含一个或多个描述符,多个服务项组织在一起,构成属性规范(Attribute Profile)。

    对于常用的属性规范,比如体重计、心率计,BLE协议做了具体定义。

    只要BLE主从设备均遵守某个Profile来进行设计,那么两者就能优雅的通信。

    GATT Profile 用ATT协议在设备间来传输命令、请求、应答、指示、通知和确认消息。这些数据存于Attibute  Protocol PDUS。

    Opcode :操作码---特定命令、请求、应答、指示、通知、确认的操作码和用于身份验证的标志。

    Attribute Parameter:特定命令或请求的数据, 或者是应答、通知和指示的数据。

    Authentication signature: 可选的。

    在服务器server设备上: 属性协议命令和请求以属性形式存储

    属性有四部分组成:属性句柄、属性类型、属性值、属性权限。

    2.3.2.4.1  属性数据结构

    属性数据结构包含:句柄、类型、属性值、权限。下图是逻辑属性表示。

    属性句柄(Attribute Handle)就是一个对应特定属性的一个索引。它是一个2字节的十六进制码,起始于0x0001,在系统初始化时候,各个属性的句柄递增(但不一定加一),最大不超过0xFFFF。与编程中的句柄的概念类似,就是某个属性值的查询地址。

    属性类型(Attribute Type)是UUID,用于说明属性值的类型。用以区分当前属性是服务项或是特征值等。

    属性值(Attribute Value): 数据(由Attribute Type描述,由Attribute handle 索引)。

    属性权限(Attribute permissions):有Server使用决定给定的attribute是否允许写或读访问。由GATT来确认。

     

     

    3.2.6 GATT

    ~1 Role

    GATT的角色有两种:GATT server 和GATT client。客户端和服务器:提供数据的设备称为GATT服务器,访问GATT服务器而获得数据的设备称为GATT客户端

    ~2 profile 架构

    GATTProfile 指定了pfofile data 交换的数据结构。这个结构定义基本元素(如services和characteristics)。所有元素都用Attibute表示。

    上图是GATT Profile的架构。一个profile包含一个或多个services。一个service包括多个characteristics 或其他service的应用(include)。每个characteristic包括值和其他可选的值的信息。在server设备中,service和characteristic和characteristic的组成(valus和descrptors)以Attributes存储。

    ~2.1 Characteristic

    Characteristic定义至少包括2个属性,一个属性用于声明(characteristic declaration),另一个用于存放特征的值(characteristic value declaration)。另外可能还有特征描述符(characteristic descriptor declaration) 。上述的三种declaration都是包含在独立的Attribute中。 characteristic declaration之后紧跟characteristic value declaration。而可选的所有characteristic descriptor declaration跟在characteristic value declaration之后。characteristic descriptor declarations之间的顺序就那么不重要了。

    可以把多个characteristic value declaration聚合在一起成为一个复合的Characteristic。

    ~2.1.1characteristic declaration 特征声明

    对于Characteristic declaration 特征声明是一个属性。

    其Attribute Type 为0x2803----- UUID for <<Characteristic>>;   特征声明的UUID类型

    其Attribute Value为Characteristic Properties,Characteristic Value Attribute的句柄和Characteristic UUID。

    其Attribute Permissions 需要是可读的且无需身份验证或授权。

    注意:当服务器和客户端建立信任关系时,特征声明的Attribute Value 不能改动。

    一个service 可能有多个拥有相同Characteristic UUID的 特征声明。

    有必要对特征声明的三个属性值在细究一下。

    Characteristic Properties---------决定了特征值如何使用、特征描述符如何访问。如下表3.5所列,如果设置了对应的位,则表中UI对应描述会被允许。位或操作。

    ~2.1.2 characteristic value declaration 特征值

    特征值是一个属性,它包括特征的值。

    其Attribute Type:16-bit BlueTooth UUID 或者是 128-bit的Characteristic UUID。

    其Atrribute Vlaue: Characteristic 的值。

    Attribute Permissions:有service指定,没有指定时由spcecific实现。

    ~2.1.3characteristic descriptor declaration

    这里面的内容比较多。

    ~2.1 Service

    Service定义包括service描述(service declaration),也可能包括定义(definitions)和特征定义(Characteristic definitions)。

    server设备上Service definitions按Attribute Handle的顺序排列。

    服务描述是一个Attribute。

    Attribute Type属性类型: 设置为0x2800——《Primary Service》或0x2801——《Secondary Service》.

    Attribute Value:16bit的BlueTooth的UUID 或者 128bit 服务UUID。-------称为服务UUID。客户端必须同时支持16bit 和128bit 的UUID。一个客户端可能可以忽略任何具有未知服务UUID的服务定义。一个未知的服务UUID是服务不支持的UUID。

    Attribute Permission:必须是可读的且无需身份验证或授权。

    当存在多个服务,服务定义中有16bit的蓝牙UUID服务说明分在一组,128bi的UUID的服务说明分在另一组。

    2.3.2.7 GAP-Generic Access Profile

    该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接。

    GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接。它出一些一般的业务(如询问、命名和搜索)和一些安全性问题(如担保) 同时还处理一些有关连接的业务(如链路建立、信道和连接建立)。

    GAP规定的是一些一般性的运行任务。因此,它具有强制性,并作为所有其它蓝牙应用规范的基础。

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • 蓝牙协议(1)-- 基本协议

    万次阅读 多人点赞 2018-11-30 11:56:36
    蓝牙协议分析(1)基本概念  蓝牙4.1,是一个大杂烩:BR/EDR沿用旧的蓝牙规范;LE抄袭802.15.4;AMP直接使用802.11。而这一切的目的,就是以兼容性和易用性为基础,在功耗和传输速率之间左右为难。...

    蓝牙协议分析(1)基本概念

     蓝牙4.1,是一个大杂烩:BR/EDR沿用旧的蓝牙规范;LE抄袭802.15.4;AMP直接使用802.11。而这一切的目的,就是以兼容性和易用性为基础,在功耗和传输速率之间左右为难。

    1.蓝牙技术的概述

    1.1 两种蓝牙技术:经典蓝牙(检称 BT)和低功耗蓝牙(简称BLE)

     蓝牙协议包括两种技术:经典蓝牙(简称BT)和低功耗蓝牙(简称BLE)。这两种技术,都包括搜索(discovery)管理、连接(connection)管理等机制,但它们是不能互通的!因此在硬件模组上又有单模蓝牙和双模蓝牙的区别。在智能手机中的蓝牙就是双模蓝牙,它可以支持经典蓝牙和低功耗蓝牙。

    • 双模蓝牙:支持低功耗蓝牙和经典蓝牙的所有功能
    • 低功耗蓝牙:仅支持低功耗蓝牙不支持经典蓝牙
    • 经典蓝牙: 仅支持经典蓝牙不支持低功耗蓝牙
    1.1.1 经典蓝牙(BT): BR技术 、EDR技术 、AMP技术

     经典蓝牙是正宗的蓝牙技术。
     蓝牙诞生之初,使用的是BR技术,此时蓝牙的理论传输速率,只能达到721.2Kbps。在那个年代,56Kbps的Modem就是高大上了,这个速度可以说是惊为天人了啊!但是科技变化太快了,BR技术转眼就过时了。那怎么办呢?缝缝补补一下,增强速度呗,Enhanced Data Rate就出现了。

     使用EDR技术的蓝牙,理论速率可以达到2.1Mbps。这一次的升级换代,还算优雅,因为没有改变任何的硬件架构、软件架构和使用方式上的改变。

     也许你也猜到了,EDR又落伍了,看看人家WIFI(WLAN),几十Mbps,上百Mbps,咱们才2.1Mbps,也太寒酸了吧!那怎么办呢?蓝牙组织想了个坏主意:哎,WIFI!把你的物理层和MAC层借我用用呗!这就是AMP(Alternate MAC and PHY layer extension)。艾玛,终于松口气了,我们可以达到54Mbps了。

     不过呢,由于蓝牙自身的物理层和AMP技术差异太明显了,这次扩展只能是交替使用(Alternate)的,也就是说,有我(BR/EDR)没你(AMP)。

    1.1.2 低功耗蓝牙(BLE):LE技术

     上面所讲的是经典蓝牙的技术进化路线,就是传输速率的加快、加快、再加快。但能量是守恒的,你想传的更快,代价就是消耗更多的能量。而有很多的应用场景,并不关心传输速率,反而非常关心功耗。这就是低功耗蓝牙(简称 BLE)产生的背景。

     BLE技术相比经典蓝牙技术,差异非常大,或者说就是两种不同的技术,凑巧都加一个“蓝牙”的前缀而已。后面我们会详细的解释这种差异,以及LE的行为特征。

    1.2 蓝牙技术系统的组成

    在这里插入图片描述
    上图描述了蓝牙系统的组成, 我们需要注意如下特点:

    • 1)图中所描述的蓝牙系统的组成部分,如Bluetooth Core和Bluetooth Application,如Host和Controller,都是指“逻辑实体”。所谓的“逻辑实体”,需要和日常生活中的“物理实体”区隔开。如在做电路设计时,一个蓝牙芯片、一个主控CPU,就是指物理实体。而蓝牙协议所描述的这些“逻辑实体”,不一定会和物理实体一一对应,如在实际应用中,Host和Bluetooth Application可能会位于同一个物理实体中(主控CPU),而Controller单独位于另一个物理实体中(蓝牙芯片)

    • 2)蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)。蓝牙核心协议关注对蓝牙核心技术的描述和规范,它只提供基础的机制,并不关心如何使用这些机制;蓝牙应用层协议,是在蓝牙核心协议的基础上,根据具体的应用需求,百花齐放,定义出各种各样的策略,如FTP、文件传输、局域网等等。

    • 3)Bluetooth Core由两部分组成,Host和Controller。这两部分在不同的蓝牙技术中(BR/EDR、AMP、LE),承担角色略有不同,但大致的功能是相同的。Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。

    • 4)在一个系统中,Host只有一个,但Controller可以一个,也可以有多个。如:单独的LE Controller;单独的BR/EDR Controller;单独的LE+BR/EDR Controller;在单独的BR/EDR Controller或LE+BR/EDR Controller基础上,增加一个或多个额外的AMP Controller。

    2. BR/EDR vs LE vs AMP

    在这里插入图片描述
     该图片是对Bluetooth Core的一个Overview,从RF的Physical Channel,到Baseband的Physical Link、Logical Link、LMP、L2CAP等概念,都有一些粗略的介绍。由该图片可以看出,BR/EDR、AMP、BLE等技术有如下的特点:

    • 1)BR/EDR技术,过于侧重“点对点”通信,以至于虽然在协议的底层(如Logical Link)有提及多播(Unidirectional)和广播(Broadcast)的概念,但在上层的应用场景中,几乎不存在(也不可能存在)相应的应用。

    • 2)但随着物联网的发展,业界对简单的、不需要连接的多播或广播通信的需求越来越迫切,因此BLE技术在RF和Baseband的协议中,就做出了修改,以适应这种需求,即:修改原有的79个channel的跳频方式,将channel的个数减少为40个,并保留了不少于3个的固定channel,用于广播通信。为仅仅在剩下的37个data channel上跳频。

    • 3)正因为这种改变,原有的搜索/连接/配对等概念,在BLE上就不再存在了,取而代之的是Advertisor、Initiator等概念。但在之后的数据通信的层次上,尽量保持了一致。

    • 4)对于AMP来说,是基于BR/EDR的controller,在完成通常的点对点连接之后,两个蓝牙设备商议,是否需要将后续的数据通信,转移至AMP controller上。这就是Bluetooth 3.0引入的AMP技术。

    展开全文
  • Android下bluetoothBluetooth apk介绍

    千次阅读 2018-04-25 10:28:12
    首先我们先熟悉一下蓝牙协议的基本规范1)A2DP(Advanced Audio Distribution Profile) 高级音频、立体声规范,包括A2DP Sink和A2DP Source;2)AVRCP(Audio/Video Remote Control Profile) 音视频远程控制规范...

    首先我们先熟悉一下蓝牙协议的基本规范

    1)A2DP(Advanced Audio Distribution Profile)

            高级音频、立体声规范,包括A2DP Sink和A2DP Source;

    2)AVRCP(Audio/Video Remote Control Profile)

            音视频远程控制规范,音乐播放、暂停等;

    3)HFP(Hands-Free Profile)

            免提规范,用于蓝牙通话;

    4)HSP(Headset Profile)

            耳机规范,用于蓝牙耳机;

    5)HID(Human Interface Device Profile)

            人体接口设备规范,分为HID Host和HID Device;

    6)OPP(Object Push Profile)

            对象推送规范,用于传输文件;

    7)PAN(Personal Area Networking Profile)

            个人局域网规范,蓝牙网络共享;

    8)PBAP(Phone Book Access Profile)

            电话号码薄访问规范;

    9)MAP(Message Access Profile)

            信息访问规范;

    10)HDP(Health Device Profile)

            健康设备规范,和一些健康蓝牙设备进行通信;

    11)BLP(Blood Pressure Profile)

            血压规范;

    12)HRP(Heart Rate Profile)

            心率规范;

    13)HOGP(HID Over GATT Profile)

            基于GATT的HID规范;

    14)FMP(Find Me Profile)

            找我规范;

    15)TIP(Time Profile)

            时间规范


    1.Bluetooth应用层框架介绍


                                                                            Bluetooth应用框架

    1)Applications:Android蓝牙应用程序,就是使用蓝牙的API的程序;

    2)Java FW:提供给应用使用的API,我们平时使用的BluetoothAdapter,BluetoothDevice,BluetoothSocket等;

    3)BluetoothAPP:这个本来应该是属于Java FW范畴的,不过由于它比较特殊,所以独立出来,提供所有的上层服务以及与Bluetooth底层记性交互。其中BTAdapter主要提供蓝牙的基本操作,比如enable,disable,discovery,pair,unpair,createRfcomm等,其他的就都是Profile的各自的service了;

    4)Bluedroid:蓝牙协议栈,提供所有的实际操作,开关蓝牙,蓝牙的管理,搜索管理,链路管理,各种profile的实现,包括HCI,ACL,SCO,L2CAP,各种profile等;

    这里的bluedroid分为三部分:

        (1)BITF(Bluetooth interface):提供所有Bluetooth.apk需要的API(使用HAL)

         (2)BTA(Bluetooth Application):蓝牙应用,一般指蓝牙的Profile的Bluedroid实现

        (3)Stack:实现所有蓝牙底层的操作,其中还要分为btm(Bluetooth manager),btu(Bluetooth Upper Layer)等。

    2.Bluedroid软件介绍


                            bluedroid框架图


                bt目录结构

    1)audio_a2dp_hw:Implements hal for bluedroid a2dp audio device。a2dp再bluedroid中的hal层实现。它通过socket与stack进行通信(通信机制实现参考udv目录下的uipc);

    2)bta:Bluetooth Application layer,实现应用层的一些接口,但都由btif层进行管理和调用。

        Ag:audio gateway (AG) subsystem of BTA

        Ar:implementation for the audio/video registration module.

        Av:implementation of the API for the advanced audio/video(AV)

        *subsystem of BTA, Broadcom's Bluetooth application layer for mobile phones*

        Dm:API implementation file for the file system call-in functions.//phone

        Gattr:the GATT server and client implementation

        Hh:host hid

    3)btif:all BTIF functions accessed from main bluetooth HAL(与Android的Bluetooth apk的jni层通信的接口,真正的为app提供interface的接口);

    4)conf:是Bluedroid的一些配置文件;

    5)embdrv:主要负责sbc编码,SBC是一种用于蓝牙设备标准音频编解码器的高效编码方法。在蓝牙技术的a2dp的音频数据规格中,SBC是用来保持互连能力的一个十分重要的音频数据编码方法,它是MP3和MPEG-AAC的规定选项;

    6)gki/osi:general kernel interface/os interface,针对OS的移植层,包括多任务和timer实现,实际就是为Stack代码提供一个抽象的多任务和时间控制环境,达到可移植的目的;

    7)hci:host control interface,实现hci的协议,并连接Stack层与底层通信的实现;

    8)main:处理配置信息,各个模块的初始化,连接btif与hci,提供btif控制hci的接口;

    9)Stack:协议栈代码,各种profile;

    10)udrv:代码作用是跟a2dp端进行Socket通信,处理命令和a2dp数据pcm流,media task调用这里的接口,实际就是跟audio_a2dp_hw的audio hal通信;

    11)utils:杂项,很简单,目前就是提高a2dp任务优先级的函数;

    12)vnd:vendor specific feature for BLE;

         其中,还有一个bt vendor没包含在bluedroid中,对于realtek的蓝牙,都是使用相同的bluedroid,但不同的蓝牙模块有不同的bt vendor库,该vendor库的功能是给蓝牙模块上、掉电,打开、关闭、配置串口,download fw(USB接口蓝牙的download fw在驱动内实现)。

    数据流传输流程:

    (1)uart口取得蓝牙模块的数据;

    (2)uart口通过Idisc传给hci_uart;

    (3)hci_uart传给在其上的h4;

    (4)h4传给hci;

    (5)hci层传给l2cap层;

    (6)l2cap层再传给rfcomm

    2.1 bluedroid对上层接口

        bluedroid与上层有多个接口,bluedroid/btif/src/bluetooth.c为一个主要接口,负责蓝牙的开关以及基本控制,bluedroid\audio_a2dp_hw\audio_a2dp_hw.c专门针对a2dp的控制,还有部分profile也提供一些接口,这些接口为不同profile的独立接口。其中bluetooth.c实现一系列接口,由上层调用来控制蓝牙,同事在初始化的时候,上层会传递过来一个毁掉接口,当bluedroid有消息或结果需要通知上层时,就该通过回调接口。但像蓝牙的opp、hid等profile的数据就不是通过接口传递的,都是创建Socket接口来交换数据的。

    \bluedroid\btif\src\bluetooth.c
    static const bt_interface_t bluetoothInterface = {
        sizeof(bluetoothInterface),
        init,
        enable,
        disable,
        get_recv_byte,
        get_send_byte,
        cleanup,
        get_adapter_properties,
        get_adapter_property,
        set_adapter_property,
        get_remote_device_properties,
        get_remote_device_property,
        set_remote_device_property,
        get_remote_service_record,
        get_remote_services,
        start_discovery,
        cancel_discovery,
        create_bond,
        remove_bond,
        cancel_bond,
        get_connection_state,
        pin_reply,
        ssp_reply,
        get_profile_interface,
        dut_mode_configure,
        dut_mode_send,
    #if BLE_INCLUDED == TRUE
        le_test_mode,
    #else
        NULL,
    #endif
        config_hci_snoop_log,
        set_os_callouts,
        read_energy_info,
    };
    hardware\libhardware\include\hardware\bluetooth.h
    typedef struct {                                /* 蓝牙接口结构体定义 */
        /** set to sizeof(bt_interface_t) */
        size_t size;
        /**
         * Opens the interface and provides the callback routines
         * to the implemenation of this interface.
         */
        int (*init)(bt_callbacks_t* callbacks );
    
        /** Enable Bluetooth. */
        int (*enable)(void);
    
        /** Disable Bluetooth. */
        int (*disable)(void);
        /** Get Bluetooth recv */
        int (*get_recv_byte)(void);
    
        ……  /* 省略中间代码 */
    
        int (*read_energy_info)();
    } bt_interface_t;
    \bluedroid\btif\src\bluetooth.c
    static int init(bt_callbacks_t* callbacks )   /* 初始化时,上层传递下来的回调接口结构体 */
    {
    ALOGI(“init”);
    
    /* sanity check */
    if (interface_ready() == TRUE)
            return BT_STATUS_DONE;
    
    /* store reference to user callbacks */
        Bt_hal_cbacks = callbacks; 
    
        /* add checks for individual callbacks ? */
    
        bt_utils_init();
    
        /* init btif */
        btif_init_bluetooth();
    
        return BT_STATUS_SUCCESS;
    }
    hardware\libhardware\include\hardware\bluetooth.h
    /** Bluetooth DM callback structure. */           /* 回调结构体 */
    typedef struct {
        /** set to sizeof(bt_callbacks_t) */
        size_t size;
        adapter_state_changed_callback adapter_state_changed_cb;
        adapter_properties_callback adapter_properties_cb;
        remote_device_properties_callback remote_device_properties_cb;
        device_found_callback device_found_cb;
        discovery_state_changed_callback discovery_state_changed_cb;
        pin_request_callback pin_request_cb;
        ssp_request_callback ssp_request_cb;
        bond_state_changed_callback bond_state_changed_cb;
        acl_state_changed_callback acl_state_changed_cb;
        callback_thread_event thread_evt_cb;
        dut_mode_recv_callback dut_mode_recv_cb;
        le_test_mode_callback le_test_mode_cb;
        energy_info_callback energy_info_cb;
    } bt_callbacks_t;
    其中在get_profile_interface函数中会返回各种profile提供的接口。
    \bluedroid\btif\src\bluetooth.c
    static const void* get_profile_interface (const char *profile_id)
    {
        ALOGI("get_profile_interface %s", profile_id);
        /* sanity check */
        if (interface_ready() == FALSE)
            return NULL;
        /* check for supported profile interfaces */
        if (is_profile(profile_id, BT_PROFILE_HANDSFREE_ID))
            return btif_hf_get_interface();
        if (is_profile(profile_id, BT_PROFILE_HANDSFREE_CLIENT_ID))
            return btif_hf_client_get_interface();
        if (is_profile(profile_id, BT_PROFILE_SOCKETS_ID))          /* rfcomm使用 */
            return btif_sock_get_interface();
        if (is_profile(profile_id, BT_PROFILE_PAN_ID))
            return btif_pan_get_interface();
        if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_ID))
            return btif_av_get_src_interface();
        if (is_profile(profile_id, BT_PROFILE_ADVANCED_AUDIO_SINK_ID))
            return btif_av_get_sink_interface();
        if (is_profile(profile_id, BT_PROFILE_HIDHOST_ID))
            return btif_hh_get_interface();
        if (is_profile(profile_id, BT_PROFILE_HEALTH_ID))
            return btif_hl_get_interface();
        if (is_profile(profile_id, BT_PROFILE_MAP_CLIENT_ID))
            return btif_mce_get_interface();
    #if ( BTA_GATT_INCLUDED == TRUE && BLE_INCLUDED == TRUE)
        if (is_profile(profile_id, BT_PROFILE_GATT_ID))
            return btif_gatt_get_interface();
    #endif
        if (is_profile(profile_id, BT_PROFILE_AV_RC_ID))
            return btif_rc_get_interface();
        if (is_profile(profile_id, BT_PROFILE_AV_RC_CTRL_ID))
            return btif_rc_ctrl_get_interface();
        return NULL;
    }
        下面为使用rfcomm通信时的使用的接口:
    \bluedroid\btif\src\btif_sock.c
    static btsock_interface_t sock_if = {
                    sizeof(sock_if),
                    btsock_listen,
                    btsock_connect
           };
    btsock_interface_t *btif_sock_get_interface()
    {
        return &sock_if;
    }
    
    audio_a2dp_hw.c的接口就没有看到回调函数,但audio_a2dp_hw.c中创建了2个socket接口,一个用于控制命令,一个用于a2dp数据的传输。
    \bluedroid\audio_a2dp_hw\audio_a2dp_hw.c
    static int adev_open(const hw_module_t* module, const char* name,
                         hw_device_t** device)
    {
        ……  /* 省略中间代码 */
        adev->device.get_parameters = adev_get_parameters;
        adev->device.get_input_buffer_size = adev_get_input_buffer_size;
        adev->device.open_output_stream = adev_open_output_stream;
        adev->device.close_output_stream = adev_close_output_stream;
        adev->device.open_input_stream = adev_open_input_stream;
        adev->device.close_input_stream = adev_close_input_stream;
        adev->device.dump = adev_dump;
      ……  /* 省略中间代码 */
    
    static struct hw_module_methods_t hal_module_methods = {
        .open = adev_open,
    };
    
    struct audio_module HAL_MODULE_INFO_SYM = {
        .common = {
            .tag = HARDWARE_MODULE_TAG,
            .version_major = 1,
            .version_minor = 0,
            .id = AUDIO_HARDWARE_MODULE_ID,
            .name = "A2DP Audio HW HAL",
            .author = "The Android Open Source Project",
            .methods = &hal_module_methods,
        },
    };
    \bluedroid\audio_a2dp_hw\audio_a2dp_hw.c
    static int adev_open_input_stream(struct audio_hw_device *dev,
                                      audio_io_handle_t handle,
                                      audio_devices_t devices,
                                      struct audio_config *config,
                                      struct audio_stream_in **stream_in,
                                      audio_input_flags_t flags __unused,
                                      const char *address __unused,
                                      audio_source_t source __unused)
    {
        ……  /* 省略中间代码 */
        in->stream.common.set_parameters = in_set_parameters;
        in->stream.common.get_parameters = in_get_parameters;
        in->stream.common.add_audio_effect = in_add_audio_effect;
        in->stream.common.remove_audio_effect = in_remove_audio_effect;
        in->stream.set_gain = in_set_gain;
        in->stream.read = in_read;   /* 该函数会打开data socket */
        in->stream.get_input_frames_lost = in_get_input_frames_lost;
    
        /* initialize a2dp specifics */
        a2dp_stream_common_init(&in->common);
    
        *stream_in = &in->stream;
        a2dp_dev->input = in;
    
        a2dp_open_ctrl_path(&in->common);
    \bluedroid\audio_a2dp_hw\audio_a2dp_hw.c
    static void a2dp_open_ctrl_path(struct a2dp_stream_common *common)
    {
        int i;
    
        /* retry logic to catch any timing variations on control channel */
        for (i = 0; i < CTRL_CHAN_RETRY_COUNT; i++)
        {
            /* connect control channel if not already connected */
            if ((common->ctrl_fd = skt_connect(A2DP_CTRL_PATH, common->buffer_sz)) > 0)
            {
    \bluedroid\audio_a2dp_hw\audio_a2dp_hw.c
    static ssize_t in_read(struct audio_stream_in *stream, void* buffer,
                           size_t bytes)
    {
        …… /* 省略中间代码 */
        /* only allow autostarting if we are in stopped or standby */
        if ((in->common.state == AUDIO_A2DP_STATE_STOPPED) ||
            (in->common.state == AUDIO_A2DP_STATE_STANDBY))
        {
            pthread_mutex_lock(&in->common.lock);
    
            if (start_audio_datapath(&in->common) < 0)
    \bluedroid\audio_a2dp_hw\audio_a2dp_hw.c
    static int start_audio_datapath(struct a2dp_stream_common *common)
    {
        …… /* 省略中间代码 */
        /* connect socket if not yet connected */
        if (common->audio_fd == AUDIO_SKT_DISCONNECTED)
        {
            common->audio_fd = skt_connect(A2DP_DATA_PATH, common->buffer_sz);

    2.2 Bluedroid中的HCI层接口

        Hci层处于bluedroid架构的最下面,向下与bt-vendor、内核交互,向上与bluedroid核心层交互。

        2.2.1 Bluedroid中HCI与bt-vendor接口

        Bluedroid与下层的交互接口全由hci目录的代码实现,在vendor.c文件中加载bt-vendor库,使用bt-vendor提供的接口,并把一个回调结构体传递给bt-vendor.

    \bluedroid\hci\src\vendor.c
    static const char *VENDOR_LIBRARY_NAME = "libbt-vendor.so";   /* 固定的bt-vendor库名 */
    
    bool vendor_open(const uint8_t *local_bdaddr) {
      assert(lib_handle == NULL);
    
      lib_handle = dlopen(VENDOR_LIBRARY_NAME, RTLD_NOW);
      if (!lib_handle) {
        ALOGE("%s unable to open %s: %s", __func__, VENDOR_LIBRARY_NAME, dlerror());
        goto error;
      }
    
      vendor_interface = (bt_vendor_interface_t *)dlsym(lib_handle, VENDOR_LIBRARY_SYMBOL_NAME);
      if (!vendor_interface) {
        ALOGE("%s unable to find symbol %s in %s: %s", __func__, VENDOR_LIBRARY_SYMBOL_NAME, VENDOR_LIBRARY_NAME, dlerror());
        goto error;
      }
    
    /* 调用bt-vendor的初始化并传递回调结构体 */
      int status = vendor_interface->init(&vendor_callbacks, (unsigned char *)local_bdaddr);  
    \bluedroid\hci\include\bt_vendor_lib.h
    typedef struct {                             /* bt-vendor提供的3个接口 */
        /** Set to sizeof(bt_vndor_interface_t) */
    size_t          size;
    
        /**
         * Caller will open the interface and pass in the callback routines
         * to the implemenation of this interface.
         */
        int   (*init)(const bt_vendor_callbacks_t* p_cb, unsigned char *local_bdaddr);
    
        /**  Vendor specific operations */
        int (*op)(bt_vendor_opcode_t opcode, void *param);
    
        /** Closes the interface */
        void  (*cleanup)(void);
    } bt_vendor_interface_t;
    \bluedroid\hci\src\vendor.c
    static const bt_vendor_callbacks_t vendor_callbacks = {    /* hci传递给bt-vendor的回调结构体 */
      sizeof(vendor_callbacks),
      firmware_config_cb,
      sco_config_cb,
      low_power_mode_cb,
      sco_audiostate_cb,
      buffer_alloc,
      buffer_free,
      transmit_cb,
      epilog_cb
    };
    
    Bt-vendor库中,init和cleanup函数只是做开始时初始化及退出时清理的工作,主要工作都在op函数中实现。
    \modules\rtl8723bs\libbt\src\bt_vendor_rtk.c
    static int op(bt_vendor_opcode_t opcode, void *param)
    {
        switch(opcode)
        {
            case BT_VND_OP_POWER_CTRL:
                ……  /* 省略中间代码 */       /* 控制蓝牙模块的上掉电 */
                break;
            case BT_VND_OP_FW_CFG:
    /* uart接口蓝牙加载fw */ 
    /* usb接口蓝牙fw在驱动中加载,蓝牙上电时就自动加载,这里直接返回成功 */
                ……  /* 省略中间代码 */ 
                break;
            case BT_VND_OP_SCO_CFG:
                ……  /* 省略中间代码 */
                break;
            case BT_VND_OP_USERIAL_OPEN:
    /* 打开uart口,把打开的fd传回给hci层。无论是uart接口蓝牙,还是usb接口蓝牙(usb接口蓝牙在驱动层虚拟出一个uart口),对bt-vendor层都是打开一个串口,所以从bluedroid层看,与底层的数据收发就是对uart口的收发  */
                ……  /* 省略中间代码 */
                break;
            case BT_VND_OP_USERIAL_CLOSE:
                ……  /* 省略中间代码 */         /* 关闭uart口 */
                break;
            case BT_VND_OP_GET_LPM_IDLE_TIMEOUT:
                ……  /* 省略中间代码 */
                break;
            case BT_VND_OP_LPM_SET_MODE:
                ……  /* 省略中间代码 */
                break;
            case BT_VND_OP_LPM_WAKE_SET_STATE:
                ……  /* 省略中间代码 */
                break;
            case BT_VND_OP_EPILOG:            
    ……  /* 省略中间代码 */
                break;
        }
    \bluedroid\hci\src\userial.c
    bool userial_open(userial_port_t port) {
        /* hci层调用bt-vendor层打开uart口,返回uart口句柄,hci层对数据的收发就使用该句柄 */
    ……  /* 省略中间代码 */
    
        int num_ports = vendor_send_command(BT_VND_OP_USERIAL_OPEN, &fd_array);
    
        if (num_ports != 1) {
            ALOGE("%s opened wrong number of ports: got %d, expected 1.", __func__, num_ports);
            goto error;
        }
    
    

    userial_cb.fd = fd_array[0];

        2.2.2 Bluedroid中HCI与核心层接口

            HCI层与bluedroid的核心层的交互接口,也是通过把接口封装在一个回调的结构体提供给核心层,同时核心层提供一个回调的结构体。





        2.3 Bluedroid的核心层

            Bluedroid的核心层负责蓝牙的管理,蓝牙协议的处理,状态的管理等,整个核心层的运行都是由事件驱动的,由上层发送的事件,底层处理结果的事件,底层接收数据的事件,加上定时器的超时事件,维护着整个核心层的正常运行。

            2.3.1 Bluedroid核心层的启动

                Bluedroid的整体功能及运行,都是从enable Bluetooth开始,到disable Bluetooth结束。

    \bluedroid\btif\src\bluetooth.c
    static int init(bt_callbacks_t* callbacks )
    {
        …… /* 省略中间代码 */
        bt_utils_init();
    
        /* init btif */
        btif_init_bluetooth();
    
        return BT_STATUS_SUCCESS;
    }
    \bluedroid\btif\src\btif_core.c
    bt_status_t btif_init_bluetooth()
    {
        UINT8 status;
        btif_config_init();        /* 配置初始化 */
        bte_main_boot_entry();   /* Entry point for BTE chip/stack initialization */
    
        /* As part of the init, fetch the local BD ADDR */
        memset(&btif_local_bd_addr, 0, sizeof(bt_bdaddr_t));
        btif_fetch_local_bdaddr(&btif_local_bd_addr);
    
        /* start btif task */
        status = GKI_create_task(btif_task, BTIF_TASK, BTIF_TASK_STR,
                    (UINT16 *) ((UINT8 *)btif_task_stack + BTIF_TASK_STACK_SIZE),
                    sizeof(btif_task_stack));
    
        if (status != GKI_SUCCESS)
            return BT_STATUS_FAIL;
    
        return BT_STATUS_SUCCESS;
    }
    \bluedroid\btif\src\bluetooth.c
    static int enable( void ) 
    {
        ALOGI("enable");
    
        /* sanity check */
        if (interface_ready() == FALSE)
            return BT_STATUS_NOT_READY;
    
        return btif_enable_bluetooth();
    }
    \bluedroid\btif\src\btif_core.c
    bt_status_t btif_enable_bluetooth(void)
    {
        …… /* 省略中间代码 */
        /* Create the GKI tasks and run them */
        bte_main_enable();
    
        return BT_STATUS_SUCCESS;
    }
    \bluedroid\main\bte_main.c
    void bte_main_enable()
    {
        APPL_TRACE_DEBUG("%s", __FUNCTION__);
    
        /* Initialize BTE control block */
        BTE_Init();
    
        lpm_enabled = FALSE;
    
        GKI_create_task((TASKPTR)btu_task, BTU_TASK, BTE_BTU_TASK_STR,
                        (UINT16 *) ((UINT8 *)bte_btu_stack + BTE_BTU_STACK_SIZE),
                        sizeof(bte_btu_stack));
    
        bte_hci_enable();   /* 初始化hci层接口,上一节内容 */
    
        GKI_run();
    }
    \bluedroid\stack\btu\btu_task.c
    BTU_API UINT32 btu_task (UINT32 param)          /* 初始化工作及进行消息处理 */
    {
        …… /* 省略中间代码 */
        /* Initialize the mandatory core stack control blocks
           (BTU, BTM, L2CAP, and SDP)
         */
        btu_init_core();
    
        /* Initialize any optional stack components */
        BTE_InitStack();
    
    #if (defined(BTU_BTA_INCLUDED) && BTU_BTA_INCLUDED == TRUE)
        bta_sys_init();
    #endif
    
        /* Initialise platform trace levels at this point as BTE_InitStack() and bta_sys_init()
         * reset the control blocks and preset the trace level with XXX_INITIAL_TRACE_LEVEL
         */
    #if ( BT_USE_TRACES==TRUE )
        BTE_InitTraceLevels();
    #endif
    
        /* Send a startup evt message to BTIF_TASK to kickstart the init procedure */
        GKI_send_event(BTIF_TASK, BT_EVT_TRIGGER_STACK_INIT);
    
        prctl(PR_SET_NAME, (unsigned long)"BTU TASK", 0, 0, 0);
    
        raise_priority_a2dp(TASK_HIGH_BTU);
    
        /* Wait for, and process, events */
        for (;;)
    \bluedroid\btif\src\btif_core.c
    void btif_enable_bluetooth_evt(tBTA_STATUS status, BD_ADDR local_bd)  
    {   /* Bluetooth enable完成时收到事件,会调用该函数 */
        …… /* 省略中间代码 */
        bte_main_postload_cfg();
    #if (defined(HCILP_INCLUDED) && HCILP_INCLUDED == TRUE)
        bte_main_enable_lpm(TRUE);
    #endif
        /* add passing up bd address as well ? */
    
        /* callback to HAL */
        if (status == BTA_SUCCESS)
        {
            /* initialize a2dp service */
            btif_av_init();
    
            /* init rfcomm & l2cap api */
            btif_sock_init();
    
            /* init pan */
            btif_pan_init();
    
            /* load did configuration */
            bte_load_did_conf(BTE_DID_CONF_FILE);
    \bluedroid\btif\src\btif_av.c
    bt_status_t btif_av_init()
    {
        if (btif_av_cb.sm_handle == NULL)
        {
            if (btif_a2dp_start_media_task() != GKI_SUCCESS)
                return BT_STATUS_FAIL;
    
            btif_enable_service(BTA_A2DP_SERVICE_ID);
    
            /* Also initialize the AV state machine */
            btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE);
    
            btif_a2dp_on_init();
    \bluedroid\btif\src\btif_media_task.c
    int btif_a2dp_start_media_task(void)
    {
        …… /* 省略中间代码 */
        /* start a2dp media task */
        retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK,
                    A2DP_MEDIA_TASK_TASK_STR,
                    (UINT16 *) ((UINT8 *)a2dp_media_task_stack + A2DP_MEDIA_TASK_STACK_SIZE),
                    sizeof(a2dp_media_task_stack));

    前面说到整个蓝牙核心层由事件驱动,所有事件的处理全部由3个task来完成。

    btu_task:处理发送给上层的事件,定时超时事件,部分上层发送下来的事件,同时也会把部分事件转给btif_task处理;

    btif_task:主要用于蓝牙协议的处理,处理协议状态的流转,根据不同状态调用不同的处理函数;

    btif_media_task:用于a2dp的控制及音频处理;

            2.3.2 Bluedroid核心层部分profile的流程

            对于a2dp的流程,只给出概要框图,如下图所示。

            


        对于opp文件传输,在bluedroid层就是使用rfcomm协议,rfcomm协议实质就是再两个蓝牙设备之间提供一个逻辑的数据通道,上层只需要使用rfcomm提供的链路就可以在两个设备之间传输数据。Opp文件传输过程中,先是两个设备进行连接,然后建立一条rfcomm通道,同事创建rfcomm与上层传输数据的Socket,后面就可以进行数据传输,设备的连接、rfcomm通道的建立。

        对于蓝牙鼠标、蓝牙键盘这些输入设备,使用的是hid(human interface Device)profile,建立连接后,注册一个uhid(dev_path="/dev/uhid")设备,把输入设备发送过来的数据发送给uhid设备,由内核的hid驱动负责进行输入事件的处理,下面给出一个输入数据的流程图。

    3.Bluetooth应用程序介绍(Bluetooth.apk)

        Bluetooth应用程序的主要功能是负责蓝牙状态的管理,连接Bluedroid,提供各种蓝牙服务。其中btservice提供蓝牙的基本服务,各个profile提供自身独立的服务,除了opp和pabp自成一体外,其它的profile由btservice管理。

        3.1 Bluetooth应用程序框图及对外接口



        3.2 Bluetooth应用程序与bluedroid的接口

            Bluetooth App 与bluedroid通过jni接口交互,bluetooth app 在开始时加载bluedroid库(bluetooth.default.so),使用bluedroid提供的操作接口,同时在调用bluedroid接口提供的init函数时,传递回调结构体给bluedroid.

    packages\apps\bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
    jint JNI_OnLoad(JavaVM *jvm, void *reserved) 
    {
        …… /* 省略中间代码 */
        if ((status = android::register_com_android_bluetooth_btservice_AdapterService(e)) < 0) {
            ALOGE("jni adapter service registration failure, status: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_hfp(e)) < 0) {
            ALOGE("jni hfp registration failure, status: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_hfpclient(e)) < 0) {
            ALOGE("jni hfp client registration failure, status: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_a2dp(e)) < 0) {
            ALOGE("jni a2dp source registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_a2dp_sink(e)) < 0) {
            ALOGE("jni a2dp sink registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_avrcp(e)) < 0) {
            ALOGE("jni avrcp target registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_avrcp_controller(e)) < 0) {
            ALOGE("jni avrcp controller registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_hid(e)) < 0) {
            ALOGE("jni hid registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_hdp(e)) < 0) {
            ALOGE("jni hdp registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_pan(e)) < 0) {
            ALOGE("jni pan registration failure: %d", status);
            return JNI_ERR;
        }
        if ((status = android::register_com_android_bluetooth_gatt(e)) < 0) {
            ALOGE("jni gatt registration failure: %d", status);
            return JNI_ERR;
        }
    packages\apps\bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
    static JNINativeMethod sMethods[] = {        /* 各个Native接口 */
        /* name, signature, funcPtr */
        {"classInitNative", "()V", (void *) classInitNative},
        {"initNative", "()Z", (void *) initNative},
        {"cleanupNative", "()V", (void*) cleanupNative},
        {"enableNative", "()Z",  (void*) enableNative},
        {"disableNative", "()Z",  (void*) disableNative},
        {"getRecvByteNative", "()I",  (void*) getRecvByteNative},
        {"getSendByteNative", "()I",  (void*) getSendByteNative},
        {"setAdapterPropertyNative", "(I[B)Z", (void*) setAdapterPropertyNative},
        {"getAdapterPropertiesNative", "()Z", (void*) getAdapterPropertiesNative},
        {"getAdapterPropertyNative", "(I)Z", (void*) getAdapterPropertyNative},
        {"getDevicePropertyNative", "([BI)Z", (void*) getDevicePropertyNative},
        {"setDevicePropertyNative", "([BI[B)Z", (void*) setDevicePropertyNative},
        {"startDiscoveryNative", "()Z", (void*) startDiscoveryNative},
        {"cancelDiscoveryNative", "()Z", (void*) cancelDiscoveryNative},
        {"createBondNative", "([BI)Z", (void*) createBondNative},
        {"removeBondNative", "([B)Z", (void*) removeBondNative},
        {"cancelBondNative", "([B)Z", (void*) cancelBondNative},
        {"getConnectionStateNative", "([B)I", (void*) getConnectionStateNative},
        {"pinReplyNative", "([BZI[B)Z", (void*) pinReplyNative},
        {"sspReplyNative", "([BIZI)Z", (void*) sspReplyNative},
        {"getRemoteServicesNative", "([B)Z", (void*) getRemoteServicesNative},
        {"getRemoteMasInstancesNative", "([B)Z", (void*) getRemoteMasInstancesNative},
        {"connectSocketNative", "([BI[BII)I", (void*) connectSocketNative},
        {"createSocketChannelNative", "(ILjava/lang/String;[BII)I",
         (void*) createSocketChannelNative},
        {"configHciSnoopLogNative", "(Z)Z", (void*) configHciSnoopLogNative},
        {"alarmFiredNative", "()V", (void *) alarmFiredNative},
        {"readEnergyInfo", "()I", (void*) readEnergyInfo},
    };
    
    int register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env)
    {
        return jniRegisterNativeMethods(env, "com/android/bluetooth/btservice/AdapterService",
                                        sMethods, NELEM(sMethods));
    }
    packages\apps\bluetooth\jni\com_android_bluetooth_btservice_AdapterService.cpp
    static bool initNative(JNIEnv* env, jobject obj) {
        ALOGV("%s:",__FUNCTION__);
    
        sJniAdapterServiceObj = env->NewGlobalRef(obj);
        sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField));
    
        if (sBluetoothInterface) {
            int ret = sBluetoothInterface->init(&sBluetoothCallbacks);    /* 传递给bluedroid的回调接口 */

        3.3 Bluetooth的状态图

        整个bluetooth存在多个状态机,除了有维护蓝牙开关的状态机及设备对状态,还有部分profile使用状态机维护设备的连接状态。



        注:1.两台机器配对,配对完成后,处于已配对状态,但还不是连接的状态,当需要传输文件时,才建立连接,文件传输完成后,连接会断开。

                2.当机器与蓝牙耳机或蓝牙输入设备(蓝牙鼠标、键盘)配对时,配对完成后,马上会建立连接,这是由于蓝牙耳机或输入设备随时有数据传输。





    4.Bluetooth framework层介绍

        Bluetooth framework层的作用只要是连接Bluetooth service,为其它应用提供使用蓝牙的接口,起连接上下层的所用。


    今天就到这,接下来会对相关知识点进行补充

    借鉴自:https://blog.csdn.net/zjli321/article/category/6348822

    展开全文
  • -------------------------------------------------------------------------------------------------------- 文章版权归为微信公众号 无线技术联盟,转载请注明出处. 作者:XCODER --------------------------...
  • BlueTooth

    2019-06-18 21:09:47
    BlueToothBlueToothactivity适配器效果图 BlueTooth //xml布局 <Button android:id="@+id/start" android:layout_width="match_parent" android:layout_height="wrap_content" android:...
  • 从Android 4.2开始,Bluetooth stack发生了重大改变:从Bluez换成了由Google和Broadcom联合开发的Bluedroid(当然,核心的部分还是Broadcom的,Google主要是做了和上层Framework相关的部分)。通过...
  • Linux下Bluetooth的使用

    千次阅读 2014-06-20 21:43:02
    Linux内核有对Bluetooth的支持,核心代码位于net/bluetooth目录下,驱动部分则位于drivers/bluetooth,而bluez则是用户空间工具 1. 激活设备 首先要有一个蓝牙适配器,这个不用说,一般都是USB接口类型。 ...
  • Android Bluetooth Stack: Bluedroid(四):Scan remote devices

    万次阅读 热门讨论 2014-06-10 13:58:45
    Enable Bluetooth之后就可以扫描周围的其他discoverable mode的Bluetooth Device。以下简单分析以下Bluetooth BR/EDR设备的扫描过程,然后会谈一下Android 4.2引入的Bluetooth HAL。  启动scan的调用过程很简单,...
  • 电脑怎么查看蓝牙版本

    万次阅读 2019-04-17 10:42:05
    给自己笔记本换了网卡,不知道怎么验证蓝牙版本...Bluetooth Version finder https://www.sordum.org/10772/bluetooth-version-finder-v1-0/ 不过也是可以手动查看的 Check Bluetooth Version manually We ...
  • 摘要:Android 中打开和关闭 Bluetooth 的代码虽然并不困难,但是我们还是需要注意一些细节和异常情况,这样我们才能更好的优化我们的与 Bluetooth 相关的应用。 Runtime Environment OS:
  • 一 Bluetooth 的设置应用  packages\apps\Settings\src\com\android\settings\bluetooth\*  蓝牙设置应用及设置参数,蓝牙状态,蓝牙设备等。   二 Bluetooth 的服务应用  packages\apps\Bluetooth\src\...
  • 以下是基于Android 4.2代码,对Bluetooth BR/EDR Enable process的分析。BluetoothAdapter类代表的是local device Bluetooth adapter,而BluetoothDevice类代表的是remote Bluetooth device。在Android 4.3中引入了...
  • android 蓝牙权限问题

    千次阅读 2018-11-20 09:49:41
    Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.bluetooth.adapter.action.REQUEST_DISCOVERABLE flg=0x10000000 cmp=...
  • A2DP Sink, AVRCP Controller and HFP Client in Android L

    万次阅读 热门讨论 2015-08-25 14:45:11
    The APIs of A2DP sink and HFP client are not published in Android L, but the code which implements the profiles is indeed in Android L. You can set the configuration for the car to build the code.
  • Bluetooth AMP 难以实现

    千次阅读 2014-07-09 21:45:19
    由于AMP是基于bluetooth和Wifi之间的一个纯软件的概念,它需要xie
  • Need BLUETOOTH_PRIVILEGED permission

    千次阅读 2017-09-07 11:39:33
    app能在5.0以前的系统上正常运行,但是在5.0以及更高的版本就不行了,每次去设置通知的时候,会报:Need BLUETOOTH_PRIVILEGED permission: Neither user 10157 nor current process has android....
  • 问题现象:当使用手机的蓝牙和电脑连接时,在Windows7下的设备管理器可能会出现两个或三个bluetooth 外围设备是驱动有问题的这主要是没有驱动而产生的,这和蓝牙的驱动无关,有也只能找Nokia(我的手机是Nokia N70)...
  • 1、在此目录下 2、此处 添加: uses-permission android:name="android.permission....uses-permission android:name="android.permission.BLUETOOTH_ADMIN" /> 3、Build -> Make Poject 即可
1 2 3 4 5 ... 20
收藏数 51,864
精华内容 20,745
关键字:

bluetooth