[蓝牙]蓝牙技术学习笔记

一、蓝牙技术专业术语

名词 解释
SCO 面向连接的同步链路(支持数据、语音传送,可同时传送)
ACL 面向无连接的异步链路(支持对称和非对称两种帧格式)
CVSD 连续可变斜率增量调制(一种语音编码方式,语音编码方式由用户选择,可选择PCM和CVSD)
ISM频段 工科医频段(全球通用的公用频段,包括902928MHz和2.4GHz2.484GHz),蓝牙技术使用2.4GHz
EDR Enhanced Data Rate,增强数据传输速率(蓝牙2.0之后)
BER Bit Error Rate,比特误差率

(参考文章:
《关于蓝牙开发,你必须知道的知识》:https://blog.csdn.net/andrewniu/article/details/80857814
《蓝牙核心技术了解(蓝牙协议、架构、硬件和软件笔记)》:https://www.cnblogs.com/shaobojiao/p/7883330.html )

二、蓝牙中的关键技术

1.跳频技术

蓝牙、ZigBee、WiFi都使用2.4GHz频段,包括日常使用的微波炉,也工作在此频段。为减少其他设备的干扰,使用跳频技术把频带分成若干个跳频信道,在一次连接中,收/发设备按照一定的(相同的)伪随机序列快速从一个信道跳到下一个信道,只有收/发双方按照这个规律通信,其他干扰不会按照同样的规律变频。跳频的瞬时带宽很窄,通过扩展频谱技术可使窄频带扩展成宽频带。
(参考文章:
《无线通信设计秘密一:跳频技术》:https://blog.csdn.net/ppdyhappy/article/details/79483653
《2.4g无线跳频(三)》:https://blog.csdn.net/wangzibigan/article/details/77510187)

2.流加密技术

无线信号很容易被截取。蓝牙协议提供了认证和加密,以实现链路级安全。蓝牙系统的认证和加密技术由物理层提供,硬件实现,**由高层软件管理。安全机制尽量在应用层实现。

三、蓝牙中的网络特性

蓝牙技术是点对多点的技术。蓝牙组网最多支持256台设备,形成微微网,其中每个时刻只能有1个主节点和最多7个从节点处于工作状态,其他节点处于待机状态(Stand-By状态)。

四、无线通信技术基础

1.模拟信号的调制方式

调幅(AM)、调频(FM)、调相(PM)
其工作原理是将低频源信号附加在高频的载波信号上,高频载波信号的幅值、相位、相位的状态包含着低频源信号的信息。

2.数字信号的调制方式

名称 解释
幅移键控(ASK) 两个不同的振幅表示二进制0和1,同时频率和相位不变。(噪声通常只影响幅值)
频移键控(FSK) 用载波频率和其附近的的一个频率(差分频率)的加减来表示二进制0和1。(包括二元频移键控和多元频移键控,二元频移键控只能表示二进制0和1,即1位;多元频移键控可表示多个二进制位。频移键控:每一个不同的频率表示不同二进制数或序列,这个频率是根据源信号控制载波频率变化表示的)
相移键控(PSK) 新发送的信号脉冲起始相位与前一个信号起始信号相同表示二进制0,不同表示二进制1,二进制的值与绝对相位无关(差分相移键控DPSK)(抗噪能力相比最强,频带利用率最高)
高斯频移键控(GFSK) 蓝牙当中使用的强制方式(一种简单的二元调制方案)

(参考文章:
《详解蓝牙标准中的GFSK调制》:https://blog.csdn.net/lovehua365/article/details/78945817 )

3.扩频通信原理

s = 信道带宽/信息带宽 = 通信系统占有带宽/原始信号带宽
s = 1或2 窄带通信
s > 50 宽带通信
s > 100 扩频通信

在实现信息传输之前,发送固定得伪随机(PN)码来同步传/接双方(这里在传输时会被干扰,需要此条信息具有很高得辨识度,能够被接收机大概率得识别出来)。
同步之后传输信息。信息先调制(模拟信号使用FM方式,数字信号采用PSK或FSK方式),调制后得信号一般为窄带信号,后接扩频设备扩展其频谱。
扩频比窄带抗干扰是因为:带宽越宽,干扰信号需要在更宽得频带范围上释放,分散了干扰功率。

4.数据交换技术

电路交换:独占通信通路
分组交换:"存储-转发"方式,多人共享通信通路(类似TCP/IP协议中网络层对传输层数据得分帧组包)

五、蓝牙无线规范

三种功率等级(等级1:100mW,等级2:2.5mW,等级3:1mW)
目前常见蓝牙功率等级为3,传输距离为10m,数据速率为1Mb/s,最小频偏不小于115kHz(频偏为相对载波中心频率fc的频率偏移,偏移量为fd,二进制1为正频偏,0为负频偏)
蓝牙处于连接状态时,可以处于保持状态(收发机既不发送,也不接收)。返回到正常操作时,蓝牙在退出保持状态后、发送信息前必须侦听主单元。
可以通过蓝牙链路控制命令,或者链路控制器内部信号控制链路控制器的状态。
查询周围的蓝牙设备时,可指定查询方式(GIAC:查询所有设备,DIAC:查询特定类型设备)
寻呼过程来建立连接,只能通过蓝牙的设备地址才能建立连接。

1.inquiry 和 inquiry scan:查询状态和查询扫描状态

inquiry 是主机主动扫描
inquiry scan是从机处于被扫描状态(只有此状态的从机可回应inquiry状态的主机)
查询过程:查询设备每312.5us切换一次频率,接收设备每1.28s切换一次监听频率(接收设备在每个频率上最多会监听到4096次查询请求)
查询的时使用通用查询接入码(GIAC-LAP低28位,0x9E8B33,此地址不可作为蓝牙设备地址)作为查询地址,查询时的跳频序列通过蓝牙内部高精度时钟和查询地址计算的来,因此在查询之前,需要对时钟进行同步(广播方式),最终产生32个查询跳变序列,均匀分布在79个信道上。

2.page 和 page scan:寻呼状态和寻呼扫描状态

page是主机主动请求连接状态
page scan是从机等待连接状态(只有此状态的从机能回应page状态的主机)
(参考文章:
《蓝牙设备发现与同步(page and inquire过程详解)》:http://blog.chinaunix.net/uid-21411227-id-5715874.html )

查询之后若范围内存在蓝牙设备,查询的主设备会会获取被查询设备的查询相应(返回每个被查询设备的地址)。
寻呼过程:查询设备每312.5us切换一次频率,接收设备每1.28s切换一次监听频率(接收设备在每个频率上最多会监听到4096次查询请求,这一点与查询过程相同)
寻呼过程使用被寻呼设备的地址(BT_ADDR低28位),确定跳变序列过程与查询过程相同(寻呼过程寻呼设备与被寻呼设备的时钟是否已经同步,这一点不是很清楚!)。

连接状态:寻呼后从设备相应则进入连接状态,否则进入待机状态。
连接状态时使用的跳变序列为主设备的地址(一对多连接时,不同连接设备对间彼此不会占用同一信道),连接双方每隔625us切换一次频率(每秒 1600次)。
产生的跳变序列是一串周期很长的整数序列(可理解为随机序列),每对连接的设备从整数序列中依此截取32个跳变序列(不一定就是32),每一个跳变时段内,多个连接设备对间不会共用同一信道。具体的长周期跳变序列参考论文《一种新的超长周期蓝牙跳频序列的构造及性能分析,郭岩》。
注意,寻呼状态直接从待机状态切换而来。(主动让从机进入寻呼扫描状态/查询扫描状态,此时不用可以区分,看主机发送的报文中是GISA还是本机地址即可区分),主机主动进入寻呼状态,如果主机知道要连接的从机的地址(已配对),则主机直接切换到寻呼状态,发送寻呼,此时主机切换到主机寻呼响应状态,从机接收到寻呼后(因为主机寻呼的数据中包含从机的地址),从机进入从机寻呼响应状态,若从机给予回应,此回应返回主机。若从机再次发送回应,则从机进入连接状态,同时切换跳频序列参数为通过主机地址计算的(此之前的是通过“被”寻呼地址计算的),回应到达主机,主机进入连接状态,同时开始使用和从机同样的调频序列参数(这里保证永远从机先于主机进行跳频)。若上述任意过程产生错误或者不回应时,在延时机制下,回退到待机模式并产生错误报告。
若主机知道要连接的从机设备,不管其在不在自己的有效连接范围内,可直接进行寻呼(即主机的查询操作是可选的,非必需的)。
从机的查询扫描状态/寻呼扫描状态是从机主动进入的,二者不进行特别区分,或者统称为扫描状态,根据主机的查询或者寻呼操作来确定具体是什么状态。无论主机/从机,其对应的响应状态都是在接收了对方的回应数据后进入的。

理解为什么从机在寻呼过程中在接收到主机的寻呼数据后,要返回两次,加上主机的主动寻呼,一共四次通信,这个参考TCP的三次握手,只不过最后一次从机回应是为了告诉主机修改跳频序列的参数!
[蓝牙]蓝牙技术学习笔记

五、蓝牙连接状态

进入连接状态后,主机首先发送一个poll轮询数据,验证从机是否已经切换到自己的信道频率上,若从机不响应,主/从设备再次进入寻呼/寻呼扫描状态。

模式 解释
**模式active 主设备时刻调整与从设备通信的数据,使其可以与自己同步。从设备监听主机数据,若数据包里的地址本机地址不匹配,则进入睡眠状态
呼吸模式sniff 从机进入呼吸模式后,从机只能监听,不能发送。进入呼吸模式之前,呼吸时隙间隔(主机只在特定时隙发送数据给该从机)需要协商
保持模式hold 主/从协商后,从机进入保持模式。此时保持连接,到达定时器定时时间后被唤醒(即处于保持模式的从机无法发送数据,但仍旧保持连接)保持期间对任何主机的数据都不响应(信道同步在唤醒之后进行)
休眠模式park 处于休眠模式的设备放弃活动地址,使用休眠地址(PM_ADDR,主机主动唤醒是使用)和请求接入地址(AR_ADDR,从机向主机请求使用)。处于休眠模式的设备周期的监听信道,调整时钟。休眠模式下的从机通过独立的信标信道向主机请求。通过休眠模式,一个主机可以连接255+7台设备,分时实现组网连接(同一时刻最多只能连接7台设备)

呼吸模式、保持模式、睡眠模式区别:呼吸模式增加从机收发周期,**模式是呼吸间隔为0的呼吸模式;保持模式是自动挂起,一定时间后被唤醒,期间不断开已建立的连接(为了减轻主机的通信负担);睡眠模式是长久挂机,只能通过请求来唤醒(唤请求可来自于主机或从机),睡眠期间断开连接,并进入park状态,唤醒后直接进入connect状态,实现快速连接。

处于这三个模式的从机不会主动发送数据,只会监听信道,实现时钟同步。
呼吸模式最主要的功能是:放慢通信的频率,不会在每个发送信道上都发送数据。
保持模式最主要的功能是:一对多连接时,减少主机的资源消耗。否则,7个从机从不同信道发送数据过来,主机的天线瞬间会接收到一组数据,主机只需要根据跳频序列切换接收频率轮询,便可接收到全部7个数据,但之后上传到主机应用层,需要串行传输,容易产生阻塞。通过保持模式,减少最终串行传输的数据量。
休眠模式最主要功能是:快速实现多连接,同时人为控制挂起和唤醒(保持模式是人为挂起,自动唤醒)。

为减低蓝牙功耗,有数据才发送,否则不发送。接收时先判断接入码(数据包中的地址信息),接入码匹配,则唤醒接收单元,否则进入呼吸模式(也可以说睡眠模式,等待下一次接收并判断接入码)。每次数据的分组头里会包含一些信息,指示后面还有多少数据包,会占用多少时隙等等。

功耗问题:呼吸<保持<休眠,因为休眠需要时刻监听主机的唤醒,保持需要定时器计时自动唤醒,而呼吸根据协商好的呼吸时隙自动唤醒。呼吸模式除了正常的监听和同步,不进行其他工作,休眠模式会额外的启动接收头识别唤醒命令。

若主机的某个发送时隙内,未对一个从设备进行发送操作,则该从设备进入休眠模式,当从设备在自身的发送时隙内想要发送,则需要发送请求接入命令,然后被唤醒,再进行数据发送。

五、蓝牙连接状态

蓝牙的跳频方案选择:
通过蓝牙地址的低28位和主机时钟(从机的时钟会与主机时钟同步),这24位地址为蓝牙地址(其中低24位LAP,为每个厂家蓝牙特有,高4位UAP位厂家编号的低4位,为厂家标识,固定),因此每个蓝牙地址是不重复的。
跳频方案是79个跳频点的升序排序,先偶频率点后奇频率点。蓝牙地址和主机时钟会生成一个选择序列(这个序列对79求模,在跳频序列中选择),跳频选择序列的周期是227,可均匀遍历79个跳频点。
下面图的理解:类似程序求3×4,你可以通过查九九乘法表,也可以直接求。所以跳频选择只是在一个长度为227的选择序列上挑选32个值,这32个值对79求模,在79个频点上选择,因此对于一个确定的地址和一个确定的时钟同步时刻,32跳频序列是固定的,且通信时只在这32个序列里循环。
(参考文章:
《介绍下蓝牙的几种跳频序列》:https://www.eefocus.com/majianhui/blog/09-12/182434_16fbb.html )
[蓝牙]蓝牙技术学习笔记

六、链路管理器协议

确定发送数据所使用的分组大小
管理蓝牙的功率模式和在微微网中的状态
处理链路和**的生成、交换和控制
LM层会对接收的有效载荷头部进行识别,确定发送方式(是否是L2CAP),LM层可过滤并解析数据,决定是否继续向高层转发。

其他参考文章(通信方面):
《蓝牙的应用中,什么是“单模”?什么是“双模”?》:https://zhidao.baidu.com/question/1900115612738386620.html
《白噪声粉红噪声的区别何在?》:http://www.szpa.com/yinxxt381.html
《频分多址、时分多址、码分多址》:https://blog.csdn.net/wynter_/article/details/78198843
《蓝牙地址的规则》:https://blog.csdn.net/sunrock/article/details/6577747
《基于时钟和地址的跳频序列的产生和性能分析》:https://wenku.baidu.com/view/155ebd3310661ed9ad51f373.html