自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(39)
  • 收藏
  • 关注

原创 蓝牙 Host 与 Controller:职责划分与协作机制

本文系统解析蓝牙架构中Host与Controller的划分逻辑及其协作机制。通过分层设计,Host负责连接管理、服务组织与安全策略,Controller专注无线链路与物理层传输,二者通过HCI接口协同。文章详解各层职责、协议组成及数据流动路径,并以扫描连接为例说明工作流程,强调功能分离带来的可移植性与复用优势,帮助开发者理解蓝牙通信的底层原理与实践应用。

2026-11-02 10:01:29 301

原创 蓝牙协议栈整体结构详解

本文系统介绍蓝牙协议栈的核心概念与架构,阐述其分层设计的必要性与优势。通过对比经典蓝牙与BLE差异,解析从应用层到物理层的完整通信流程,重点说明Host与Controller协同机制及HCI接口作用,帮助开发者理解蓝牙通信底层原理,为蓝牙开发与协议分析奠定基础。

2026-11-02 09:56:56 344

原创 蓝牙系统整体架构详解

本文系统解析蓝牙技术架构,厘清Host(上层协议与设备管理)、Controller(底层链路控制)、RF(射频收发)及HCI接口的分工与协作关系。通过典型应用案例,阐明各模块在广播、连接、数据传输中的角色,揭示蓝牙作为软硬协同系统的本质。文章强调理解分层架构对开发与调试的关键意义,并介绍单芯片集成与分离部署两种实现方式,助力开发者把握蓝牙核心技术脉络。

2026-11-02 09:44:39 323

原创 蓝牙设备类型与典型应用场景

本文系统梳理蓝牙技术学习的核心视角,强调从设备角色与应用场景理解蓝牙。通过分析手机、耳机、键盘、传感器及可穿戴设备等典型应用,揭示不同设备在通信模式、数据特征、功耗需求和角色分工上的差异。重点解析经典蓝牙与BLE的适用场景,阐释中心设备(Central)与外围设备(Peripheral)的实际交互逻辑,并以GATT服务、HID协议、广播机制等为例,展示蓝牙在物联网与人机交互中的实践路径,为开发者提供清晰的技术认知框架。

2026-11-01 19:46:49 198

原创 蓝牙技术中的常见术语与基本概念

本文系统梳理蓝牙核心术语,厘清Central/Peripheral、Master/Slave等角色概念,阐明广播、扫描、连接与配对的本质区别。强调设备角色与功能无关,连接不等于配对,安全机制需独立设计。通过流程图与对比表,帮助开发者准确理解蓝牙通信流程,避免常见概念混淆,为实际开发提供清晰指引。

2026-11-01 19:43:03 234

原创 蓝牙技术的工作频段与基本通信原理

ISM 是 Industrial、Scientific and Medical的缩写,即工业、科学和医疗频段。ISM频段最初主要用于工业设备、科学实验和医疗设备等射频应用。随着无线通信技术的发展,一些ISM 频段逐渐成为短距离无线通信技术的重要工作频段。其中,2.4 GHz ISM 频段应用非常广泛。蓝牙、Wi-Fi、Zigbee 等无线通信技术,都可以使用这一频段。蓝牙使用的 2.4 GHz ISM。

2026-11-01 18:08:00 272

原创 经典蓝牙与低功耗蓝牙:BR/EDR 和 BLE 的区别

本文系统对比了经典蓝牙(BR/EDR)与低功耗蓝牙(BLE)的技术特点,涵盖设计目标、通信方式及功耗差异。经典蓝牙适用于持续高速数据传输,如音频设备;而BLE专为低功耗、间歇性通信优化,广泛用于物联网设备。两者分工明确:前者强调连接稳定性与吞吐量,后者通过广播机制和灵活连接间隔实现节能。文章还解析了两种技术在拓扑结构、通信模式与应用场景上的核心区别,帮助开发者根据需求选择合适方案。

2026-10-31 22:46:17 334

原创 蓝牙技术的发展历程与版本演进

本文系统梳理蓝牙技术从1994年诞生至今的演进历程,涵盖蓝牙SIG成立背景、命名由来及核心发展目标。重点解析经典蓝牙(1.0–3.0)在互操作性、抗干扰与传输速率方面的迭代,以及蓝牙4.0引入低功耗蓝牙(BLE)带来的革命性变革。随后介绍5.x版本在传输距离、速率与广播能力上的提升,及6.x对精准测距等新特性的支持。文章总结了各版本间的技术关系与兼容性,并揭示蓝牙向低功耗、广连接、高智能方向发展的整体趋势,为开发者选型与应用提供参考。

2026-10-31 10:28:53 345

