蓝牙学习九(定向广播 ADV_DIRECT_IND)

一、简介

        广播类型有如下:

        非定向可连接广播ADV_IND)。可连接的非定向广播,表示当前设备可以接受任何设备的连接请求

        定向可连接广播ADV_DIRECT_IND)。可连接的定向广播,设备不能被主动扫描

        非定向不可连接广播ADV_NONCONN_IND)。不可连接的非定向广播,仅发送广播数据,而不被连接。设备不能被主动扫描

        非定向可发现不可连接广播ADV_DISCOVER_IND/ADV_SCAN_IND)。可扫描非定向广播,设备可以被发现。即可以发送广播数据,也可以响应扫描发送回应数据,但不能建立链接

        如果忘记了,可以回顾一下之前的文章:蓝牙学习四(广播)_蓝牙广播-CSDN博客

        本章主要介绍ADV_DIRECT_IND定向可连接广播

二、定向广播PDU

        当使用定向可连接广播时,链路层将发送定向广播数据包。也就是说,链路层将不会发送之前设置的广播内容,比如名字外貌等等。而是发送特定内容类型的广播帧。

        定向广播指示数据包中包含如下内容

        Access Address访问地址

        Packet HeaderPDU包头)   

        Advertising Address广播地址

        Target Address目标地址

       访问地址还是熟悉的0x8e89bed6通用访问地址

        PDU包头中包含了广播类型,和发送/接受地址类型。广播类型为ADV_DIRECT_IND定向可连接广播。

        广播地址为设备自身的MAC地址

        目标地址为定向要连接的目标设备的地址

        可连接定向广播类型允许主机响应广播事件,从而使得广播者和主机均进入连接状态。 可连接定向广播采用ADV_DIRECT_IND或者ADV_EXT_IND两种数据包类型,前者在主广播信道上发送,后者在主广播信道上发送并指向在副广播信道上发送的辅助广播AUX_ADV_IND数据包。       

三、ADV_DIRECT_IND

        ADV_DIRECT_IND广播类型使得发起者(主机)能在主广播物理信道上响应链接请求,从而建立ACL(异步无连接,一主多从之间的多点连接)连接。ADV_DIRECT_IND的PDU中包含发起者设备地址广播者设备地址仅寻址的发起者可通过向广播者发送CONNECT_IND数据包发起ACL连接。

        发起者在一个广播信道发送ADV_DIRECT_IND的数据包后,应在相同的广播信道上监听CONNECT_IND数据包,并忽略可能接收到的任何SCAN_REQ数据包。

        当广播者接收到包含其设备地址的CONNECT_IND数据包,且此PDU的设备地址与之前发送的ADV_DIRECT_IND数据包中包含的目标设备地址相同时,应退出广播状态,并切换到连接状态

        当广播者在该信道上没有接收到目标地址的CONNECT_IND时,应转移到下一个主广播物理信道上再次发送ADV_DIRECT_IND数据包,或者关闭广播事件

        ADV_DIRECT_IND中包含“high duty cycle(高占空比)”和“low duty cycle(低占空比)”两种模式。

        高占空比可连接定向广播,用于快速ACL连接/重连。该模式为高能耗以及高带宽占用广播模式,仅在需要快速建立连接时使用。

        低占空比可连接定向广播,用于慢速ACK连接/重连,或在不知道目标设备是否在通讯范围内使用。

3.1、low duty cycle

        在低占空比模式中,在两个ADV_DIRECT_IND数据包发送间隔应小于或等于10毫秒。广播事件应在广播间隔内关闭。

        全部主广播信道发送且未收到CONNECT_IND数据包的低占空比模式广播示意图如下图:

        下图为在第二个广播信道收到CONNECT_IND数据包的示意图: 

         使用wireshark抓取数据包如下图:

        可以看到,依次在37、38、39信道进行广播。且相邻信道到的广播周期在1毫秒左右

        且地占空比定向广播会一直广播广播周期在几十毫秒到几百毫秒

3.2、high duty cycle

         在高占空比模式中,在相同广播信道上发送两个ADV_DIRECT_IND数据包的时间间隔应小于或等于3.75毫秒。链路层在进入广播状态后1.28秒内退出广播状态

        使用wireshark抓数据包:

        可以看到,在两个37信道发送数据包的间隔为3.751毫秒。 

        从数据包中也可以看到广播的频率非常快

        整个广播事件只持续了1.28秒后就停止了。 

