从蓝牙specispecification中看,基带协议主要分为8个部分来介绍的,分别是概述、物理信道、物理连接、逻辑传输、逻辑连接、封包、比特流的处理、组网行为。这里面会涉及到很多的概念,主要是在概述中解释这些概念,下面分别来介绍上面的几个部分:

概述

首先,我们先看一下基带处于蓝牙的那一层:

其实现在蓝牙controller中,下面对接的直接是物理层的Radio,上面是controller端的和主机端的接口,以及链路管理模块。

我们这里注意到,上面涉及到了不少概念,我们来解释一下:

Device Manager:顾名思义,其是设备管理模块,我们想想作为一个蓝牙设备它有哪些方面需要管理?答案是该模块负责管理蓝牙设备的名字、link key ,以及一些行为比如扫描、配对、连接等行为。

Baseband resource manager:从名字上,他是负责协调基带资源的,这个也很好理解,蓝牙基带承载很多蓝牙链路,那么这些链路需要分时复用基带资源,Baseband resource manager就是来协调基带资源的。

Link controller:我们看到这个模块直接对接了底层的Radio了,其作用就是对于蓝牙原始封包的编码和解码。

1.1 蓝牙网络

蓝牙的网络结构如上,一般情况下,我们用的最多的是上面的a图所示情况,比如一个手机连接一个耳机进行听音乐。b图的情况虽然不是很多,但是随着蓝牙的普及,还是有很多场景的,比如一台电脑,通过蓝牙连接键盘和鼠标,甚至还可以连接一个蓝牙耳机听音乐。c图的情况目前使用的确不多,这里是组成了一个scatternet,一个master 同时是另外一个网络的slave。

1.2 蓝牙地址

蓝牙地址由两部分组成,高24bit是 company id,低24bit是 公司内部分配的,其中0X9E8B00~0X9E8B3F  是保留的,0X9E8B33是general inquiry 的access code,0X9E8B00 是Limited Dedicated inquiry access code。

我们看看空气包中 inquiry的access code 的确是0x9E8B33:

1.3 access code

那么这个access code 到底是什么呢?其实他就是为了识别某个特定的物理channel 而存在,我们可以把他翻译成接入码,相当于接入信道的通行证,这个物理上面的概念,并非逻辑上面的。

那么这个接入码是由什么组成的呢?它来自于设备的地址的LAP部分,或者是专有的inquiry 地址,这里专有的inquiry地址就是上面讲到的0x9E8B33 ,这个很好理解,因为inquiry 信道的接入码必须是固定的,不能随着设备而改变的,否则他就无法搜索到别的设备。接入码也分为几类:Device access code(DAC)、Channel access code(CAC)、Inquiry access code(IAC),

刚刚已经讲过,IAC不应该是随着设备而改变的,DAC是设备的接入码,他主要使用在page 、page scan 以及page response 的子流程中,它来自于被paged的设备的地址。CAC也很好理解,当两个设备配对之后,那么就会使用CAC 作为信道的接入码来通信,他来自于主设备(master)

1.4 bluetooth clock

设备之前的通信都会有时钟进行同步,蓝牙的时钟是一个28bit的计数器,时钟频率是3.2kHZ,也就是计数器每变化一下就是312.5us,

时钟这里还有几个概念,CLKN、CLKE、CLK

CLKN是本地时钟,它没有指明是master 还是slave,他只是指 设备的本地时钟。

CLKE是预计的对方的时钟,我们看上图,是pager 的本地时钟加上一个预估的offset ,得到了一个对于对方的时钟的一个预估。

CLK:一般就是指master的时钟。主设备的本地时钟就是CLK,从设备的时钟会和主设备的时钟有个offset的差距。

1.5 工作频段

蓝牙工作的频段是2400 – 2483.5 MHz.

物理信道

物理信道是蓝牙通信架构的最底层,当两个设备进行的通信的时候,共享一个物理信道。我们上面讲过了接入码的概念,他是和信道是对应的。总共有五种物理信道:

  1. Basic piconet channel
  2. Adapted piconet channel
  3. Inquiry scan channel
  4. Page scan channel
  5. Synchronization scan physical channel

