# bluedroid stack巧谈
BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么?
一:android bt框架
借助ID为iini的群友的android相依框架图
如上图所示,android的框架大概可分为三个层次,最上为application层,其次为bt stack层与具体的硬件层(软件上可以忽略这块)。
application只管调用相关的数据接口进行业务的逻辑,所以整个蓝牙的框架中,最重要,最枯燥的当属于bt stack层。
1.1、host
1.1.1、gatt层
GATT(general attribute layer)用来规范attribute中的数据内容,
1.1.2、GAP
GAP(general) access profile) 主要完成设备的连接请求,连接,以及发起的过程。
1.1.2、att层
ATT(attribuye layer)主要用来解析l2cap层发送而来的数据。
1.1.3、SMP
SMP(security manage profile),主要负责蓝牙的安全性问题。
1.1.4、l2cap层
L2CAP可以比喻成整个蓝牙的数据实际发送区,它不关心数据的内容
1.2、controler
controller层我们主要关心hci层,
hci(host communication interface) 主要负责数据的硬件发送,现在bluedroid主要支持uart,usb这两种接口。
二、实战比喻
一般协议数据的发送各位为:
我们的bluedroid也是采用这种方式。
2.1、广播方式
加入我们需要蓝牙手环已经连接匹配的手机,此时手环需要发送温度传感器的值(0x52)
难道只是减到的bt_write(0x52)就可以直接写入裸流数据到手环的LL层吗? 当然是nonono的了。
2.1.1、蓝牙的通路选择(CID)?
蓝牙一共有56个cid,在复杂的运用环境下,也许就那么几个可用,所以我们需要指定一个可用的cid进行数据发送,这里运用了蓝牙的调频技术,具体大家自由google吧。
2.1.2、手环的数据发送给谁?
这里引入了access address的概念,指明接受者的身份,对于广播方式而言,ID为0x8E89BED6表明这是一个广播方式的蓝牙数据。
2.1.3、手机如何确认这是你发的数据?
这里需要加上一个本身的ID表明你的身份。
2.1.4、如何确认数据传输的有效性?
引入了header来标识我们发送的数据的信息,同事在尾部加上crc校验表明数据传输的有效性、
所以最后发送到手机的裸流数据为:
AA D6BE898E 60 0E 3B75AB2A02E1 02010504FF5900 53 8EC7B2
数据描述 | 数据 |
---|---|
hex数据 | AA D6BE898E 60 0E 3B75AB2A02E1 02010504FF5900 53 8EC7B2 |
headerinformation | AA :前导码 8EC7B2:数据crc校验值 |
目标ID | D6BE898E |
LL header | 0x60 |
LL length | 0E |
本身ID | 3B75AB2A02E1 |
数据信息类型(声明广播包) | 02010504FF5900 |
实际发送的数据 | 53 |
---------- | -------------------------- |
2.2、连接方式
更多相关文章
- GitHub 标星 2.5K+!教你通过玩游戏的方式学习 VIM!
- “罗永浩抖音首秀”销售数据的可视化大屏是怎么做出来的呢?
- Nginx系列教程(三)| 一文带你读懂Nginx的负载均衡
- 不吹不黑!GitHub 上帮助人们学习编码的 12 个资源,错过血亏...
- android 测试 --使用sqlite3查看手机数据库系统
- Android静态安全检查(十三):剪切板使用检测
- Android批量插入数据到SQLite数据库的方法
- Android(安卓)5.0 BLE 周边(BluetoothLeAdvertiser)
- Android开发中的一些经验总结