当前位置: 首页 > news >正文

BLE自适应跳频算法详解

前言

(1)自适应跳频算法是相当的简单,小学生都能够看懂,而且网上已经有相当多的关于自适应跳频算法的介绍。既然如此,为什么我还要写这样一篇博客呢?
(2)原因很简单,我发现各位大佬可能是觉得自适应跳频算法太简单,以至于又加上了一堆其他深奥的内容,用以拔高整篇博客质量。当然,深度提高了,但是对于我这种小菜鸡来说,就容易搞的脑壳痛。
(3)因此,这里小菜鸡斗胆再写一篇博客介绍一下自适应跳频算法,并举例进行分析。

为什么需要自适应跳频算法

(1)首先我们需要知道BLE40个信道分布如下。

在这里插入图片描述

(2)在40个信道中,数据信道0 ~ 811 ~ 2024 ~ 31这些信道都将会与WI-FI信道进行冲突。除了常见的WI-FI以外,因为2.4GHZ频段属于免费频段因此还会有例如Zigbee等协议采用该频段,造成拥挤。

在这里插入图片描述

(3)为了保证BLE通讯过程中,降低与其他无线电协议产生碰撞几率,就需要使用一个跳频算法来进行保证。
(4)因此,我们即可知道,自适应跳频算法就是一种频率跳变的无线电技术,它能够屏蔽差的信道并将其重新映射到好的信道

自适应跳频算法介绍

自适应跳频算法公式

(1)跳频算法公式如下:
<1> f n f_{n} fn : 当前BLE连接事件使用的信道。
<2> f n + 1 f_{n+1} fn+1 : 下一次BLE连接事件使用的理论信道。
<3> h o p hop hop : 每次跳频的间隔,值为5~16
<3> % \% % : 取余,因为数据信道只有37个。

f n + 1 = ( f n + h o p ) % 37 f_{n+1}=(f_{n} + hop) \% 37 fn+1=(fn+hop)%37

(2)在跳频算法中,我们计算出来的 f n + 1 f_{n+1} fn+1 可能并不是可用信道,因此就需要ChannelMapUsednumUsed这三个参数了。
<1>ChannelMap5byte数据,实际使用37bit,用来表示设备间传输的信道图。其中0表示信道不可用,1表示信道可用。高位表示信道数高,低位为信道数低
<2>Used : 一个数组,用来记录当前ChannelMap中的可用信道。
<3>numUsed : 可用信道数量。
(3)当我们在上述的跳频算法中,获得的 f n + 1 f_{n+1} fn+1并不是可用信道时,就需要再使用如下算法得重映射后的信道。
<1> C h a n n e l Channel Channel : 重映射后的信道。
<2> U s e d [ ] Used[] Used[] : 可用信道数组
<3> f n + 1 f_{n+1} fn+1 : 下一次BLE连接事件使用的理论信道。
<4> % \% % : 取余,因为可用数据信道只有numUsed个。
<5> n u m U s e d numUsed numUsed : 可用信道数量。

C h a n n e l = U s e d [ f n + 1 % n u m U s e d ] Channel = Used[f_{n+1} \% numUsed] Channel=Used[fn+1%numUsed]

自适应跳频算法举例说明

所有信道均正常

(1)首先,我们假设0~37个信道都是可供BLE进行使用的。那么此时的
<1>ChannelMap = 0001 1111 1111 1111 1111 1111 1111 1111 1111 1111
<2>Used = [0,1,2,3,4,5,...,35,36]
<3>numUsed = 37
(2)我们预设hop值为5,初始信道 f n f_{n} fn0,那么信道分布如下:
<0>我们第一个信道设置为0,为好信道,因此无需进行重映射。因此实际信道也为0。
<1>因为上一个信道 f n f_{n} fn0hop5,所以 f n f_{n} fn+hop = 5,5 % 37 = 5。而信道5为可用信道,因此此时采用信道5
<…>
<8>因为上一个信道 f n f_{n} fn35,所以 f n f_{n} fn+hop = 40,40 % 37 = 3。而信道3为可用信道,因此此时采用信道3