1.2 都是用于两个设备之前的通信,他们之间的区别是,第二个信道中从设备使用的频点和主设备是一样的,并且他并不会使用全部的79个频点,如果他检测到一些频点受到的干扰比较重,就不会去使用,那么其抗干扰能力肯定会更强一点。

目前市面上蓝牙设备基本都支持Adapted piconet channel,3,4,5用途也很明显,分别是inquiry scan的信道,page scan的信道,以及同步的信道。设备在某个信道上通信的时候,是会不断地跳变频点的,在1、2、5信道上跳变频率是1600hops/s,在3,4 上面是3200hops/s  ,这里我们发现3,4 信道上明显跳变很快,这个很好理解,因为他们处于未连接状态,需要一个快速跳变的频率以完成扫描 配对等动作。

我们简单看下在page scan 信道上面的通信时序:

我们可以看出:

  1. 经过312.5us 之后其page频点变化,也就是3200hops/s
  2. 当slave 收到mster的page信息之后,会过固定时间625us 去 回复这个封包。
  3. slave 在回复了master 的page 封包之后,过312.5us 之后去监听 master 发过来的FHS 包。

inquiry scan的时序图如下:

  1. 经过312.5us 之后其inquiry频点变化,也就是3200hops/s
  2. slave 在收到inquiry消息之后625us之后发送FHS 给对方
  3. 如果还有EIR data 需求传输,那么将在 1250us 之后。

相应的air log 如下:

上面两个例子,我截图的图片都是在一个slot中的靠近开始的地方成功接收到对方的封包的情况,另外一种情况也是类似的,这里不作具体分析。

Physical link

他代表两个设备之间基带层建立的连接,他是基于物理信道之上的概念,两个设备建立连接往往只有一条物理链路,因而每个物理信道上往往只有一条物理link。

Logical Transports

逻辑传输层是基于物理链路层的。specification总共定义了5种(core_v5.0)逻辑链路:

  1. Synchronous Connection-Oriented (SCO) logical transport
  2. Extended Synchronous Connection-Oriented (eSCO) logical transport
  3. Asynchronous Connection-Oriented (ACL) logical transport
  4. Active Slave Broadcast (ASB) logical transport
  5. Connectionless Slave Broadcast (CSB) logical transport.

1、2  是用于传输同步数据的点对点通道,他们对于时间有严格的限制,并且master会通过预留slot的方法来达到同步传输的效果。其中1和2的区别在于2有重传的机制

3也是用于两个设备的点对点的传输,但是其一般传输对时间没有严格要求的数据,属于异步传输。

4和5 是mater 通过广播的方式和各个slave 进行通信。

Logical Links

逻辑链路分为6种:

  1. Link Control (LC)
  2. ACL Control (ACL-C )
  3. User Asynchronous/Isochronous (ACL-U)
  4. User Synchronous (SCO-S)
  5. User Extended Synchronous (eSCO-S)
  6. Profile Broadcast Data (PBD)

LC和ACL-C用于链路控制层(Link Control Level )和链路管理层(Link Manager Level) ,其中LC 存在于packet的header里面,而其他存在payload里面。

ACL-U用于传输用户异步信息 
SCO-S/eSCO-S用于承载用户同步信息 
PBD用于承载Profile广播数据

ACL-C/ACL-U通过Payload Header的Logical Link ID(LLID)来指示

SCO-S/eSCO-s只由Synchronous Logical Transports承载 
ACL-U通常由ACL Logical Transport承载,也可由SCO Logical Transport的DV Packet的Data承载 
ACL-C可由SCO/ACL Logical Transport承载 
PBD由CSB Logical Transport承载

packet

关于packet 部分,我们分为Basic Rate和Enhanced Data Rate

其格式分别如下:

其中access code 我们之前提到过这个概念,他来源于蓝牙设备地址的LAP或者是专门的inquiry address。其由68或者72bit组成,enchanced rate 比Basic 格式的数据多了 SYNC以及TRAILER

6.1access code

