# bluedroid stack巧谈

BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么?

一:android bt框架

借助ID为iini的群友的android相依框架图# bluedroid stack巧谈_第1张图片
如上图所示,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、连接方式

你可能感兴趣的:(Android)