原创 蓝牙技术概述:从发展历史到技术架构

蓝牙技术是一种工作于2.4GHz ISM频段的短距离无线通信标准,由Bluetooth SIG维护。它从替代有线连接起步,历经Bluetooth Classic与BLE(低功耗蓝牙)演进,现广泛应用于消费电子、智能穿戴、物联网及室内定位等领域。其核心特点包括跳频抗干扰、低功耗、高兼容性与灵活协议栈。随着LE Audio、Mesh网络和方向识别等新技术发展,蓝牙正向多功能、智能化方向迈进,成为构建无线互联生态的关键技术。

2026-10-30 15:24:23 304

原创 《蓝牙技术学习与实践》系列博客总导航

蓝牙(Bluetooth)是一种广泛应用于智能设备、物联网、消费电子及嵌入式系统中的短距离无线通信技术。为了系统学习蓝牙技术,逐步建立从基础理论到协议理解,再到实际开发与问题分析的完整知识体系,特开设《蓝牙技术学习与实践》系列博客。本系列以蓝牙技术为核心,采用理论知识讲解 + 实验实践验证的方式展开,既注重技术原理的理解,也注重实际开发能力的培养。希望通过持续学习和实践,逐步掌握蓝牙技术的核心知识,并具备一定的蓝牙应用开发、调试和问题分析能力。具体文章还在写作中,会持续更新…

2026-10-30 12:29:41 135

原创 Android 实战:将 Nordic nRF Connect Device Manager 集成到自己的 App

Nordic 的 Android-nRF-Connect-Device-Manager 为 Android App 提供了现成的 MCU Manager 协议实现和 BLE 传输能力。选择匹配的库版本。正确配置 Android BLE 权限。完成设备扫描与连接。创建。使用相应的 Manager 执行设备管理操作。通过集成固件升级。处理异步状态、断连、重试和错误恢复。只要设备端已经实现兼容的 SMP 服务,Android 端就可以在现有库的基础上快速构建设备管理功能。

2026-10-29 14:45:46 56

原创 第8讲:复合设备——一个设备身兼数职

因此,在抓包和设备管理器中判断设备结构时,不能只看功能数量,还需要查看设备描述符、配置描述符和接口描述符之间的关系。其关键不在于把多个 USB 设备电气上简单并联,而在于通过描述符定义多个接口,并让 Host 分别识别这些接口。复合设备的关键是通过一个 USB 设备的描述符体系暴露多个接口功能,再由 Host 分别识别和处理。不同操作系统的具体驱动绑定和设备呈现方式可能不同,但基本思想都是通过接口和相应的类规范识别功能。理解一个 USB 设备如何通过多个接口提供不同功能,并认识复合设备的描述符组织方式。

2026-10-28 15:54:10 203

原创 第7讲:HID 设备——做一个键盘或鼠标

HID 规范不仅定义了接口类别,还定义了设备如何描述自己的报告格式,以及如何通过 Input、Output 和 Feature Report 等机制交换数据。理解 HID 为什么通常可以使用系统通用驱动,认识 Report Descriptor,并了解键盘和鼠标的基本报告格式。例如,按下字母 A 时,设备上报的是对应的 HID Usage,而不是直接发送 ASCII 字符。绝对坐标的报告格式和逻辑范围必须通过描述符定义清楚。所以,在编写 HID 固件时,不能只关心报告长度,还必须确认每个字段的语义。

2026-10-28 12:24:41 45

原创 第6讲:CDC 虚拟串口——第一个完整实验

电脑端虽然可能显示 COM 端口,但 USB 线上传输的仍然是 USB 数据,并没有因此变成 UART 电平信号。CDC ACM 让电脑端能够使用熟悉的串口 API,但底层依然遵循 USB 的 Host 调度、端点和传输规则。理解 CDC 虚拟串口与真正 UART 的区别,了解通用实现步骤,并掌握收发过程中的常见问题。所以,如果 MCU 直接实现 USB CDC,通常不需要额外的 USB 转 UART 芯片。先验证设备能否正常枚举,再测试电脑向设备发送固定字符串,然后测试设备返回固定字符串。

2026-10-27 11:38:03 177

原创 第5讲:USB 类(Class)是什么,为什么要关心

假设有十家厂商生产 USB 键盘,每家都使用完全不同的数据格式。那么操作系统就可能需要针对每一家厂商开发一套驱动,用户使用和维护起来都会非常麻烦。USB 类规范就是为了解决这类问题而设计的。它通过统一设备的行为、请求和数据格式,让操作系统可以使用通用驱动支持符合规范的设备。因此,USB Class 不只是一个编号,而是一套通信约定。标准类的优势是兼容性。只要设备遵守相应类规范,并且目标操作系统具有合适的驱动支持,通常就可以利用系统提供的通用驱动。厂商自定义类则不同。当接口类代码声明为FFh。

