蓝牙开发那些事儿
文章平均质量分 89
yuanyun_elber
嵌入式linux,android,蓝牙开发
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
btstack移植之安全配对(二)
legacy配对卡死原因分析原创 2025-07-17 13:57:17 · 466 阅读 · 0 评论 -
蓝牙开发那些事之btstack移植——安全配对(一)
btstack 安全配对调试原创 2025-07-17 13:51:50 · 722 阅读 · 0 评论 -
蓝牙开发那些事之重传大法
蓝牙的重传是协议规定好的,一般不需要去改代码,但是某些特殊情况下,在实战中还是有应用的,所以了解下重传的机制,并结合实战了解下原创 2025-07-03 16:01:00 · 742 阅读 · 0 评论 -
蓝牙开发那些事之蓝牙音响数据大堵车
流控对于蓝牙应用开发来说非常的重要,本文就是实战例子原创 2025-07-03 15:51:59 · 907 阅读 · 0 评论 -
蓝牙开发那些事之聊一聊hcilog
蓝牙的非常重要的调试手段——hcilog原创 2025-06-25 16:07:38 · 1026 阅读 · 0 评论 -
蓝牙开发那些事之btstack移植(3)
btstack移植后跑一跑ble 的central例程,看看有什么问题原创 2025-06-20 11:31:50 · 668 阅读 · 0 评论 -
蓝牙开发那些事之btstack移植(2)
btstack移植之二,第一回我们基本完成了接口,这一回我们尝试一下基本的demo,看看连接是否ok原创 2025-06-19 17:11:53 · 861 阅读 · 0 评论 -
蓝牙开发那些事之btstack移植(一)
这个hci_packet_buffer_reserved,实际上设置的原因,也是上文说过的,大多数的场景,比如说串口,是一个异步的接口,所谓异步,就是指代码调用发送的时候,实际上并没有发送完。可以看到host协议栈会直接调用hci层的hci_send_2_controller的接口,其参数是通过一个叫做KE_MSG_ALLOC的函数生成的,也就是说,ceva的协议栈的hci接口传递的参数都是kernel message,一种ceva协议栈内部定义的东西。system tick的接口实现,AI完全可以做到。原创 2025-06-18 15:23:20 · 634 阅读 · 0 评论 -
蓝牙开发那些事之PTS
ble的pts dongle环境搭建原创 2025-06-17 17:28:53 · 843 阅读 · 0 评论 -
蓝牙开发那些事之省电大揭秘
在这种情况下,有一点点不同的是,由于sniff mode的发起方还是手机(因为只有audio source才知道什么时候开始播放音乐,什么时候停止播放音乐),所以,在进入sniff mode之后,作为master的耳机定时在sniff anchor打开接收,接收的包不是poll,而是null。在延时敏感的蓝牙音频领域,这一点还挺重要的。经典蓝牙的两个设备建立acl连接后,主设备为了监督链路状态,会定期发送一种叫做POLL的数据包,从设备收到这种包之后必须回复,哪怕没有信息需要回复,也得回一个NULL包。原创 2025-06-10 11:39:01 · 709 阅读 · 0 评论 -
蓝牙开发那些事之btstack内存管理篇
btstack的内存管理分析原创 2025-06-10 11:33:27 · 469 阅读 · 0 评论 -
蓝牙开发那些事之Ellisys逻辑分析接口的妙用
ble连接阶段可以分成广播阶段和连接阶段,第一阶段的广播阶段,可能收到的包有两种,一种是scan_req,(必须是可扫描广播包才会响应),一种是connect ind,只有能够正常收到这第二种包之后,才能进入第二阶段。现在可以进入第二阶段,画一下流程图,感觉上是切换piconet导致的,之前的scan resp是在自己的piconet上,而之后需要切换到initiater的piconet了。”小张戴上侦探帽,开始“审讯”BLE芯片。掏出手机,打开nRF Connect,点击“Connect”,然后……原创 2025-06-10 09:59:13 · 820 阅读 · 0 评论 -
蓝牙开发那些事之ceva controller代码解读
对比ceva的经典蓝牙和ble的controller在软件上的差异点原创 2025-06-10 10:16:01 · 614 阅读 · 0 评论 -
蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)
蓝牙这个系列已经很久很久没有更新了,感慨良多。现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题,想了一些办法,一一克服了,看看对其他做蓝牙的同学有没有启发。同时也安利一个叫做HACKRF的设备。借助于目前软件定义无线电的飞速发展,在定位射频类问题的时候,真的已经比以前什么手段都没有的时候快多了也方便多了,一个HACKRF的设备大概也就700多元,最后解决了困扰我数周的问题。目前这家公司是做BLE芯片的,用的CEVA的蓝牙5.2的IP核,在我来这家公司之前,蓝牙的协议栈和软件部分由深原创 2025-04-18 16:16:21 · 1068 阅读 · 0 评论 -
蓝牙加密算法以及其和HTTPS加密的异同
前言文章开始之前,我们先来看几个图片还记得最早期的手机,蓝牙配对需要输入四个数字的pincode了吧?为啥后来配对的图片变成这种了呢?这背后的技术或者说标准到底经历了什么?这篇文章希望能这个问题说清楚,同时既然说到加密算法,我们也可以把蓝牙世界和HTTPS世界做一个对比,会发现两者之间有很多的共同点,毕竟,都是通信范畴的东西。概念扫盲密码学体系是近几十年已经成熟起来的体系,我们这里不去展开论述,但是一些关键的信息还是我们必须了解的。在加密领域,我们首先要了解.原创 2022-01-25 15:39:18 · 7306 阅读 · 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 · 2136 阅读 · 4 评论 -
蓝牙开发那些事儿(10)——初识BLE
其实LE和BR/EDR完全是两种不同的东西,物理层的channel数减少了一半,AFH调频算法有了新的改进,应用场景也不同,LE主要是应用于物联网,所以从设计上来讲,有以下考虑:功耗低,数据量少,基于这个考虑,和传统蓝牙不同的是,很多场景下,BLE并不依赖于有连接的方式,无连接的方式具备功耗低,使用时间更长的优点,比如BLE的beacon技术就是一个设备定时发非连接广播包,通常要求这样一个节点,可以工作一到两年左右。虽然BR也有广播的内容,但是在BLE的领域里,广播的重要性被强化了。 因为都是蓝牙原创 2020-08-13 09:03:45 · 2327 阅读 · 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 · 3184 阅读 · 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 · 3974 阅读 · 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 · 5457 阅读 · 6 评论 -
蓝牙开发那些事儿(6)——蓝牙协议架构扫盲
蓝牙协议架构扫盲蓝牙的协议架构图真的是五花八门的,我们以前见过,以hci层区分host和controller的楚河汉界,然后两边细分,hci层以下有lc、lmp层,hci以上有l2cap和profile。我们再来看这张图,这张图又有所区别了,l2cap层以下是logical layer和physical layer。是不是又晕了?其实只是角度不同而已,以前的架构图更侧重的是软件协议,这张图的侧重点则是物理链路、逻辑链路等等大量被抽象出来的基带概念。看一下下面这张图就更清晰了。原创 2020-08-04 10:37:07 · 4014 阅读 · 2 评论 -
蓝牙那些事儿(5)——关于重传
终于讲到l2cap层了。L2CAP的功能包括 协议/信道复用, 分段重组(segmentation and reassembly, SAR),各信道流控和错误控制这里的信道不是指的多少频段多少频段的物理信道,而是指l2cap层面向上层应用开放的channel,上层应用就是根据l2cap层的channel id来判断是否是属于自己profile的data的。我们接着上回没讲完的话题。基本上大多数情况下,有hci层的流控就够了,但是好歹l2cap是提供了这个服务的,我们学习一下总没错。L2c原创 2020-07-31 15:35:20 · 3272 阅读 · 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 · 4306 阅读 · 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 · 3647 阅读 · 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 · 3031 阅读 · 0 评论 -
蓝牙开发那些事儿(1)——从抓包数据开始
从今天起,会开一个新的专栏。面向初学者试着讲讲蓝牙,网上好像有很多讲解移植蓝牙协议栈btstack的,但是都表示移植好了,对蓝牙协议还是一知半解,网上的那些讲蓝牙协议的,大多都是粘贴来粘贴去,没有深入,对初学者很不友好。我想找一个新的角度,试着去帮助初学者入门,尝试一下,如果效果好,能帮助到其他人,那么还是有动力坚持写下去的。一般网上讲协议栈的,都是分层去讲,先来看一下网上找到的这张协议栈的图这个是bluelet协议栈的框图,看上去很晕是不是,对初学者很不友好。这里可以稍微解释一下,在.原创 2020-07-23 10:09:44 · 6221 阅读 · 4 评论
分享