连接事件计数器未映射时信道是否进行映射实际信道
000
155
21010
31515
42020
52525
63030
73535
833

部分信道正常

(1)上述情况为理想状态,那么我们现在假设3个主要的WI-FI信道都正在使用,此时的
<1>ChannelMap = 0001 1110 0000 0000 1110 1111 1111 0110 0000 0000。注意,从左到右表示360信道。
<2>Used = [9,10,21,22,23,33,34,35,36]
<3>numUsed = 9
(2)我们预设hop值为7,初始信道 f n f_{n} fn7,那么信道分布如下:
<0>首先,因为我们的初始信道 f n f_{n} fn7,而信道7不是可用信道,因此它会被重映射。因为numUsed = 9,所以 f n + 1 m o d n u m U s e d = 7 m o d 9 = 7 f_{n+1} \ mod \ \ numUsed = 7 \ mod \ 9 = 7 fn+1 mod  numUsed=7 mod 9=7。又因为Used[7] = 35,因此最终重映射后的实际信道为35
<…>后面计算方法同理。

连接事件计数器未映射时信道是否进行映射实际信道
0735
11433
22121
32810
43535
5533
61222
71910
82636
93333
10322
111010

自适应跳频算法学习存在问题

为什么hop为5~16?

(1)根据上面的例子,想必各位已经能够成功掌握自适应跳频算法了。那么,我们此时是否应该思考一个问题,为什么跳频算法的跳数值hop是在5~16范围内呢?
(2)因为大多数干扰一般都会占据几兆带宽,使用过小的hop值,并不能快速的脱离干扰源,这样将会造成持续的干扰。
(3)同理,如果使用过大的hop值,也无法快速脱离干扰源。根据前面所说的跳频算法,如果我们的 f n = 20 f_{n} = 20 fn=20 h o p = 17 hop = 17 hop=17,那么第一次信道为20,第二次就是0,第三次就是17。 这样我们会发现第一次和第三次的信道差距仅仅3个信道。

存在一个好信道,为什么不一直使用到不能使用为止?

(1)通过上面的了解,我们又会发现一个问题。如果某个信道是可用的,那为什么还需要跳到下一个信道中呢?按照常识来说,既然我们找到了一个可用信道,不应该一直使用该信道,直到该信道不可用为止吗?
(2)这个时候我们就需要考虑到一个问题,我们发现当前信道不可用了,那么做出改变,还来得及吗?因为数据信道大多和WI-FI的信道存在冲突,而WI-FI这种互联网流量存在突发性。当我们突然发现该信道不可用了,那么我们想通知对端设备更改信道,此时会发现,信息将无法有效的被对端设备接收。
(3)一旦信道失效,BLE设备就需要断开连接,重新进行连接同步,这将会耗费许多能量。
(4)而且处于同一区域的网络,会自发的选择干净的频率。如果使用单信道模型,将会出现,短时间相同信道网络数量激增情况。(这个从现实角度举例,就好比大家发现某个专业很好,就都一股脑往里面冲,最终导致内卷严重)
(5)如果使用跳频算法,将能够对网络流量在时域频域做出合理的分配,这样就能够允许大量的网络在同一区域同时工作。(注意,这个“同时”是较大的单位,例如分钟。如果从us级单位来看,并不是同时工作)
(6)最终,BLE设备采用是的,一个连接事件之内保持相同信道进行数据的交互,在下一个连接事件到来之时,将会换至另外一个信道中进行通讯

参考

(1)低功耗蓝牙开发权威指南 — 7.4 信道
(2)低功耗蓝牙开发权威指南 — 7.7.5 信道图
(3)低功耗蓝牙开发权威指南 — 7.11.1 自适应跳频
(3)低功耗蓝牙开发权威指南 — 7.12.5 单信道连接事件

相关文章:

BLE自适应跳频算法详解