2026-10-26 09:05:04 216

原创 第4讲:端点、管道与四种传输类型

设备刚连接到电脑时,Host 还不知道设备的具体功能,但需要先读取描述符、分配地址和选择配置。控制传输负责管理,中断传输适合周期性的小数据,批量传输适合可靠的大量数据,等时传输适合对时序要求较高的实时数据。用于描述相应端点的服务间隔,但它的解释与总线速度、传输类型以及 USB 规范的规定有关。例如,播放实时音频时,数据晚到可能比丢失少量数据更糟糕,因为过期的数据已经错过播放时间。理解端点和管道的区别,掌握控制、中断、批量、等时四种传输类型分别解决什么问题。每个端点具有自己的编号、方向和传输属性。

2026-10-25 12:32:34 207

原创 第3讲:描述符——USB设备的身份证体系

但这里有个问题:一个设备可能有多个功能,例如一个 USB 设备既是键盘,又是鼠标,还提供一个虚拟串口。但它们并不是 USB 设备功能的全部描述。学完这一讲,你应该能够理解 USB 描述符为什么分成多个层级,知道每一层描述符负责什么,并且能够拿到一段设备描述符后,尝试逐个字段解释它的含义。所以,如果你在抓包中发现电脑先读取一小段配置描述符,随后又读取更长的一段,这通常是正常的枚举过程,不一定是设备发生了异常。配置描述符后面还可能包含接口描述符、端点描述符和类专用描述符,因此整个配置集合的长度并不是固定的。

2026-10-24 12:23:13 305

原创 第2讲:USB不是串口——通信机制的本质区别

看看设备描述符、配置描述符、接口描述符和端点描述符分别告诉了电脑什么信息。

2026-10-23 08:49:49 241

原创 第1讲:插上USB,电脑怎么知道你插了什么

Host根据收集到的信息,决定给这个设备加载哪个驱动,然后发送,指定一个非零的配置值。设备接受后进入Configured 状态,从这一刻起,它才可以正式在接口和端点上进行数据传输。如果设备是复合设备(比如一个带音频的摄像头),Host还会在配置内为各个接口分别绑定驱动。整个枚举结束,U盘出现在“此电脑”里,键盘开始响应按键——而这些“功能”的起点,仅仅是一连串Host发起的。如果一个设备的接口类代码是FFh(厂商特定)

2026-10-22 11:46:48 136

原创 USB 教程合集 · 总目录

Vendor Specific类的描述符怎么写Device端发送/接收数据的完整流程Host端用什么工具/库来通信(libusb / PyUSB)一个简单的Host端程序示例本讲是"毕业项目",证明你真正理解了USB。

2026-10-21 14:14:30 568

原创 stm32 IAP 功能,自定义协议,使用 Python 脚本下发固件

【代码】stm32 IAP 功能,自定义协议,使用 Python 脚本下发固件。

2025-05-20 14:53:06 328

原创 封装 ring_buffer,在程序中方便使用缓存

(3)ring_buf_get_claim 和 ring_buf_get_finish 是一对的,用于取出并使用缓存中的数据,功能与 ring_buf_get 相似,但这对函数更加高效,因为它没有拷贝;需要注意的是需要先使用 ring_buf_get_claim 再调用 ring_buf_get_finish。(2)ring_buf_put_claim 和 ring_buf_put_finish 是一对的,用于存入数据到缓存中,功能与 ring_buf_put 相似,但这对函数更加高效,因为它没有拷贝;

2024-04-11 17:53:16 499

原创 btstack移植到stm32f103问题记录

通过打断点、查看变量值发现经常出现期望接收size个数据,但只接收了size-1个字节,也就是少了一个字节数据,所以导致不会产生DMA中断,这个问题还需继续排查,解决(2月17日晚,经排查发现在波特率较高时,串口DMA经常接收数据不全,待证明协议栈是因为使用了HAL库导致效率较低,而没有及时调用串口DMA接收数据,导致数据丢失)。(这里卡了好久,估计有一天半,主要是之前解决问题的思路不对,总是在驱动那里找问题,找了很久也没发现问题,后来改变思路,在L2cap层找问题,几个小时就发现问题了)。

2023-07-11 19:27:50 794

原创 音频采样率转换处理

