蓝牙模块ABCSP浅析(转)

ABCSP是CSR为自己的蓝牙芯片及协议栈软件所做的协议栈与芯片传输协议,适用于嵌入式系统。

整体来讲主要有4层:

Uplevel:包括Sequence ,Datagram;MUX;Packet integrity

SLIP;

Uart Driver.

Uart.

Uart,串口,物理层,负责将数据在Host与host-controller之间传输。

Uart driver。串口驱动层,负责串口配置及数据传输链路控制。

SLIP,传输层,负责数据流的传输控制

Uplevel,传输应用层,负责对包进行重组,完整性检查,解析包头,包体以及包序列的正确性。

封包结构

BCSP封包只有一种,在此类封包上即发送数据,也发送相应包,

通常结构为: 0xc0 Header Payload (Header) 0xc0

BCSP escape: BCSP封包均以0xc0开头和结尾,此部分不计入封包长度。

BCSP Header:

长度4,分别表示包概要,长度及使用通道,长度,校验和。

其中第一个字节包概要包括了,包类型(1bit)、CRC校验开关(1bit)、ACK值(3bits)和SEQ值(3bits)。

如果CRC校验开关为开,则包尾会含有两个字节的CRC校验字。 包体长度的计算通过第二字节的高4位与第三个字节的低四位左移4位后相加得出。 使用通道可以用来表示包的作用类型,

例如0通常用于ack包,1用于建立bcsp连接时的同步包,2~15用于普通的蓝牙数据和信令包,15以上为自定义。经常会用到的通道还有5==ACL,6==L2CAP,7==SCO等。

 

拿一个具体的包来举例:

0xc0,0×40,0×41,0×00,0×7e,0xda, 0xdc, 0xed, 0xed ,(0xa9,0×7a),0xc0

这个包用来作为蓝牙启动后与芯片的同步请求。

包类型:非可靠包

CRC校验:开

包长度:4

通道:1

校验和:0×74,对于同步包来讲校验和固定

包体:0xda, 0xdc, 0xed, 0xed 为固定内容,请求与芯片同步通信。

 CRC校验字:0xa9 0×7a

 如果包体内容为HCI信令,则在这里还会包有HCI包头,通常HCI包中会含有各种蓝牙Profile封包,其中HCI头占4个字节,其中会指明包体长度及类型。

HCI封包的结构及分析待以后再谈。

附一些简单的小tips:

1、 ACK包seq field = 0, chan = 0, rel = 0,

2、 ACK包头一字节通常为40,48,50,58,60,68,70,78分别表示了从ACK0到ACK7.

 3、 包头第一字节高位如果大于等于C,则为可靠CRC校验包,

4、 包头的第一字节低位如果大于等于8,则ACK值一定大于等于1,而SEQ值等于低位减去8.

以上都是很简单的计算过程,为了减少在分析包时的繁琐,可以直接记下。

下一步,将对ABCSP的工作流程进行学习,分析它发送、接收,以及包序列校验等过程。

 

原文地址:http://www.since1985i.com/study/bluetooth-abcsp-packets.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ThreadLocal 是 Java 中的一个类,它提供了一种线程局部变量的机制。线程局部变量是指每个线程都有自己的变量副本,每个线程对该变量的访问都是独立的,互不影响。 ThreadLocal 主要用于解决多线程并发访问共享变量时的线程安全问题。在多线程环境下,如果多个线程共同访问同一个变量,可能会出现竞争条件,导致数据不一致或者出现线程安全问题。通过使用 ThreadLocal,可以为每个线程提供独立的副本,从而避免了线程安全问题。 ThreadLocal 的工作原理是,每个 Thread 对象内部都维护了一个 ThreadLocalMap 对象,ThreadLocalMap 是一个 key-value 结构,其中 key 是 ThreadLocal 对象,value 是该线程对应的变量副本。当访问 ThreadLocal 的 get() 方法时,会根据当前线程获取到对应的 ThreadLocalMap 对象,并从中查找到与 ThreadLocal 对象对应的值。如果当前线程尚未设置该 ThreadLocal 对象的值,则会通过 initialValue() 方法初始化一个值,并将其存入 ThreadLocalMap 中。当访问 ThreadLocal 的 set() 方法时,会将指定的值存入当前线程对应的 ThreadLocalMap 中。 需要注意的是,ThreadLocal 并不能解决共享资源的并发访问问题,它只是提供了一种线程内部的隔离机制。在使用 ThreadLocal 时,需要注意合理地使用,避免出现内存泄漏或者数据不一致的情况。另外,由于 ThreadLocal 使用了线程的 ThreadLocalMap,因此在使用完 ThreadLocal 后,需要手动调用 remove() 方法清理对应的变量副本,以防止内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值