四、ADV_EXT_IND

        采用ADV_EXT_IND,发起者(主机)可以在副广播物理信道上响应连接请求,从而建立ACL连接。在此事件中,广播者每发送一个AUX_ADV_IND数据包后,均应在相同的付广播物理信道上监听是否有AUX_CONNECT_REQ数据包,并应忽略可能存在的任何AUX_SCAN_REQ数据包

        当隐私未激活时,广播者接收到包含其设备地址的AUX_CONNECT_REQ数据包,且发起者的设备地址包含在之前AUX_ADV_IND数据包中,广播者应在相同的副广播信道上响应包含此设备地址的AUX_CONNECT_RSP数据包。完成AUX_CONNECT_RSP数据包发送后,广播设备的链路层应退出广播模式,并进入连接状态。任何在副广播物理信道上接收到的AUX_SCAN_REQ数据包均应被忽略。

        广播事件中的两个ADV_EXT_IND数据包时间间隔应小于或等于10毫秒。广播事件应在广播间隔内关闭。

        副广播信道索引SAdv_idx在ADV_EXT_IND数据包中的AuxPtr字段中指明。

        下图为ADV_EXT_IND但未接收到AUX_CONNECT_REQ的情况

        下图为ADV_EXT_IND并在副广播信道索引上接收到AUX_CONNECT_REQ数据包

        因为目前还没有使用过 ADV_EXT_IND,所以这里不做实例分析。

参考:

低功耗蓝牙广播事件类型之可连接定向广播 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/299352.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VTK中polydata的属性数据结构表示和用法

vtk中通过vtkDataArray进行数据的存储,通过vtkDataObject进行可视化数据的表达,在vtkDataObject内部有一个vtkFieldData的实例,负责对数据的表达: vtkFieldData存储数据的属性数据,该数据是对拓扑结构和几何结构信息的…

Unity自定义框架(1)-----------单例模式

前言: Unity作为一款强大的游戏开发引擎,其基础框架的设计对于项目的结构和性能有着重要的影响。其中,单例模式是一种常用的设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 什么是单例模式&#xff1f…

深入理解Java异常处理机制(day20)

异常处理 异常处理是程序运行过程产生的异常情况进行恰当的处理技术 在计算机编程里面,异常的情况比所我们所想的异常情况还要多。 Java里面有两种异常处理方式; 1.利用trycatchfinaly语句处理异常,优点是分开了处理异常代码和程序正常代码…

Jenkins (三) - 拉取编译

Jenkins (三) - 拉取编译 通过Jenkins平台 git 拉取github上项目,通过maven编译并打包。 Jenkins 安装 git 插件 Manager Jenkins -> Plugins -> Available plugins -> Git 打包编译检验 FressStyle 风格编译 New Item输入 item name Spring-Cloud-1…

【机器学习300问】60、图像分类任务中,训练数据不足会带来什么问题?如何缓解图像数据不足带来的问题?

在机器学习中,绝大部分模型都需要大量的数据进行训练和学习(包括有监督学习和无监督学习),然而在实际应用中经常会遇到训练数据不足的问题。就比如图像分类这样的计算机视觉任务,确实依赖于大规模且多样化的训练数据以…