样条插值法是一种更加复杂的插值方法,它假设采样点之间的信号是光滑的,通过已知的多个采样点,可以推算出它们之间的任意一个采样点。线性插值法是一种简单的插值方法,它假设采样点之间的信号是线性的,通过已知的两个采样点,可以推算出它们之间的任意一个采样点。在音频处理中,插值法是一种常用的方法,用于将采样率较低的音频数据转换为采样率较高的音频数据。低通滤波(Low-pass filtering):通过低通滤波器将高采样率的音频数据中高于低采样率的频率部分滤掉,得到低采样率的音频数据。

2023-03-29 16:41:52 3918

翻译 Zephyr USB设备控制器驱动程序文档

USB设备控制器驱动层实现低级别控制例程,直接处理硬件。所有设备控制器驱动程序都应实现include/zephyr/drivers/usb/usb_dc.h中描述的API。这允许在不更改上层的情况下集成新的USB设备控制器。使用此API无法在运行时支持多个控制器实例。USB设备控制器API。

2023-03-18 11:31:32 700

翻译 Zephyr USB 设备栈文档

USB设备栈是USB设备控制器驱动程序和USB设备类驱动程序或客户应用程序之间的硬件独立接口。它是LPCUSB设备堆栈的一个端口,随着时间的推移已经被修改和扩展。它提供以下功能:(1)使用设备控制器驱动程序提供的api与USB设备控制器进行交互。(2)响应标准设备请求并返回标准描述符,本质上处理“第9章”处理,特别是来自通用串行总线规范修订版2.0的表9-3中的标准设备请求。(3)提供USB设备类或客户应用程序使用的编程接口。

2023-03-18 10:25:34 1004

原创 用btstack开发一个简单的蓝牙自拍杆

用btstack开发一个简单的蓝牙自拍杆

2023-02-17 15:04:57 1052 1

原创 btstack源码分析---基于单片机裸机运行的驱动层架构介绍

基于单片机裸机运行的驱动层架构介绍

2023-02-11 17:59:18 2597 2

原创 btstack源码分析---HCI层与硬件接口的数据传输

从源码层面分析HCI层是如何从uart读取数据、HCI层的数据怎样传给uart最后发给蓝牙Controller的。

2023-02-11 15:39:53 756

原创 使用Frontline工具实时抓取蓝牙协议HCI LOG数据

使用UART抓取蓝牙协议栈HCI日志

2023-02-07 20:17:24 5177

原创 蓝牙协议分析工具Frontline 15安装与使用

蓝牙协议分析工具Frontline 15安装与使用

2023-02-04 18:27:42 11374 6

原创 btstack源码分析---HCI层数据处理

btstack 开源协议栈源码分析

2022-12-15 20:35:17 742

原创 I2C通信协议

I2C通信协议

2022-09-25 19:53:08 311

原创 stm32时钟系统

STM32时钟系统

2022-09-24 10:50:30 3210

原创 vue开发环境搭建与项目创建

1. 安装 node.js(1)安装包下载(官网下载比较慢,推荐使用下面的链接)http://nodejs.cn/download/

2022-02-06 09:02:07 252

原创 pyqt5开发桌面应用

1.QtDesigner 设计视图窗口2.把xxx.ui转换成xxx.pypyuic5 xxx.ui -o xxx.py

2021-07-30 17:35:47 582

原创 Centos7下部署启动springboot项目

1、先下载免安装配置的jdk,解压放在root/jdk_path//下wget https://repo.huaweicloud.com/java/jdk/11.0.2+7/jdk-11.0.2_linux-x64_bin.tar.gz tar -zxf jdk-11.0.2_linux-x64_bin.tar.gz -C jdk_path/2、上传springboot生成的jar包,假如名称为 kwunphi-backstage-0.0.1-SNAPSHOT.jar3、启动springboot

2021-07-28 15:51:57 585

原创 python线程封装

1.新建mythread.py文件,线程封装成类,再建个函数调用import threadingclass myThread(threading.Thread): def __init__(self, name, funtion): threading.Thread.__init__(self) self.name = name self.funtion = funtion def run(self): p

2021-07-14 20:23:11 475

原创 Spring注解开发

1.spring原始注解spring原始注解主要是替代的配置注解说明@Component使用在类上,用于实例化Bean@Controller使用在Web层类上,用于实例化Bean@Service使用在service层类上,用于实例化Bean@Repository使用在dao层类上,用于实例化Bean@Autowired使用在字段上,用于根据类型依赖注入@Qualifier结合Autowired一起使用用于根据名称进行依赖注入@Resou

2021-07-10 17:18:59 121

Zephyr 中文文档 V1.6版本

Zephyr 中文文档 V1.6版本

2023-08-09

LVGL库的相关学习资料

LVGL库的相关学习资料

2023-06-15

flash_download_tool_3.9.4_0.zip

flash_download_tool_3.9.4_0.zip

2023-02-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除