说一说蓝牙

家贫,无从致书以观,天大寒,砚冰坚,手指不得屈伸

其实所有的蓝牙设备都是这样的,有些MCU直接集成进去了,比如TI和nordic的,一般手机或者大一点的设备都是分开来的,用串口即HCI传输层传输数据,就算是USB驱动也离不开HCI的传输层。反正你就理解为串口控制。controller才是蓝牙模组那一端有天线的,跑freertos之类的系统的,host端一般都是MCU主控或者LINUX设备主控。

然后目前的蓝牙设备,一般有两种,

一种是BR/EDR ,这个比较常用来用来传输音频数据,较多用于类似耳机的产品。

另一种是BLE ,这个比较常用来传输传感器数据,较多用于类似手环的产品。

我们的手机上蓝牙设备BLE和BR/EDR都有,这就叫做双模,两种蓝牙协议共用一根天线。

只有BR/EDR的或者只有BLE的就叫单模。

刚开始搞蓝牙,肯定要抓log,然后对比着看蓝牙的core spec,直接看core spec很晕

记得大学的时候,都搞一些TI nordic的BLE,创建一下服务,写一下ATT 的 character数据,调传感器数据,然后放到一个handle struct里面,ok,发送出去,间隔什么功耗什么不用管,温度湿度。。心率。。陀螺仪滤波角度传出去,哪知道什么协议,各种profile看一年也看不进去。

一般蓝牙的log分两种,一种是串口的log,一种是空中的log

抓log工具

1、找一个带蓝牙的ubuntu系统,hcidump  -w xxx.cfa(串口的log,hcidump直接监控hci0)

Frontline Downloads - FTS4BT: Frontline Bluetooth Protocol Analyzer & Packet Sniffer用这个软件分析

2、买一个抓log的工具bpa或者ellisys,抓取空中包、hci 串口包,ellisys贵的一匹,要30万(用设备抓串口log的话就要接三条线)

抓个log看看吧

这个就是蓝牙串口传输的数据,什么协议都在上面

所有的蓝牙协议都是一条字符串,或多或少而已

11010010 10100001 00000000 10001100 00110011 00001100 00000111 11111100 00000011 00110000 00010100 00000000 00010100 00000000 00011000 10101011

一、红色H5协议

二进制红色的部分(前四个字节后两个字节)就是H5的协议,比如我在头尾加个hehe,也可以命名为H6协议,然后每次也可以校验字符串是不是有hehe,协议就是这样,同理。

H5的协议在core spec的volume 4 part D 

分析红色的那部分,有4个字节的头部和2个字节的尾部,具体功能可以自己看spec

前六个位,SEQ和ACK校验上一个串和下一个串的序号。

然后第九位到第十三位

目前我们的log就是1,那就是标准的hci协议,就是一个指令,这条数据串传的就是cmd,至于说什么cmd,就看绿色的数据了,其实分析工具都已经标出来了,看分析工具都可以。

二、绿色协议(其实这里包了各种协议,hci、a2dp、hfp、spp、什么鸡ba都可以在这里面就是数据格式不一样而已,一般用packet type区分,a2dp在ACL data packet里面)

我们看绿色的数据

00110011 00001100 00000111 11111100 00000011 00110000 00010100 00000000 00010100 00000000

在core spec的volume 2 PART E

这个就是指令的格式,前面的2个字节就是操作码,前十位OCF是指令号,后六位OGF是指令种类,其它的就是参数了

我们来看看指令的种类:

在core spec volume 2 PARTE 第七节、

指令种类OGF有七种、LINK CONTROL COMMANDS  、LINK POLICY COMMANDS。。。。。。

指令种类对应的是:0x01~0x06   0x08

刚刚我们的图分析的这个cmd的opcode是0x0c31,

那么指令种类OGF是就是0X03(CONTROLLER & BASEBAND COMMANDS)

指令号OCF就是0x0031.找一下这是一个什么指令号,

 Set Controller To Host Flow Control Command

这个是什么鸡ba功能具体你们可以看spec,主要就是流控的指令,打开或者关闭:ACL_Data或者Synchronous_Data的流控

这个功能我简单说一下:

   host端告诉controller我这边可以接收多少个buffer的数据的上限,如果打开了流控,你没有发buffer过来,那就意味着上限是0,controller端空中接到了数据ACL_Data或者Synchronous_Data就不会传过去给host端,连配对都不会有反应。

三、这个Log工作中分析出来的问题

     对、这个log就是配对没反应的时候抓的,为什么他妈按了配对什么感觉都没有,

抓了空中包分析了一下(空中包就不说了,也是数据串,协议按照那个方法看)

发现ACL data 丢掉了,卧槽,手机发出的rsp响应给设备controller,设备controller竟然没有发出来给host,gg

后来看

0x0c33和0x0c31的顺序发现有点不对劲,应该先打开流控,才给buffer的上限值,发现这样对模组是无效的,所以改掉一下顺序就ok了,手机上面按了配对没反应就这样解了,这是工作上面会处理的一些问题,也要用log。

四、蓝牙的学习其实就是一条数据串

     就是一条数据串,不管是空中抓的还是串口抓的,不管什么协议都是,我这里只是说一下方法,给初学者看,照葫芦画瓢,其它协议分析都是如此,是蓝牙。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值