出门一笑, “栈” 落江横 (Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. 🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人…

代码随想录算法训练营Day46|LC139 单词拆分

一句话总结:完全背包! 原题链接:139 单词拆分 动态规划之完全背包五部曲: 确定dp数组与下标含义:表示字符串长度为i时,dp[i] true 的话,可以拆分为一个或多个在字典中出现的单词。确定递归公…

K8S基于containerd做容器从harbor拉取镜

实现创建pod时,通过指定harbor仓库里的镜像来运行pod 检查:K8S是不是用containerd做容器运行时,以及containerd的版本是不是小于1.6.22 kubectl get nodes -owide1、如果containerd小于 1.6.22,需要先升级containerd 先卸载旧的…

RabbitMQ3.13.x之六_RabbitMQ使用场景

RabbitMQ3.13.x之六_RabbitMQ使用场景 文章目录 RabbitMQ3.13.x之六_RabbitMQ使用场景1. 为什么选择 RabbitMQ?1. 可互操作2. 灵活3. 可靠 2. 常见用户案例1. 服务解耦2. 远程过程调用3. 流处理4. 物联网 1. 为什么选择 RabbitMQ? RabbitMQ 是一个可靠且…

dm8 备份与恢复

dm8 备份与恢复 基础环境 操作系统:Red Hat Enterprise Linux Server release 7.9 (Maipo) 数据库版本:DM Database Server 64 V8 架构:单实例1 设置bak_path路径 --创建备份文件存放目录 su - dmdba mkdir -p /dm8/backup--修改dm.ini 文件…

【教程】宝塔default.db占用空间几十g解决方法|宝塔占用磁盘空间特别大解决方法|宝塔磁盘被占满怎么清理

目录 一、前言二、排查问题三、解决方法 一、前言 用过宝塔创建网站,大家应该都非常熟悉,但是用随着用的时间越来越多,宝塔所占用的空间也越来越多,不停的加大数据盘都没有用,我原先买了30G够用了,随着时间…

docker-ce部署

目录 1. 更新软件包列表 2. 安装必要的软件包,以允许 apt 使用 HTTPS 3. 添加 Docker 的官方 GPG 密钥 4. 设置 Docker CE 的稳定存储库 5. 再次更新包索引以及安装 Docker CE 6. 验证 Docker CE 是否正确安装 7. 将当前用户添加到 docker 用户组,…

智慧牧场数据 7

1 体征数据采集 需求:获取奶牛记步信息 三轴加速度测量:加速度测量计反应的加速向量与当前的受力方向是相反,单位为g 陀螺仪,是用来测量角速度的,单位为度每秒(deg/s) 2000deg/s 相当于1秒钟多少转 1.1…

苹果终止电车项目后大裁员,押注家用机器人,这会是Next Big Thing吗?

ChatGPT狂飙160天,世界已经不是之前的样子。 新建了免费的人工智能中文站https://ai.weoknow.com 新建了收费的人工智能中文站https://ai.hzytsoft.cn/ 更多资源欢迎关注 新的出路,苹果能让我们耳目一新吗? 苹果公司压力山大,何以…

彩虹聚合DNS管理系统v1.0全新发布

聚合DNS管理系统(https://github.com/netcccyun/dnsmgr)可以实现在一个网站内管理多个平台的域名解析,目前已支持的域名平台有:阿里云、腾讯云、华为云、西部数码、CloudFlare。本系统支持多用户,每个用户可分配不同的…

【JSON2WEB】 12基于Amis-admin的动态导航菜单树

【JSON2WEB】01 WEB管理信息系统架构设计 【JSON2WEB】02 JSON2WEB初步UI设计 【JSON2WEB】03 go的模板包html/template的使用 【JSON2WEB】04 amis低代码前端框架介绍 【JSON2WEB】05 前端开发三件套 HTML CSS JavaScript 速成 【JSON2WEB】06 JSON2WEB前端框架搭建 【J…

Day:004(1) | Python爬虫:高效数据抓取的编程技术(数据解析)

数据解析-正则表达式 在前面我们已经搞定了怎样获取页面的内容,不过还差一步,这么多杂乱的代码夹杂文字我们怎样 把它提取出来整理呢?下面就开始介绍一个十分强大的工具,正则表达式! 正则表达式是对字符串操作的一种…

RabbitMQ3.13.x之七_RabbitMQ消息队列模型

RabbitMQ3.13.x之七_RabbitMQ消息队列模型 文章目录 RabbitMQ3.13.x之七_RabbitMQ消息队列模型1. RabbitMQ消息队列模型1. 简单队列2. Work Queues(工作队列)3. Publish/Subscribe(发布/订阅)4. Routing(路由)5. Topics(主题)6. RPC(远程过程调用)7. Publisher Confirms(发布者…

不同设备使用同一个Git账号

想要在公司和家里的电脑上用同一个git账号来pull, push代码 1. 查看原设备的用户名和邮箱 第1种方法, 依次输入 git config user.name git config user.email第2种方法, 输入 cat ~/.gitconfig2. 配置新设备的用户名和邮箱 用户名和邮箱与原设备保持…

vue结合Elempent-Plus/UI穿梭框更改宽度以及悬浮文本显示

由于分辨率不同会导致文本内容显示不全,如下所示: 因此需要 1、悬浮到对应行上出现悬浮信息 实现代码如下所示: 这里只演示Vue3版本代码,Vue2版本不再演示 区别就在插槽使用上Vue3使用:#default“”;Vu…