前言 &#xff08;1&#xff09;自适应跳频算法是相当的简单&#xff0c;小学生都能够看懂&#xff0c;而且网上已经有相当多的关于自适应跳频算法的介绍。既然如此&#xff0c;为什么我还要写这样一篇博客呢&#xff1f; &#xff08;2&#xff09;原因很简单&#xff0c;我发…...

[Meachines] [Easy] Beep Elastix-CMS-LFI

信息收集 IP AddressOpening Ports10.10.10.7TCP:22, 25, 80, 110, 111, 143, 443, 993, 995, 3306 $ nmap -p- 10.10.10.7 --min-rate 1000 -sC -sV Nmap scan report for 10.10.10.7 (10.10.10.7) Host is up (0.53s latency). Not shown: 65486 filtered tcp ports (no-…...

甘肃麻花:酥脆香甜的陇原美味

在甘肃的美食画卷中&#xff0c;甘肃麻花以其独特的魅力占据着重要的一席之地。甘肃食家巷麻花&#xff0c;那金黄酥脆的外形&#xff0c;宛如一件件精美的艺术品。每一根麻花的纹理都清晰可见&#xff0c;缠绕交织&#xff0c;散发着诱人的光泽。 制作甘肃麻花是一门传统的手艺…...

C语言刷题小记2

前言 本篇博客还是为大家分享一些C语言的OJ题目&#xff0c;如果你感兴趣&#xff0c;希望大佬一键三连。多多支持。下面进入正文部分。 题目1竞选社长 分析&#xff1a;本题要求我们输入一串字符&#xff0c;并且统计个数的多少&#xff0c;那么我们可以通过getchar函数来获…...

JavaScript图片轮播

代码在文章最后面&#xff08;含图片URL&#xff09; 实现功能 按向左按钮图片显示上一张按向右按钮图片显示下一张每隔2000毫秒显示下一张图底部三个圆点显示当前的图片的编号 实现流程 初始化图片数组 创建一个包含图片URL的数组&#xff0c;轮播时会通过这个数组来切换图…...

MSSQL注入前置知识

简述 Microsoft SQL server也叫SQL server / MSSQL&#xff0c;由微软推出的关系型数据库&#xff0c;默认端口1433 常见搭配C# / .net IISmssql mssql的数据库文件 数据文件&#xff08;.mdf&#xff09;&#xff1a;主要的数据文件&#xff0c;包含数据表中的数据和对象信息…...

idea一键为实体类赋值

file -> settings -> plugins -> marketplace 把这个插件装上 找个实体&#xff0c;选中&#xff0c;altenter进入edit界面 我是选择只保留右边这种生成方法&#xff0c;然后选择ok 返回到那个实体&#xff0c;选择&#xff0c;altenter generate生成...

秋招突击——7/24——知识补充——JVM类加载机制

文章目录 引言类加载机制知识点复习类的生命周期1、加载2、连接——验证3、连接——准备4、连接——解析5、初始化 类加载器和类加载机制类加载器类加载机制——双亲委派模型 面试题整理1、类加载是什么2、类加载的过程是什么3、有哪些类加载器&#xff1f;4、双亲委派模型是什…...

如何在 Microsoft SQL Server 中增加字段-完整指南

在使用 Microsoft SQL Server (MSSQL) 进行数据库管理时,添加新字段(列)是一项常见的任务。无论你是需要存储额外的信息,还是调整数据模型以适应新的业务需求,本指南都将帮助你轻松完成这项操作。 目录 1. 使用 T-SQL 添加字段2. 使用 SQL Server Management Studio (SSMS) 添加…...

快手电商Android一面凉经(2024)

快手电商Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《快手电商Android一面凉经(2024)》。 面试职位: Android工程师 技术一面 面试形式…...

随机点名器

练习1 package lx;import java.io.*; import java.util.ArrayList; import java.util.Collections; import java.util.Random;/*需求&#xff1a;需求&#xff1a;有一个文件里面存储了班级同学的信息&#xff0c;每一个信息占一行。格式为&#xff1a;张三-男-23要求通过程序…...

添加动态云层

<template> <div class"topbox"> xx卫星管理 </div> <div class"selectbox"> <div class"title"> 卫星列表 </div> <el-table :data"tableData" style"width: 100%;height:230px;" …...

Spring Boot组成的分布式系统中实现日志跟踪

Spring Boot组成的分布式系统中实现日志跟踪 首发2024-07-25 08:54潘多编程 在分布式系统中&#xff0c;日志跟踪是一项非常重要的功能&#xff0c;它帮助开发者了解请求在整个系统中的流转过程&#xff0c;这对于调试、监控和故障排查至关重要。Spring Boot应用通常作为微服…...

GPT-4o Mini 模型的性能与成本优势全解析

GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8; &#x1f31f; GPT-4o Mini 模型的性能与成本优势全解析 &#x1f4c8;摘要引言正文内容GPT-4o Mini 模型简介 &#x1f680;性能测试与对比 &#x1f4ca;应用场景 &#x1f310;自然语言处理对话系统内容生成 ✍️ &am…...

web前端 - HTML 基础知识大揭秘

HTML 大揭秘 什么是 HTML HTML&#xff08;Hyper Text Markup Language&#xff09;&#xff0c;中文译为超文本标记语言。其中&#xff0c;我们需要注意两个关键词。一个是 超文本&#xff0c;一个是 标记。所谓超文本&#xff0c;就是将不同空间的文字信息通过超链接的方式…...

HTML meta

<meta>标签用于提供html文档的元信息&#xff08;metadata&#xff09;。这些信息不会显示在页面上&#xff0c;但会被浏览器或搜索引擎用来识别页面的编码方式、关键字、描述、作者信息、刷新时间等。 基本语法 <meta name"属性名" content"属性值&q…...

【学习笔记】子集DP

背景 有一类问题和子集有关。 给你一个集合 S S S&#xff0c;令 T T T 为 S S S 的超集&#xff0c;也就是 S S S 所有子集的集合&#xff0c;求 T T T 中所有元素的和。 暴力1 先预处理子集的元素和 A i A_i Ai​&#xff0c;再枚举子集。 for(int s0; s<(1<…...

苦学Opencv的第十四天:人脸检测和人脸识别

Python OpenCV入门到精通学习日记&#xff1a;人脸检测和人脸识别 前言 经过了十三天的不懈努力&#xff0c;我们终于也是来到了人脸检测和人脸识别啦&#xff01;相信大家也很激动吧。接下来我们开始吧&#xff01; 人脸识别是基于人的脸部特征信息进行身份识别的一种生物识…...

PyTorch学习(1)

PyTorch学习&#xff08;1&#xff09; CIFAR-10数据集-图像分类 数据集来源是官方提供的&#xff1a; torchvision.datasets.CIFAR10()共有十类物品&#xff0c;需要用CNN实现图像分类问题。 代码如下&#xff1a;(CIFAR_10_Classifier_Self_1.py) import torch import t…...

三思而后行:计算机行业的决策智慧

在计算机行业&#xff0c;"三思而后行"这一原则显得尤为重要。在这个快速发展、技术不断更新换代的领域&#xff0c;每一个决策都可能对项目的成功与否产生深远的影响。以下是一篇关于在计算机行业中三思重要性的文章。 三思而后行&#xff1a;计算机行业的决策智慧 …...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

反射获取方法和属性

Java反射获取方法 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的机制&#xff0c;允许程序在运行时访问和操作类的内部属性和方法。通过反射&#xff0c;可以动态地创建对象、调用方法、改变属性值&#xff0c;这在很多Java框架中如Spring和Hiberna…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

GitFlow 工作模式(详解)

今天再学项目的过程中遇到使用gitflow模式管理代码&#xff0c;因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存&#xff0c;无论是github还是gittee&#xff0c;都是一种基于git去保存代码的形式&#xff0c;这样保存代码…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...