access code 的格式如下:

  

其尾部的4个bit根据access code 是否接有header 来决定,其后面有header 的时候,才会有尾部的4个bit 存在。

6.2 header

其格式如下:

包含LC的Header有6个字段,18 bits

• LT_ADDR: 3-bit logical transport address
• TYPE: 4-bit type code
• FLOW: 1-bit flow control
• ARQN: 1-bit acknowledge indication
• SEQN: 1-bit sequence number
• HEC: 8-bit header error check

6.2.1 LT_ADDR

Logical Transport Address(LT_ADDR) 
用来标识在Master-to-Slave中的目的Slave或Slave-to-Master中的源Slave

每个Active Slave都有一个主要的3-bit LT_ADDR 
全零的LT_ADDR用于ASB/PSB广播消息, CSB使用单个非零LT_ADDR 
Master没有LT_ADDR,使用Timing Relative来区分Slaves 
对于eSCO传输方式,每个Slave都有一个次要的LT_ADDR 
Slave只接收匹配主要/次要的LT_ADDR的数据包和广播数据包

6.2.2 Type

区分六种不同的Packet

主要有三种功能 
- 决定使用的Logical Transport(SCO/eSCO,ACL,CSB) 
- 是否使能Enhanced Data Rate 
- 标识Packet类型(SCO/eSCO,ACL)

6.2.3 Flow

在ACL Logical Transport中用来进行流控 
其对应值含义为 
- 0: STOP indication 
- 1: GO indication

6.2.4 ARQN

Automatic Repeat reQuest Number 
确认指示位,指示数据源是否成功地传输了带有CRC的Payload数据

6.2.5 SEQN

Sequence Number 
用来保证数据流有序的传输

6.2.6 HEC

Header Error Check 
用于检测Header的完整性

这里需要注意的一点是,流控针对的数据包,不会对POLL以及NULL包产生影响。

6.3 Payload format

其格式区分了basic和enchanced 两种模式,分别如下:

其主要区别是 EDR 模式的数据包的length 用了10个bit来表示数据从长度。

LLID 的字段的定义如下:

这里需要注意的一点是,这里也有一个流控的标志,这里是针对l2cap的流控。

Link Controller Operation

最近的specification 规范已经拿掉了park state,那么现在只有两个主要的状态是 standby和connection状态,

另外其还有9个子状态:page, page scan, inquiry, inquiry scan,synchronization train, synchronization scan, master response, slave response, and inquiry response

这里主要提一下 关于page scan的两种模式

standard和interlaced,首先看一下相关的概念:

Page Scan Window: amount of time for the duration of the page scan.
Page Scan interval: amount of time between consecutive page scans.
standard: Page Scan interval > Page Scan Window > 11.25ms(18(16)slots)
interlaced: Page Scan interval > 2 * Page Scan Window
Every 1.28s a different freq is selected.

标志模式 page scan 如下:

在每个interval 里面只有一个scan window,并且每个interval期间,其scan 的频点是不变的。

interlaced模式如下图:

他在每个interval里面有两个scan window,所处的频点分别是trainA 和trainB,其条件就是interval要比两个 scan window 要大。

那么关于baseband的介绍就先到这里



