蓝牙开发那些事儿
文章平均质量分 92
yuanyun_elber
嵌入式linux,android,蓝牙开发
展开
-
蓝牙加密算法以及其和HTTPS加密的异同
前言文章开始之前,我们先来看几个图片还记得最早期的手机,蓝牙配对需要输入四个数字的pincode了吧?为啥后来配对的图片变成这种了呢?这背后的技术或者说标准到底经历了什么?这篇文章希望能这个问题说清楚,同时既然说到加密算法,我们也可以把蓝牙世界和HTTPS世界做一个对比,会发现两者之间有很多的共同点,毕竟,都是通信范畴的东西。概念扫盲密码学体系是近几十年已经成熟起来的体系,我们这里不去展开论述,但是一些关键的信息还是我们必须了解的。在加密领域,我们首先要了解.原创 2022-01-25 15:39:18 · 6250 阅读 · 3 评论 -
蓝牙开发那些事儿(11)——BLE愉快地交互
上一章手机和flip4已经建立了连接,接下来的数据包格式就是data channel pdu了。Data channel pdu的格式如下:之前我们说过,和经典蓝牙不同的是,LE只有一个header,而BR的包头有两个——packet header和payload header,实际上这里的LLID类似于BR的payload header中的LLID,这里的NESN和SN类似于BR的packet header中的SEQN, 当然也并不完全一样,前者收发双方都维护一个sequence num.原创 2020-08-14 15:31:18 · 1884 阅读 · 4 评论 -
蓝牙开发那些事儿(10)——初识BLE
其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进,应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑:功耗低,数据量少,基于这个考虑,和传统蓝牙不同的是,很多场景下,BLE并不依赖于有连接的方式,无连接的方式具备功耗低,使用时间更长的优点,比如BLE的beacon技术就是一个设备定时发非连接广播包,通常要求这样一个节点,可以工作一到两年左右。虽然BR也有广播的内容,但是在BLE的领域里,广播的重要性被强化了。 因为都是蓝牙原创 2020-08-13 09:03:45 · 2078 阅读 · 4 评论 -
蓝牙开发那些事(9)——结合代码看a2dp协议
上一章讲了一下avdtp的连接过程,这一章我们看一下btstack的实例。因为a2dp是一个音频传输的框架协议,具体的使用已经牵涉到应用层了,比如说我们的设备是个音箱设备还是个音源设备,我们目前是个音箱设备,所以可以看一下a2dp_sink_deom.c。其中首先调用a2dp_and_avrcp_setup函数进行了一系列的初始化,从这个函数名就知道,初始化的内容包括了a2dp协议和avrcp协议,a2dp之前我们已经讲了其基础协议avdtp,avrcp的话呢是基于avctp协议的,AVCTP协议.原创 2020-08-06 11:39:45 · 2811 阅读 · 2 评论 -
蓝牙开发那些事儿(8)——avdtp连接过程
上一章中的最后,我们看到一条avdtp的l2cap channel已经建立好了,接下来avdtp可以开始走起来了。Avdtp的文档又是一个140多页的庞然大物,全部看下来东西还是挺多的。Avdtp是a2dp(advanced audio distribution protocol)的基础协议,一般来说,avdtp的l2cap channel是需要建立两条的,这里先建立第一条,也就是signal channel(这个说法和l2cap的signal channel好接近,大体上,可以认为signal c原创 2020-08-05 17:15:36 · 3203 阅读 · 0 评论 -
蓝牙开发那些事儿(7)——l2cap层连接过程
L2cap层是连接hci和上层profile的中转站,我们之前分析包格式的时候就说过,payload header中的llid如果标示是acl-u的话,说明就是个l2cap包。上层profile在连接的时候,都需要先建立l2cap逻辑链路,每个逻辑链路分配cid(channel id),这也是l2cap最重要的功能:协议/信道多路复用然后比较重要的是,l2cap提供分包和重组功能,比如说上层的包比较大,controller支持的包比较小,就有可能需要分包了,我们前文说过,payload header.原创 2020-08-04 15:31:49 · 4503 阅读 · 3 评论 -
蓝牙开发那些事儿(6)——蓝牙协议架构扫盲
蓝牙协议架构扫盲蓝牙的协议架构图真的是五花八门的,我们以前见过,以hci层区分host和controller的楚河汉界,然后两边细分,hci层以下有lc、lmp层,hci以上有l2cap和profile。我们再来看这张图,这张图又有所区别了,l2cap层以下是logical layer和physical layer。是不是又晕了?其实只是角度不同而已,以前的架构图更侧重的是软件协议,这张图的侧重点则是物理链路、逻辑链路等等大量被抽象出来的基带概念。看一下下面这张图就更清晰了。原创 2020-08-04 10:37:07 · 3521 阅读 · 2 评论 -
蓝牙那些事儿(5)——关于重传
终于讲到l2cap层了。L2CAP的功能包括 协议/信道复用, 分段重组(segmentation and reassembly, SAR),各信道流控和错误控制这里的信道不是指的多少频段多少频段的物理信道,而是指l2cap层面向上层应用开放的channel,上层应用就是根据l2cap层的channel id来判断是否是属于自己profile的data的。我们接着上回没讲完的话题。基本上大多数情况下,有hci层的流控就够了,但是好歹l2cap是提供了这个服务的,我们学习一下总没错。L2c原创 2020-07-31 15:35:20 · 2786 阅读 · 1 评论 -
蓝牙开发那些事(4)——关于流控
5.4 关于流控上一章,留了个尾巴。先来个数据包格式的图,上图中,packet header和payload header中间都出现了流控(FLOW)位。我们之间讲HCI命令的时候,提到了HCI transport层的流控。其实HCI上层的L2CAP层,也提供了流控服务的。是不是概念很搞?接下来我们具体讲一下流控。其实只要有传输就会有流控,在我们蓝牙的体系里,数据的流动有两个关键位置,一是介于controller和host之间的HCI,这个通过hci transport层的.原创 2020-07-31 14:00:04 · 3717 阅读 · 0 评论 -
蓝牙开发那些事儿(3)——看看空中包
在initial阶段我们看到了大量的hci command和hci event的交互,controller在init结束后完成了初始化,状态也变成了HCI_INIT_DONE。接下来就要进入一个叫做GAP的profile,GAP这个profile和其他profile的明显区别是,其他profile都是基于l2cap的,而gap不是。我们先看一下gap的定义:GAP,Generic Access Profile,该Profile保证不同的Bluetooth产品可以互相发现对方并建立连接GAP定原创 2020-07-31 13:26:26 · 3072 阅读 · 5 评论 -
蓝牙开发那些事儿(2)——初始化
路漫漫其修远兮,我们这就上路吧。上电后,Host向controller发出了第一个条指令所有的蓝牙模块在上电或者需要复位的时候都会收到来自host的这条命令,它开辟鸿蒙,点亮人生。虽然wireshark已经清晰地把这条命令解析了出来:第一个字节01表示packet type: HCI Command第二三字节是03 0c表示opcode: Reset第四个字节表示parameter长度是0我们还是去core spec里去寻找一下这条命令。首先,我们要了解,hci接口.原创 2020-07-23 11:02:50 · 2713 阅读 · 0 评论 -
蓝牙开发那些事儿(1)——从抓包数据开始
从今天起,会开一个新的专栏。面向初学者试着讲讲蓝牙,网上好像有很多讲解移植蓝牙协议栈btstack的,但是都表示移植好了,对蓝牙协议还是一知半解,网上的那些讲蓝牙协议的,大多都是粘贴来粘贴去,没有深入,对初学者很不友好。我想找一个新的角度,试着去帮助初学者入门,尝试一下,如果效果好,能帮助到其他人,那么还是有动力坚持写下去的。一般网上讲协议栈的,都是分层去讲,先来看一下网上找到的这张协议栈的图这个是bluelet协议栈的框图,看上去很晕是不是,对初学者很不友好。这里可以稍微解释一下,在.原创 2020-07-23 10:09:44 · 5419 阅读 · 3 评论