赞
踩
BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发生什么?
借助ID为iini的群友的android相依框架图
如上图所示,android的框架大概可分为三个层次,最上为application层,其次为bt stack层与具体的硬件层(软件上可以忽略这块)。
application只管调用相关的数据接口进行业务的逻辑,所以整个蓝牙的框架中,最重要,最枯燥的当属于bt stack层。
GATT(general attribute layer)用来规范attribute中的数据内容,
GAP(general) access profile) 主要完成设备的连接请求,连接,以及发起的过程。
ATT(attribuye layer)主要用来解析l2cap层发送而来的数据。
SMP(security manage profile),主要负责蓝牙的安全性问题。
L2CAP可以比喻成整个蓝牙的数据实际发送区,它不关心数据的内容
controller层我们主要关心hci层,
hci(host communication interface) 主要负责数据的硬件发送,现在bluedroid主要支持uart,usb这两种接口。
一般协议数据的发送各位为:
我们的bluedroid也是采用这种方式。
加入我们需要蓝牙手环已经连接匹配的手机,此时手环需要发送温度传感器的值(0x52)
难道只是减到的bt_write(0x52)就可以直接写入裸流数据到手环的LL层吗? 当然是nonono的了。
蓝牙一共有56个cid,在复杂的运用环境下,也许就那么几个可用,所以我们需要指定一个可用的cid进行数据发送,这里运用了蓝牙的调频技术,具体大家自由google吧。
这里引入了access address的概念,指明接受者的身份,对于广播方式而言,ID为0x8E89BED6表明这是一个广播方式的蓝牙数据。
这里需要加上一个本身的ID表明你的身份。
引入了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 |
---------- | -------------------------- |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。