蓝牙baseband概述的更多相关文章

  1. 蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)

    关键词:蓝牙核心技术协议  irDA BNEP  AVDTP AVCTP 作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢! )欢迎指正错误,共同学习.共同进步!! 下载链接:Bl ...

  2. 蓝牙(CoreBluetooth)-概述

    蓝牙(CoreBluetooth)-概述 通过此框架可以让你的Mac和iOS应用程序与外部蓝牙设备通信 外部设备: 就是需要通过iOS App控制器的其他设备: 例如:心率检测仪.数字温控器 蓝牙通讯 ...

  3. 蓝牙LMP概述

    LMP 全称是Link Manager Protocol,我们还是要一张图,说明LMP 在哪里? 他是在HCI 以下,baseband 以上,实现在蓝牙控制器中. 按照协议规范,我们分几个部分来分别介 ...

  4. 蓝牙核心技术概述(四):蓝牙协议规范(HCI、L2CAP、SDP、RFOCMM)(转载)

    一.主机控制接口协议  HCI 蓝牙主机-主机控模型 蓝牙软件协议栈堆的数据传输过程: 1.蓝牙控制器接口数据分组:指令分组.事件分组.数据分组(1).指令分组 如:Accpet Connection ...

  5. Qt 蓝牙部分翻译

    这是我第一次尝试翻译技术文档,自己英语太烂,一直不敢尝试,感谢生活,让我勇敢迈出这第一步. 大部分都是直译,如有不妥,还请制导. Qt Bluetooth The Bluetooth API prov ...

  6. [蓝牙嗅探-Ubertooth One] 千元开源蓝牙抓包 Ubertooth One 安装和使用

    目录 前言 1.编译 Ubertooth tools 1.1.准备工作 1.2.编译安装 libbtbb 1.3.编译安装 Ubertooth tools 1.4.Wireshark 插件 1.5.更 ...

  7. 【Bluetooth|蓝牙开发】二、蓝牙开发入门

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! [所有文章汇总] 1.蓝牙基础概念 蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电 ...

  8. 一、Stream,sink,source,transform

    1. 蓝牙核心概述 2.Stream,sink,source,transform 在ADK的blueCore里面,Stream作为一个逻辑结构用来描述一个数据终点(data Endpoint).通常, ...

  9. 《深入浅出Windows 10通用应用开发》

        <深入浅出Windows 10通用应用开发>采用Windows 10的SDK进行重新改版,整合了<深入浅出Windows Phone 8.1应用开发>和<深入解析 ...

随机推荐

  1. (网页)javascript该如何学习?怎么样才能学好?

    文章摘抄自强哥文章   很多刚刚涉足软件开发的差不多都是只懂得HTMLCSS不懂得javascript,所以就想学习js,于是就从网上搜各种视频,或者买各种书籍回来看,很多时候都是浪费时间,因为根本看 ...

  2. 学习使用TestNG进行数据驱动测试

    转自: https://mp.weixin.qq.com/s/8Bd8LEhiC2pu2VMcyNMGlQ 学习使用TestNG进行数据驱动测试 赵吃饭 51Testing软件测试网 前天   学习使 ...

  3. Python实例---模拟微信网页登录(day3)

    第四步: 扫码成功后获取最近联系人信息---day3代码 settings.py """ Django settings for weixin project. Gene ...

  4. 4.9Python数据类型(5)列表(新版)

    前言 列表是一种python类似数组的数据结构,操作灵活,可存储多种类型的数据. 目录 1.列表的基础知识 2.列表的增删改查并操作 3.列表的其他操作 4.基本方法表 (一)列表的基础知识 1.说明 ...

  5. January 14th, 2018 Week 02nd Sunday

    Embrace your life, for we only live once. 拥抱你的生活,因为我们只能活一次. We just live once, so I would rather liv ...

  6. NDK/JNI学习--环境搭建

    基于Windows来开发Android的NDK.JNI须要的环境搭建,所须要的软件例如以下: Android 开发环境的基本配置(SDk,ADT.Eclipse IDE.JDK)       这些都是 ...

  7. centos7下安装docker(9容器对资源的使用限制-内存)

                  一个docker Host上面会运行若干容器,每个容器都需要CPU,内存和IO资源.容器提供了控制分配多少CPU,内存给每个容器的机制,避免摸个容器因占用太多资源而影响其他 ...

  8. ansible-role写法

    一.role目录的创建: cd /etc/ansible/ mkdir -pv roles/{websrvs,dbsrvs}/{tasks,files,templates,meta,handlers, ...

  9. 30个你 “ 不可能全部会做 ” 的javascript题目

    1,以下表达式的运行结果是: ["1","2","3"].map(parseInt) A.["1","2&qu ...

  10. Ros使用Arduino 1安装Arduino IDE

    安装Arsuino IDE sudo apt-get install arduino 设置库文件路径 在使用ROS的库文件时,必须在代码的开头包括: #include <ros.h> 接下 ...