从零开始的nrf52832蓝牙开发(1)--蓝牙协议基础
想要进行蓝牙开发,第一步肯定要对蓝牙协议有所了解。除了要对蓝牙的一些专业术语有所熟悉,还应该对蓝牙协议每层功能有一定认知。
概略图:
物理层(PHY):
物理层规定了蓝牙频段:2400MHz~2483.5MHz
物理层规定了调制解调方案:高斯频移键控
首先蓝牙物理传输基于Radio模块,也就是无线电模块。我们知道在串口中对地线有无电压可以表示逻辑上的1或是0,而无线电的做法简单来说就是在某个频率中心,上浮和下降一定频率看做1和0,这就是高斯频移键控(GFSK),它是一种调制解调方案。
物理层规定了三种调制解调方案的变体:LE 1M PHY、LE 2M PHY、LE Coded PHY
物理层规定了通信方案:分时双工
物理层规定了发送功率和接收灵敏度:
发送功率:0.01mW(-20dBm)到 100mW(+20dBm)
接收灵敏度(它并不是一个具体的值,而是根据发送数据长度,指定了要低于多少的误码率):
链路层(LL):
链路层在蓝牙协议栈中最为复杂!
定义了空口包格式和空口协议,负责广播、扫描、建立连接、维护连接等,展开来讲比如广播间隔、数据重传、接收发送等待超时等设置最后都在这一层中被实际应用。
链路层的五种状态:
就绪态、广播态、扫描态、发起态、连接态。状态机如下:
蓝牙每个信道为2MHZ,所以一共40个信道,其中2402、2426、2480MHZ为主信道,主要用于传统广播,其余为二级信道,主要用于。广播时在三个广播信道循环跳转,连接后在数据信道循环跳转。
连接状态下定义了两个重要的角色:中心角色(Central role)和外围角色(Peripheral role),主动发起连接的叫做中心角色,被动接受连接的叫做外围角色!
一个链路层可以同时实现多个状态机,一个状态机只能处于一种状态而不可以同时处于多种状态。
2022-11-04新增:
现在的蓝牙链路层状态机为:
新添加了同步广播态和同步态。
其次编号为37、38、39的信道之前只用来广播,而其他37个信道可以用来在连接后传输数据,但是现在新增拓展广播后,那37个信道也可以用来传输广播了,比如周期广播。新增的拓展广播,还是需要先在广播信道上告诉接收设备,怎么后续在数据信道上接收,所以之前的广播信道现在叫做主信道,数据信道叫做二级信道,之前只在主信道上广播的广播,叫做传统广播。
还新增了恒音拓展用来支持AoA/AoD测向。新增CIS和BIS等,内容比较多。
同步适应层
主要为了解决音频传输中音频帧长不一问题,通过分割和重组让发送和接收端在使用不同帧长时正常使用。
主机与控制器接口(HCI):
此层可选,是连接主机(Host)和控制器(Controller)之间的桥梁。主机与控制器之间可以使用USB、UART等通信,HCI规定了一系列的通信标准协议。但像52832这种芯片是没有HCI的,Host和Controller被设计在一个芯片内,他们直接通过调用接口API通信。
逻辑链路控制和协议适配(L2CAP):
1.协议或通道的多路复用
2.上层应用数据(L2CAP Service Data Units,SDUs)的分割(和重组),生成协议数据单元(L2CAP Packet Data Units,PDUs),以满足用户数据传输对延时的要求,并便于后续的重传、流控等机制的实现
3.提供基于信用的流控机制
4.错误控制和重传机制
5.支持流式传输(如音频、视频等,不需要重传或者只需要有限重传)
6.协议数据单元(PDUs)的分片(和重组),生成符合Link Layer传输要求的数据片(长度不超过251)
7.Qos服务
安全管理层(SMP):
管理蓝牙连接的安全性,主要负责密钥分发与配对。支持如下命令:
属性协议(ATT):
协议两个字画重点,什么是协议?就是一种约定,两个设备要交互数据,数据按照什么顺序发,每个字节代表什么意思,这就是协议。所以ATT就是规定了两个蓝牙设备之间通信的一个协议。属性协议肯定是关于属性的协议,属性其实就是一种数据格式:
上图就是一条属性,它由以下几个部分组成:
Attribute Type:
属性类型,用UUID表示,分为四大类:
1.Primary Service(首要服务项)
2.Secondary Service(次要服务项)
3.Include(包含服务项)
4.Characteristic(特征值)
uuid对应属性类型划分:
0x1800 – 0x26FF :服务项类型
0x2700 – 0x27FF :单位
0x2800 – 0x28FF :属性类型
0x2900 – 0x29FF :描述符类型
0x2A00 – 0x7FFF :特征值类型
实际数据可以参考下一节GATT的图片。
Attribute Handle:
属性句柄,如果设备上有两个类型一样的肯定需要一个标识来区分,属性句柄就是每个属性的唯一标识。它由系统分配。
Attribute Value:
属性的值,如果该属性是服务项类型或者是特征值声明类型,那么它的属性值就是UUID等信息。如果是普通的特征值,则属性值是用户的数据。属性值需要预留空间以保存用户数据。为了方便理解,我们可以将属性值的空间看做I2C的数据空间,操作特征值里的用户数据,就是对那块内存空间进行读写。
Attribute Permissions:
属性权限,主要有一下四类:
访问权限(Access Permission)- 只读、只写、读写
加密权限(Encryption Permission) – 加密、不加密
认证权限(Authentication Permission) – 需要认证、无需认证
授权权限(Authorization Permission) – 需要授权、无需授权
操作属性的指令:
通用属性配置文件(GATT):
它规定了属性的组织方式,一个profile由若干个service组成,而一个service又由若干characteristic组成,characteristic又是由声明、数值和描述符组成。整体结构:
通用访问配置文件(GAP):
1.定义了GAP层角色:
蓝牙协议不同层中对角色的定义互不干扰。
比如链路层里面定义了主机(Master)、从机(Slave)角色。
GAP层定义了广播者(Broadcaster Role)、观察者(Observer Role)、外围设备(Peripheral Role)、中心设备(Central Role)。
ATT层定义了服务端(Server)、客户端(Client)。
2.定义GAP层的、用于实现各种通信的操作模式(Operational Mode)和过程(Procedures):
Broadcast mode and observation procedure,实现单向的、无连接的通信方式;
Discovery modes and procedures,实现蓝牙设备的发现操作;
Connection modes and procedures,实现蓝牙设备的连接操作;
Bonding modes and procedures,实现蓝牙设备的配对操作。
3.定义User Interface有关的蓝牙参数:
1.蓝牙地址
2.蓝牙名称
3.蓝牙的pincode
4.蓝牙的class
最后在应用程序中我们可以自定义或者使用SIG官方定义的配置,去实现自己的蓝牙功能,也就是各种各样的service和characteristic。
下一篇:
从零开始的nrf52832蓝牙开发(2)–蓝牙模板解析
推荐文章:
BLE发展介绍
蓝牙核心规范
蓝牙协议指南
蓝牙4.2协议官方下载
ATT协议解析
深入浅出低功耗蓝牙(BLE)协议栈
低功耗蓝牙ATT/GATT/Profile/Service/Characteristic规格解读
蓝牙相关名词全称
蓝牙技术揭秘
2022-11-04更新
重新修改了一些错误概念,原文基于蓝牙V4.2,添加了到最新的蓝牙V5.3的相关内容。
从零开始的nrf52832蓝牙开发(1)--蓝牙协议基础相关推荐
- Android蓝牙开发 — 经典蓝牙BLE蓝牙
一,前期基础知识储备 1)蓝牙是一种支持设备之间短距离通信的无线电技术(其他还包括红外,WIFI): 支持移动电话.笔记本电脑.无线耳机等设备之间进行信息的交换: Android支持的蓝牙协议栈:Bl ...
- 【Android】蓝牙开发——经典蓝牙:配对与解除配对 实现配对或连接时不弹出配对框
目录 一.配对方法 二.解除配对方法 三.配对/解除配对结果 四.justwork配对模式下,不弹出配对框 五.pincode配对模式下,不弹出配对框 六.小结 在之前的文章[Android]蓝牙开发 ...
- Android蓝牙开发—经典蓝牙详细开发流程
文章目录 开发流程 权限 核心API BlueToothAdapter getDefaultAdapter():获取BluetoothAdapter对象 判断设备是否支持蓝牙 判断蓝牙是否开启 get ...
- android pin码 经典蓝牙_Android蓝牙开发—经典蓝牙详细开发流程
Android蓝牙开发-经典蓝牙详细开发流程 发布时间:2018-07-16 13:41, 浏览次数:637 , 标签: Android Android蓝牙开发前,首先要区分是经典蓝牙开发还是BLE( ...
- 蓝牙配对模式 java_【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码...
目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备 & 直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...
- 【Android】蓝牙开发—— 经典蓝牙配对介绍(Java代码实现演示)附Demo源码
目录 前言 一.连接&配对方法介绍 二.演示:第一次连接蓝牙设备 & 直接与蓝牙设备建立配对 三.总结 四.补充 五.Demo案例源码地址: 前言 前面两篇文章[Android]蓝 ...
- Android蓝牙开发—经典蓝牙和BLE(低功耗)蓝牙的区别
找到一篇介紹BT与BLE使用差别的文章, 写的很清晰,看完基本明白了 ----------------------------------------------------------------- ...
- iOS蓝牙开发:蓝牙连接和数据读写
当下蓝牙开发可谓是越来越火,不论是智能穿戴的兴起还是蓝牙家具,车联网蓝牙等等,很多同学也会接触到蓝牙的项目,我从事蓝牙开发也有一段时间了,经手了两个项目.废话不多说了,先向大家简单的介绍有关蓝牙开发的 ...
- python 蓝牙开发_蓝牙开发快速入门
本文旨在作为入门蓝牙开发的一个简单介绍 安装BlueZ和PyBluez $ sudo apt install libglib2.0-dev libbluetooth-dev bluetooth $ p ...
最新文章
- 如何由jdk的安装版本改成非安装版本
- DL之PerceptronAdalineGD:基于iris莺尾花数据集利用Perceptron感知机和AdalineGD算法实现二分类
- python中自带的三个装饰器
- 【小代码讲解】独热编码(One-Hot编码)
- 常见索引结构—二叉搜索树
- python的字符串_百度资讯搜索_python的字符串
- Boost正则表达式
- ServerAlias指令
- 张朝阳:选校草、跑马拉松、开5G峰会 搜狐最近要干这些事
- Creating and Interning Symbols
- Java实现opendir的api_api代码生成
- Linux学习整理-网络防火墙iptables-实践篇2
- 数据结构与算法之迷宫回溯
- iOS之Swift实现二维码扫描
- 浏览器标准模式和怪异模式之间的区别是什么——整理自网页
- (六)软件测试的分工
- Vue移动端系列 => [06] 文章搜索
- Superset系列9- 制作地图
- 什么是AJAX的同步异步?
- SATA协议OOB随笔