蓝牙开发那些事儿(3)——看看空中包
在initial阶段我们看到了大量的hci command和hci event的交互,controller在init结束后完成了初始化,状态也变成了HCI_INIT_DONE。
接下来就要进入一个叫做GAP的profile,GAP这个profile和其他profile的明显区别是,其他profile都是基于l2cap的,而gap不是。
我们先看一下gap的定义:
GAP,Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接
GAP定义了蓝牙设备如何发现和建立与其他设备的安全/不安全连接
它处理一些一般模式的业务(如询问、命名和搜索)和一些安全性问题(如担保)
同时还处理一些有关连接的业务(如链路建立、信道和连接建立)
GAP规定的是一些一般性的运行任务;因此,它具有强制性,并作为所有其它蓝牙应用规范的基础
Gap之所以会叫做profile,因为他其实也是一种应用。
举个实例,我们手机上的蓝牙,都是需要进入蓝牙设置菜单,打开可配对,然后 进入可以被其他蓝牙设备发现的状态的。这个时候,其实就是调用了gap的接口。
我们这次的抓包,也就是从initial完成后,这一条命令开始正式进入gap阶段。
基本上一个屏幕已经放不下了,因为GAP层涉及到的东西包括发现、连接、鉴权、加密等内容,展开讲还是非常多的。
作为controller来讲,这个时候和initial的第一阶段相比,最大的不同,是开始和外界交互了。
我们可以看一下空中包的情况。
如图所示,空中出现了大量的LMP包,所谓LMP包,其实就是红线标识的ACL-C包。这些LMP包的内容其实都是controller的行为,上层是不清楚的,上层在这一阶段的参与,主要是向controller发送命令,让controller进入某种状态,可配对、可连接、读取远程设备信息、加密…等等。
而这个阶段之后,其他profile开始工作的时候,host的参与感就更强了,可以看到红框下面的那些包,都是l2cap层以上的包,这些包都是从host层通过hci acl data接口下发给controller,由controller通过 ACL –U包这种格式发给远端的。
说到ACL-C\ACL-U, 这个阶段,我们有必要讲一下蓝牙数据包的格式了。
看一下下图,我记得有次面试的时候,有个面试官专门问了我蓝牙数据包的格式,这个虽然说协议规范中都有,但是搞蓝牙的人,如果背不出来,也是要被鄙视的。
首先是access code,其中包含了PA,preamble,基本上无线通信不可或缺的东西,含包括了SYNC WORD,SYNC WORD中间就隐含了蓝牙地址在里面,我们知道现在无线环境复杂,空中包那么多,我们怎么知道哪些包是我们需要的呢,就是根据蓝牙地址,很多垃圾信息,在access code就可以过滤掉了。
下图是access code的格式:
然后是Packet header,packet header主要包括Lt_addr, 这个地址用来区分slave设备的,然后包的格式,包括DM1、2DH3、2EV3等各种格式的,不同格式的编码效率、抗干扰性都不相同,基带会根据环境自动选取合适的格式去发送数据包
然后流控,ARQ(问答机制),序列号等内容,最后是一个HEC校验码
在packet header后面有一个guard同步,因为如果是edr的话,前后的调制方式是不一样的,需要重新同步一下。
然后是payload header,我们这里只讨论acl包,(sco包不讨论)上文提到了包格式就在这里面的LLID包含了,其实LLID也无外乎两种包格式,一种是LMP-C,一种是LMP-U,只不过这里的LMP-U涉及到分包的内容,我们也知道l2cap层支持分包,主要的实现就是在LLID中去标识是start包还是continous包。注意这个payload header和header都有一个流控位,很容易搞混,具体的内容我们下文讲。
再后面就是payload body了,这个就完完全全是我们上层协议发下去的东西了。
controller在接收数据包的时候,首先是在预定的接收slot上,按照预定的调频序列打开RF,假如收到access code的话,判断蓝牙地址,如果不是发给我们的,直接过滤,接着接收packet header,其中有HEC校验,如果校验不通过,又直接过滤,然后调整RF,接收payload,payload最后是有crc校验的,如果crc不通过的话,又会被过滤掉,所以最后controller上传给host的数据包是经过了千山万水辛苦达到的,是可靠的。
蓝牙开发那些事儿(3)——看看空中包相关推荐
- 蓝牙开发那些事儿(10)——初识BLE
其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进, 应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑: 功耗低,数据量少, ...
- 【蓝牙开发】Android BLE中广播包发射功率(TX power level)
2022/01/02 输出! https://blog.csdn.net/love131452098/article/details/118486691 https://support.huawei. ...
- 详解BLE 空中包格式—兼BLE Link layer协议解析
BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题. 虽然BLE空中包(pa ...
- 使用Ellisys抓取蓝牙空中包
Ellisys 工具 本地使用的Ellisys vanguard 版本.对应的软件下载地址Ellisys vanguard download 是需要填写公司信息,软件本身是免费的.注意如果别人有现成的 ...
- 低功耗蓝牙开发入门概念科普
一.概述 1.缘起 低功耗蓝牙起源于Bluetooth4.0版本,至今已发展到5.3 4.0 bluetooth low enerngy 这个阶段低功耗蓝牙的基础框架已经稳定成型,后面版本主要退出新特 ...
- ESP32 蓝牙开发
1. 低功耗蓝牙(BLE)协议栈 低功耗蓝牙协议是蓝牙通信协议的一种,BLE协议栈就是实现低功耗蓝牙协议的代码 1.1 层次协议 蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth ...
- 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程
个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1.前言 2.蓝牙综合介绍 3.精华文章汇总 4.结语 1.前言 大家好,我是董哥 ...
- [转]Android蓝牙开发浅谈
转自:http://www.eoeandroid.com/thread-18993-7-1.html 对于一般的软件开发人员来说,蓝牙是很少用到的,尤其是Android的蓝牙开发,国内的例子很少 ...
- Android蓝牙开发
一.配置权限 AndroidManifest.xml里加入权限 <uses-permissionandroid:name="android.permission.BLUETOOTH_A ...
最新文章
- 计算机学院 储昭坤,我校在“展航杯”安徽省大学生信息安全作品赛荣获佳绩...
- UNIGUI下载文件
- windows做软件界面
- python ocr识别身份证_Python+opencv+pytesseract实现身份证号码识别
- CMMI体系建设的目的和意义
- 现国内基金定投最好的入门书《指数基金投资指南》
- android 谷歌上传appid,Android之获取AppId
- “被授权”泛滥 个人信息保护怎么管?
- 怎样把QQ群降级(1000人降到200或500人,500人降到200)
- Cell Ranger count (gene expression) 输出文件解读
- 数据结构——数组以及n维数组
- 第46讲 Android Camera2 API AWB自动白平衡
- 【多模态】多模态摘要简述
- 关于Netty中的Recycler对象池
- uni.getLocation(Object)获取经纬度和当前中文地址
- 巧用友盟UShare、ULink玩转裂变营销
- scrum立会报告+燃尽图(第三周第五次)
- 网站流量统计与网站访问分析
- vue 获取id元素_.vue组件中获取DOM元素问题
- 最新卡巴杀毒软件,可以免费升级哦,卡巴斯基激活码(2007年4月23号更新)