[SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈
前言
之前我已经陆续出了 3 篇蓝牙收和 2 篇蓝牙发的视频,将蓝牙 BLE 广播收发的协议栈讲的非常清楚了:

图片来源:https://www.beautifulzzzz.com/gnuradio/

这里将其单独拎出来组成一个 BLE + SDR 的专题,用于汇总关于蓝牙协议栈在 SDR 上实现的各种技术点。
一、开题之作
为了方便后续代码构建,我将之前零零散散的关于 BLE+SDR 的相关工程代码,全部合并到一个独立仓库中 auto_test_tool。
PS: 这个仓库是之前我的一个很老的仓库,用于编写一些简单的自动化测试的 python 串口工具,因为里面有些组件整合适合 BLE 广播包的解析与发送,因此就在这里附加了。
为了防止后续的课程对代码修改导致老课程不方便复现,我这里每个课程都会生成一个 tag,这样每个课程都可以拉取对应的 tag 来还原现场。比如,我们这个开题之作采用的是 ble_course_1,因此可以使用下面三种方式拉取代码:
| 方法 | 命令 | 备注 |
|---|---|---|
| https | git clone --branch ble_course_1 https://github.com/nbtool/auto_test_tool.git |
小白懂 git 但不懂 ssh |
| ssh | git clone --branch ble_course_1 git@github.com:nbtool/auto_test_tool.git |
既懂 git 又懂 ssh |
| 点击下载 | https://github.com/nbtool/auto_test_tool/releases/tag/ble_course_1 | 啥都不懂 |
OK,开题相关的铺垫到此结束,那么硬核的东西也不能少:

如上图,我将之前的所有 BLE 广播包接收教程的代码全部重新整理,形成上图所示能兼容 hackrf、plutosdr、limesdr 和 zmq 等不同 SDR 源的蓝牙广播接收解析系统(抓包器)。
具体的教程细节见:app/app_sdr_ble_adv_rx
二、动态发送 BLE 广播包
上节我们将 BLE 广播包接收代码进行全部整理,本节我们将 BLE 广播包发送代码进行全部整理,实现每隔 1S 更换广播内容,并从零开始合成 BLE 广播 IQ 数据,然后调用 SDR 发送,实现 BLE 动态广播能力:

具体的教程细节见:app/app_sdr_ble_adv_tx
三、基于 PlutoSDR 实现 BLE 广播包的收发一体能力
本节将前两节的知识结合起来,借助具有全双工双收双发能力的 PlutoSDR 实现 BLE 广播包收发一体能力:

具体的教程细节见:app/app_sdr_ble_adv_tx_rx
四、基于 PlutoSDR 的 BLE 广播包的收发实现接入涂鸦智能 APP
本节在上一节的基础上更进一步:通过叠加 TuyaOS BeaconMesh 上层应用协议,最终实现从电磁波开始,到全双工蓝牙广播收发接入涂鸦智能,变成一个物联网 BeaconMesh 灯节点:

具体的教程细节见:app/app_sdr_tuya_beacon_node
教程列表
基础教程:
- [1]. GNU Radio 系列教程(一) —— 什么是 GNU Radio
- [2]. GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图
- [3]. GNU Radio 系列教程(三) —— 变量的使用
- [4]. GNU Radio 系列教程(四) —— 比特的打包与解包
- [5]. GNU Radio 系列教程(五) —— 流和向量
- [6]. GNU Radio 系列教程(六) —— 基于层创建自己的块
- [7]. GNU Radio 系列教程(七)—— 创建第一个块
- [8]. GNU Radio 系列教程(八)—— 创建能处理向量的 Python 块
- [9]. GNU Radio 系列教程(九)—— Python 块的消息传递
- [10]. GNU Radio 系列教程(十)—— Python 块的 Tags
- [11]. GNU Radio 系列教程(十一)—— 低通滤波器
- [12]. GNU Radio 系列教程(十二)—— 窄带 FM 收发系统(基于ZMQ模拟射频发送)
- [13]. GNU Radio 系列教程(十三)—— 用两个 HackRF 实现 FM 收发
- [14]. GNU Radio 系列教程(十四)—— GNU Radio 低阶到高阶用法的分水岭 ZMQ 的使用详解
- [15]. GNU Radio 系列教程(十五)—— GNU Radio GFSK 模块
- [16]. GNU Radio 系列教程(十六)—— GNU Radio 的调试利器 Message Strobe
- [17]. GNU Radio 系列教程(十七)—— GNU Radio PDU TX 利用三个块实现最小的数据包(帧头+数据+校验)
- [18]. GNU Radio 系列教程(十八)—— GNU Radio PDU TX 将帧头和 payload 消息合并为数据帧
- [19]. GNU Radio 系列教程(十九)—— GNU Radio PDU TX 将最小数据帧实施脉冲突发整形填充 --> 让帧更稳定
- [20]. GNU Radio 系列教程(二十)—— GNU Radio PDU TX 根升余弦深度介绍&发送数据帧的收尾之作
- [21]. GNU Radio 系列教程(二一)—— GNU Radio PDU RX 利用相关性估计器寻找数据帧的起始位置
- [22]. GNU Radio 系列教程(二二)—— GNU Radio PDU RX 利用多相时钟同步块实现消除时钟偏移
- [23]. GNU Radio 系列教程(二三)—— GNU Radio PDU RX 利用自适应线性均衡器消除 ISI
- [24]. GNU Radio 系列教程(二四)—— GNU Radio PDU RX 利用 Costas Loop 校正相位和频率偏移
- [25]. GNU Radio 系列教程(二五)—— 硬核,基于通信原理设计一个文件传输系统
- [26]. GNU Radio 系列教程(二六)—— 开胃菜,hackrf 发送 ble 广播包的简单 DEMO
综合教程:
- [1]. SDR 教程实战(一) —— 利用 GNU Radio + HackRF 做 FM 收音机
- [2]. SDR 教程实战(二) —— 利用 GNU Radio + HackRF 做蓝牙定频测试工具(超低成本)
- [3]. SDR 教程实战(三) —— 利用 GNU Radio + HackRF + WireShark 做蓝牙抓包器(超低成本)
- [4]. SDR 教程实战(四) —— 利用 GNU Radio + HackRF 手把手深入了解蓝牙协议栈(从电磁波 -> 01数据流 -> 蓝牙数据包)
- [5]. SDR 教程实战(五) —— 利用 GNU Radio + LimeSDR+ WireShark 做蓝牙抓包器(上上个视频使用 HackRF)
- [6]. SDR 教程实战(五) —— 利用两个 hackrf 实现大文件(视频)高速传输
SDR 小工具教程:
基础块教程:
视频和博客


: 如果觉得不错,帮忙点个支持哈~

[SDR] 蓝牙专项教程 —— 从 0 到 1 教小白基于 SDR 编写蓝牙协议栈的更多相关文章
- Android蓝牙开发教程(三)——蓝牙设备相互通讯
在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...
- ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView
原文地址: ArcGIS Runtime for Android开发教程V2.0(4)基础篇---MapView - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http:/ ...
- ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map
原文地址: ArcGIS Runtime for Android开发教程V2.0(3)基础篇---Hello World Map - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NE ...
- ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置
原文地址: ArcGIS Runtime for Android开发教程V2.0(2)开发环境配置 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.c ...
- ArcGIS Runtime for Android开发教程V2.0(1)基本概念
原文地址: ArcGIS Runtime for Android开发教程V2.0(1)基本概念 - ArcGIS_Mobile的专栏 - 博客频道 - CSDN.NET http://blog.csd ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- yii2 支付宝支付教程 [ 2.0 版本 ]
yii2 支付宝支付教程 [ 2.0 版本 ] 支付宝支付流程个人理解大致就这三步1.前台页面将支付信息数据通过立即支付按钮 ajax提交到订单处理层2.在订单处理层引用支付宝的接口 将支付数据写入 ...
- [转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程
[转]Tomcat9.0安装教程 Tomcat9.0环境变量配置教程 [转]超详细MySQL安装及基本使用教程
- mysql8.0.20安装教程,mysql下载安装教程8.0.20
mysql8.0.20下载安装教程 mysql8.0.20安装教程 mysql安装包+mysql学习视频+mysql面试指南视频教程 下载地址: 链接:https://pan.baidu.com/s ...
- [IOT] 自制蓝牙工牌办公室定位系统 (二)—— 基于ESP32的蓝牙信号扫描系统
前面章节: 自制蓝牙工牌办公室定位系统 (一)-- 阿里物联网平台概览及打通端到云(硬核·干货) 目录: 1.蓝牙广播简介 2.蓝牙扫描简介 3.基于蓝牙广播和蓝牙扫描常见应用 4.ESP32 ...
随机推荐
- w3cschool-Spring Cloud
https://www.w3cschool.cn/spring_cloud/spring_cloud-ryjs2ixg.html Spring Cloud(一)服务的注册与发现(Eureka) 202 ...
- 第六章 dubbo源码解析目录
13.1 dubbo服务降级源码解析 从 9.1 客户端发起请求源码 的客户端请求总体流程图中,截取部分如下: //代理发出请求 proxy0.sayHello(String paramString) ...
- 无网环境Docker Rpm离线安装
总体思路:找一台可以联网的linux,下载docker的RPM依赖包而不进行安装(yum localinstall),将所有依赖的rpm环境打包好,再在无网环境中解压逐一安装(rpm: --force ...
- oracle的新发现for语句
今天为了解决一个查询结果想两次遍历的方法,去ORACLE官网文档中心 https://docs.oracle.com/en/database/oracle/,意外发现这个有意思的for语句.还是官方资 ...
- Windows安装MySql时出现“Failed to find valid data directory”的错误
1.问题描述 具体错误信息如下所示: 2021-08-13T06:18:24.942954Z 0 [System] [MY-010116] [Server] D:\Net_Program\Net_My ...
- Python实战:为Prometheus开发自定义Exporter
Python实战:为Prometheus开发自定义Exporter 在当今的微服务架构和容器化部署环境中,监控系统的重要性不言而喻.Prometheus作为一款开源的系统监控和警报工具,以其强大的功能 ...
- Q:Linux查看进程启动服务的精确时间
输入命令 获取进程号 #1#获取进程号ps -ef|grep java|grep 进程名#2#获取启动时间ps -p 进程号 -o lstart 展示启动时间:星期 月 日 小时:分钟:秒 年 一键 ...
- Luogu P9870 NOIp2023 双序列拓展 题解 [ 紫 ] [ 动态规划 ] [ 分治 ] [ adhoc ]
双序列拓展:很妙的特殊性质类 dp 题,由部分分引导向正解. 题意简化 你可以把序列 \(X\) 和序列 \(Y\) 中的每一个数复制若干倍并接到这个数后面,问能否构造出一种方案,使得两个序列长度相等 ...
- .Net Core 项目启动方式
本文篇幅较小,讲解如何通过命令行启动项目 接着上一章的Core WebApi(https://www.cnblogs.com/zousc/p/12420998.html),我们已经有了Hello这个控 ...
- AI在电子游戏中的应用:如何让虚拟世界更具沉浸感
在过去的几十年里,电子游戏已从简单的像素化图形演变为高度复杂.视觉震撼的虚拟世界.从<超级马里奥>到<荒野大镖客2>,游戏的画面.音效和交互方式不断突破技术的极限.近年来,人工 ...