赞
踩
包含经典蓝牙和ble
ble
经典蓝牙和ble
控制器层,host层,app
HCI层为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制
L层为RF控制器,控制设备处于准备(standby)、广播、监听/扫描(scan)、初始化、连接,这五种状态中一种。五种状态切换描述为:未连接时,设备广播信息,另外一个设备一直监听或按需扫描,两个设备连接初始化,设备连接上了。发起聊天的设备为主设备,接受聊天的设备为从设备,同一次聊天只能有一个意见领袖,即主设备和从设备不能切换。
物理层: RF规格
2.4G ISM band
GFSK调制
40个频道,2M频间隔
3个广播(37,38,39),37数据通道
由于BLE属于无线通信,则其通信介质是一定频率范围下的频带资源(Frequency Band);BLE的市场定位是个体和民用,因此使用免费的ISM频段(频率范围是2.400-2.4835 GHz);为了同时支持多个设备,将整个频带分为40份,每份的带宽为2MHz,称作RF Channel 。
主设备管理多个连接从设备,从设备只能连接一个主设备
做为一个BLE设备,有六种可能的状态:
– 待机状态(Standby):设备没有传输和发送数据,并
且没有连接到任何设备
– 广播状态(Advertiser):周期性广播状态
– 扫描状态(Scanner):主动地寻找正在广播的设备
– 发起连接状态(Initiator):主动向某个设备发起连接
– 主设备(Master):作为主设备连接到其他设备
– 从设备(Slave):作为从设备连接到其主设备
连接参数设置,设备命令设置,安全模式设置
角色:广播者,观察者,主设备,从设备
广播包的发送是单向的,不需要任何连接。
设备发送广播包进入广播状态
– 广播包可以包含特定的数据定义,最大31个字节
– 广播包可以直接指向某个特定的设备,也可以不指定
– 广播中可以声明是可被连接的设备,或者是不可连接的设备
在一个广播事件中,广播包会分别在三个广播通道中被发送一次 (37, 38, 39)
每次扫描设备打开Radio接收器去监听广播设备,称为一个扫描事件
扫描事件交替发生在三个特定的广播通道中: 37, 38, 39
扫描频宽比 (Duty-Cycle),关于扫描的两个
时间参数:
–扫描间隔:即扫描设备的扫描频度
–扫描窗口:每次扫描事件持续的时间
BLE发起连接
除了扫描,设备也可以主动发起连接,发起状态的设备和扫描状态的设备区别在于:当它监听到一个可连接的广播,发起设备就会发送一个连接请求,而扫描设备会发送一个扫描请求。
连接请求包括一套为从设备准备的连接参数,安排连接期间发生的通道和时间。如果广播设备接收了连接,两个设备会进入连接状态,发起方会称为 Master(主机) ,而广播方会称为 Slave(从机)。
BLE连接参数
通道映射,指示连接使用的频道。
调频增量,一个5~16 之间的随机,参与通道选择的算法。
连接间隔,1.25ms的倍数,在7.5ms~4s之间。
监督超时,10ms 的倍数,100ms~32s 之间, 必须大于 (1+slaveLatency)*ConnInterval
从机潜伏,0~499之间,不能超过(SupervisionTimeout/connInterval)-1
所有的通信都发生在两个设备的连接事件期间,连接事件周期的发生,按照连接参数指定的间隔联系,每个事件发生在某个数据通道(0~36),调频增量参数决定了下次连接时间发生的通道,在每个连接时间期间,Master 先发送,Slave会在 150us之后做出回应,即使一个连接事件发生(或两者),双方都没有数据发送(例外情况是从设备潜伏使能),这允许两个设备都承认对方仍然存在并保持活跃的连接。
Slave如果没有数据发送,允许跳过连接时间。连接参数中的 Slave 的潜伏值,是允许设备跳过的最大连接次数,在连接事件中,如果 slave 没有对master 的包做出回应,master将会在后来的连接时间中重复发送,直到 slave 回应。两个有效的连接事件之间的最大时间跨度(假设 slave 跳过了最大数目的连接时间)称为“有效连接间隔”,从设备的潜伏范围是 0~499,但是有效的连接间隔必须小于 32s。
连接参数的
设定
短间隔的连接事件:
-两设备都会以高能耗运行
-高数据吞吐量
长间隔的连接事件:
低或者 0潜伏值:
高潜伏值:
安卓设备作主设备时,连接参数满足的要求见本篇博文第二节“连接参数介绍”中提到的内容。另外实际开发过程中发现安卓设备作主设备时存在一个问题,就是部分安卓设备连接BLE设备之后,只能进行一次连接参数的修改。
苹果系统设备作主设备时,连接参数更新的要求比较苛刻,如下:
Interval Max * (Slave Latency + 1) ≤ 2 seconds
Interval Min ≥ 20 ms
Interval Min + 20 ms ≤ Interval Max
Slave Latency ≤ 4
connSupervisionTimeout ≤ 6 seconds
Interval Max * (Slave Latency + 1) * 3 < connSupervisionTimeout
即:
最大连接间隔时间 *(从机延迟 + 1) ≤ 2s
最小连接间隔时间 ≥ 20 ms
最小连接间隔时间 + 20 ms ≤ 最大连接间隔时间
从机延迟 ≤ 4
超时时间 ≤ 6s
最大连接间隔时间 (从机延迟 + 1) 3 < 超时时间
这样算
ios最小20ms
最大400ms
从机延迟 4
超时时间6s
所以如果你的BLE从设备需要被IOS主设备连接,那你的BLE从设备的默认申请的连接参数一定要满足上述要求,并且连接过程中修改连接参数的时候也要满足上述要求。
####################################################################
**ATT(Attribute protocol)**协议是为了允许设备读写保存在Server上的数据值。每个存储值就是一个属性。
ATT定义了属性的内容,规定了访问属性的方法和权限。平时我们的BLE设备就是通过属性进行数据收发的。
ATT定义了两种角色:Client和Server。
Server:存储属性,接收Client的ATT请求,命令和确认。
Client:接收Server的应答,指示和通知。
GATT(Generic Attribute Profile) 是建立在ATT之上的。为传输数据建立通用操作和框架。
GATT也定义了两种角色: Server和Client。GATT Client也是一个ATT Client,GATT Server也是一个ATT Server,所以GATT角色不需要去专门绑定ATT角色。
Server:一般就是进行广播,被连接的设备。
Client:一般就是进行扫描,然后主动去连接的设备。
GATT还指定了GATT Server上包含的数据格式。由属性协议传输的属性被格式化为服务和特征。来看看下图:
上图定义了一些概念及它们之间的包含关系,这些概念还是很重要的,接下来我们来一一解释。
Service — 服务
简单理解就是提供某项服务或功能。比如心率,电池监测等都可以定义为一个服务。
系统可以有两种service:主要(primary)和次要(secondary)
primary: 提供设备的主要功能
secondary:提供设备的附加功能
Included services — 包含服务
类似于包含头文件,就是将其他共用的服务包含进来。
Characteristic — 特征
可以理解为服务中的某个特性,比如心率服务,就会有个心率值,心率值就可以定义为一个Characteristic 。
Properties — 属性
这里的属性和上面的Attribute不一样。这里的属性定义的是Read / Write / Notify / Indicate等,用于声明Characteristic是否可读可写等属性。
Value — 值
用来保存数值的。
Descriptor — 描述符
用于描述Characteristic,让用户更能理解该Characteristic的作用和如何使用。
通过上图,我们可以看出Service的数据结构定义。
UUID就是通用唯一标识符。上一篇我们提到的Service (服务),Characteristic (特征),Descriptor (描述符) 等都有自己的UUID。因为一个设备肯定会有很多个服务,一个服务中也会包含多个特征,一个特征也可以包含多个描述符。那怎么来区分它们呢? 所以就需要UUID来进行标识区分了。
蓝牙对UUID 格式定义都有三种: 16bit UUID、32bit UUID、128bit UUID。
16bit 和 32bit 的 UUID 与 128bit 的值之间转换关系:
128_bit_UUID = 16_bit_UUID * 2^96 + Bluetooth_Base_UUID
128_bit_UUID = 32_bit_UUID * 2^96 + Bluetooth_Base_UUID
其中 Bluetooth_Base_UUID 定义为 00000000-0000-1000-8000-00805F9B34FB
上面的计算公式太复杂,我们用下面的方式记比较简单。
若 16 bit UUID为xxxx,那么 128 bit UUID 为 0000xxxx-0000-1000-8000-00805F9B34FB
若 32 bit UUID为xxxxxxxx,那么 128 bit UUID 为 xxxxxxxx-0000-1000-8000-00805F9B34FB
蓝牙联盟已经将某些UUID分配给一些公司或服务使用了。可以参考下面官方链接。
当然了,即使被分配了,我们也可以使用,只是如果做成市场产品就要小心,可能会跟别人的冲突,出现不兼容等情况。
空口数据包就是在空中传输的数据包。它是最完整的数据包,一般只有抓包分析问题才会需要了解这些知识。
空口数据包有两种格式:
LE Uncoded PHY (1M和2M)
LE Coded PHY
一种有编码,一种没有编码的。
我们先只看看未编码的格式:
无论是广播数据包还是普通数据包,它们的空口数据包格式是一样的。区别在于Access-Address和PDU的内容不同。
Preamble
前导码用来同步接收端和发送端的,1M PHY使用1个字节, 2M PHY使用2个字节。前导码是0和1交替的固定顺序,前导码的第一个bit要和接入地址的最低位(小端)一样,所以前导码第一个bit是由接入地址决定的。
Access-Address
4个字节,用来标示接收者ID或者空中包身份。它和设备地址(48bit)是不一样的,不要混淆。
根据接入地址的不同,可以区分两种Packet类型:广播包和数据包:
广播包接入地址固定为0x8E89BED6
数据包接入地址为一个32bit的随机值,由Initiator生成。
PDU
2~258个字节,真正的数据内容。
CRC
3个字节的CRC校验
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。