Bluetooth 蓝牙介绍(三):低功耗蓝牙BLE空口协议Ⅱ

2023-11-10

前言

上篇文章介绍了非连接态下空口的各种状态的表现,现在让我们一起看下在连接态,各种状态又有什么表现。

4.5 CONNECTION STATE

当发起者在主广播物理信道上向广播者发送 CONNECT_IND PDU、广播者在主要广播物理信道上从发起者接收到 CONNECT_IND PDU、广播者在次要广播物理信道上向发起者发送 AUX_CONNECT_RSP PDU 时,链路层进入连接状态, 或者发起者在二级广播物理信道上收到来自广播者的AUX_CONNECT_RSP PDU。进入连接状态后,认为连接已创建。

这里需要说明一下,交互 CONNECT_IND 或者 AUX_CONNECT_REQ/AUX_CONNECT_RSP,这并不代表双方真正的建立起了,连接进入 Connection State,因为空口情况复杂,您并不一定能够保证在这个关键的交互时刻点,对方一定能够收到你发送的这个关键的数据包,万一对方没收到呢?

因此,此时不认为连接已建立。只有从对端设备接收到数据物理通道数据包后,才认为建立连接。连接的创建created 和 连接的建立established 之间的唯一区别是使用的 LinkLayer 连接监督超时值supervision timeout value(一般为连续 6 个 Event 没有包的交互)(请参阅第 4.5.2 节)。

  • 如果首先使用主通告物理信道上的 CONNECT_IND PDU 创建连接,则它应在两个方向上使用 LE 1M PHY。

  • 如果首先使用 AUX_CONNECT_REQ 和 AUX_CONNECT_RSP PDU 在辅助信道上创建连接,则它应在两个方向上使用与 AUX_CONNECT_REQ 和 AUX_CONNECT RSP PDU 相同的 PHY。连接不被认为是在此阶段建立的,随后可以使用 PHY 更新程序(第 5.1.10 节)更改 PHY。

  • 当使用 LE 编码 PHY 时,每个数据包的编码由第 2.2.3 节中定义的 Coding Indicator 确定,并且在每个方向和给定方向的相邻数据包中可能不同。当两个设备连接时,两个设备 扮演不同的角色。

Master 角色中的链路层称为 master。Slave角色中的链路层称为Slave。HOST控制连接事件的时间。连接事件是主从之间的同步点。

无论是否建立,两个 LE 设备地址之间只能有一个连接。发起者不应向其已连接的广播商发送连接请求。如果广播商收到来自其已连接的发起者的连接请求,则应忽略该请求。

如果发起方发送了 CONNECT_IND PDU 以响应 ADV_IND 或 ADV_DIRECT_IND PDU,并且其中一个或两个设备的 PDU 的 ChSel 字段设置为 0,则应在连接上使用信道选择算法 #1(参见第 4.5.8.2 节)。

否则,应使用信道选择算法#2(见第 4.5.8.3 节)。ACL 连接的主控在主机指示时,可以使用连接等时流创建过程与对等设备创建连接等时流(CIS)(参见 第 5.1.15 节)。

The CIS 应与用于创建它的 ACL 相关联。链路层可以为同一个slave创建多个CIS。 注意:slave不能在链路层发起创建CIS的请求,但可以在更高层发起。 当master和slave之间的ACL连接终止时,所有关联 CIS 应同时终止。

4.5.1 Connection events

Connection Event 我们简称 CE,代表着一个连接态的 Master/Slave 的交互集合。两个 CE 的起始时间之间的时间差,我们叫做 Connection Interval 也叫 CI。

处于连接状态的链路层应仅在连接事件中传输 Data PhysicalChannel PDUs (见第 2.4 节)。

每个连接事件通常包含至少一个master发送的数据包。 但是,由于调度冲突,master可以在连接事件中完全传输失败,但应在每个supervision timeout 周期内传输至少一个Data Channel PDU (参见第 4.5.2 节) .

在连接事件期间,master和slave交替发送和接收数据包。当两个设备继续发送数据包时,连接事件被认为是打开的。
在这里插入图片描述
不管有效的 CRC 匹配如何,如果从slave接收到来自master的数据包,slave应始终发送数据包,除非在第 4.5.6 节中指定的多个连续的无效 CRC 匹配之后。如果master收到来自slave的数据包而不考虑有效的 CRC 匹配,则它可以发送一个数据包,除非在第 4.5.6 节中指定的多个连续的无效 CRC 匹配之后。

连接事件的开始称为锚点an anchor point。在锚点产生后,master通常会开始向slave发送 Data Physical Channel PDU。

连接事件的时间由两个参数决定:连接间隔(connection interval / connInterval)和从设备延迟(slave latency / connSlaveLatency)。

  • connInterval 应为 1.25 ms 的倍数,范围为 7.5 ms 到 4.0 s。connInterval 由发起方的链路层在 CONNECT_IND 或 AUX_CONNECT_REQ PDU 范围内设置,由master给出,可以使用连接更新程序(见第 5.1.1 节)或连接参数请求程序(见第 5.1.7 节)进行更改。
  • connSlaveLatency允许slave 减少连接事件数量。 connSlaveLatency 参数定义了slave不需要侦听master的连续连接事件的数量。 但是,connSlaveLatency 的值不应导致Supervision Timeout(请参阅第 4.5.2 节)。connSlaveLatency 应为 0 ~ ((connSupervisionTimeout / (connInterval*2)) - 1)范围内的整数,且参数也应小于 500。

当 connSlaveLatency 设置为零时,slave应在每个锚点(anchor point)侦听。如果slave在应用从设备延迟后没有收到来自主设备的数据包,它应该在每个锚点进行侦听,并且在收到来自主设备的数据包之前不应用从设备延迟。

当双方建立起连接并维持连接的过程中,双方都会记录一个 Event Counter 的东西,顾名思义,这个值代表了当前这是第几个 Connection Event。他是一个 16bits 的数字,从 0x0000 - 0xFFFF.

4.5.2 Supervision timeout

连接可能会由于各种原因而中断,例如设备超出范围、遇到严重干扰或断电情况。由于这种情况可能会在没有任何事先警告的情况下发生,因此master和slave都必须监视状态连接。

为了能够检测 ACL 连接中的链路丢失,master和slave都应使用ACL connection supervision timer T L L c o n n S u p e r v i s i o n T_{LLconnSupervision} TLLconnSupervision。在 ACL 上接收到有效数据包后,计时器将被重置。为了能够检测 CIS 中的链路丢失,master和slave都应使用 CIS supervision timer T C I S S u p e r v i s i o n T_{CISSupervision} TCISSupervision。在 CIS 上接收到有效数据包后,定时器 T C I S S u p e r v i s i o n T_{CISSupervision} TCISSupervision 将被重置。

如果在连接建立之前 ACL connection supervision timer 大于等于 6 * connInterval(见第 4.5 节),则认为 ACL 连接丢失。这使得未能建立的 ACL 连接能够快速终止。建立 CIS 时,主设备应在收到 LL_CIS_IND 的确认后,在下一个 CIS 事件开始时启动 CIS supervision timer 。

如果在CIS建立前CIS supervision timer 大于等于 6 * ISO_Interval,则认为CIS丢失。建立CIS时,slave应在收到LL_CIS_IND后,在下一个CIS事件开始时启动 CIS supervision timer。

ConnSupervisionTimeout应为 10 ms 的倍数,范围为 100 ms 到 32.0 s ,且应大于(1 + connSlaveLatency) * connInterval * 2

如果在连接建立后的任何时间处于连接状态,定时器 T L L c o n n S u p e r v i s i o n T_{LLconnSupervision} TLLconnSupervision 大于等于 connSupervisionTimeout 值,连接应被视为丢失(参见第 4.5.12 节)。如果在 CIS 建立后的任何时间处于连接状态,timerTCISSupervision 达到 connSupervisionTimeout 值,则 CIS 应被视为丢失。

无论哪种情况,如果最近的事件已经关闭并且定时器将在下一个 ACL 或 CIS 锚点之前达到 connSupervisionTimeout 值,则Controller 可以更早地发送丢失的通知。可以使用Connection Update
procedure(参见第 5.1.1 节) ) 或the Connection Parameters Request (参见第 5.1.7 节)修改 the supervision timeout。

4.5.3 Connection event transmit window

为了允许 Master 高效地为多个连接或它可能涉及的其他活动安排连接事件,master具有在其选择时调度第一个连接事件锚点的灵活性。

传输窗口transmit window在包含 CONNECT_IND PDU 或 AUX_CONNECT_REQ PDU 的数据包结束后的 TransmitWindowDelay + Transmit WindowOffset 处开始,并且传输 WindowSize 参数应定义传输窗口的大小。 connInterval 用于计算最大偏移量和传输窗口大小。传输窗口偏移和传输窗口大小参数由链路层确定。

  • 传输窗口偏移应是 0 毫秒到 connInterval 范围内的 1.25 毫秒的倍数。
  • 传输窗口大小应为 1.25 毫秒的倍数,范围为 1.25 毫秒到 10 毫秒和(connInterval - 1.25 毫秒)中的较小者。

因此,在包含 CONNECT_IND PDU 或 AUX_CONNECT_REQ PDU 的数据包结束之后,第一个数据包的开始将不早于transmitWindowDelay + transmitWindowOffset,并且不晚于transmitWindowDelay + transmitWindowOffset + transmitWindowSize

当使用 CONNECT_IND PDU 时,transmitWindowDelay 的值应为 1.25 毫秒,当在 LE 未编码 PHY 上使用 AUX_CONNECT_REQ PDU 时为 2.5 毫秒,当在 LE 编码 PHY 上使用 AUX_CONNECT_REQ PDU 时为 3.75 毫秒。

4.5.4 Connection setup – Master Role

initiator者在主广播物理通道上发送 CONNECT_IND PDU 或在 二级广播物理通道上收到 AUX_CONNECT_RSP PDU 后,链路层处于Master角色的连接状态。Master将重置链路层连接监督定时器connection supervision timer T L L c o n n S u p e r v i s i o n T_{LLconnSupervision} TLLconnSupervision。链路层应通知HOST连接已创建。

第一个连接事件应使用第 4.5.8 节中指定的数据通道索引。HOST应开始在第 4.5.3 节中定义的传输窗口the transmit window.内发送第一个数据包。允许HOST的第一个数据包超出传输窗口。

Master在连接状态中发送的第一个数据包确定了第一个连接事件的锚点,因此确定了此连接中所有未来连接事件的时序。

第二个连接事件锚点应在第一个连接事件锚点之后的 connInterval 。4.5.1 节规定的所有正常连接事件传输规则均适用。 图 4.38 和图 4.39 显示了从Master角度来看的 LL 连接建立过程时序的两个示例。

在这里插入图片描述
最开始是可连接的 Advertising packet,T_IFS(150us)后,接着 CONNECT_IND 包。此刻,我们假设双方都正常的收到/发送了这个 CONNECT_IND,那么连接开始 SetUp。

  1. 经过 transmitWindowDelay
  2. 在经过 transmitWindowOffset
  3. 开窗 transmitWindowSize 发送第一个 packet
  4. 这些确定后,Slave 就在那个指定的位置去开窗收包即可

4.5.5 Connection setup – Slave Role

当advertiser在主广播物理通道上收到 CONNECT_IND PDU 或在 二级广播物理通道上发送 AUX_CONNECT_RSP PDU 后,链路层处于slave的连接状态。Slave将重置链路层连接监督定时器connection supervision timer T L L c o n n S u p e r v i s i o n T_{LLconnSupervision} TLLconnSupervision。链路层应通知 HOST连接已创建。

第一个连接事件应使用第 4.5.8 节中指定的数据通道索引。slave应开始侦听第 4.5.3 节中定义的传输窗口内的第一个数据包;这样做时,它应该执行第 4.2.4 节中指定的窗口加宽。

允许Master的第一个数据包超出传输窗口,因此slave必须考虑到这一点。接收到的第一个数据包,不管有效的 CRC 匹配(即,只有访问地址需要匹配),在连接状态中由slave 确定第一个连接事件的锚点,因此所有未来连接事件的时序这种联系。

如果在一个传输窗口中没有接收到一个数据包,slave将尝试在随后的传输窗口中接收一个数据包。后续传输窗口应在前一个传输窗口开始后以相同的传输窗口大小开始 connInterval。数据信道索引应是第 4.5.8 节中规定的下一个数据信道索引。connEventCount 也应加一。

图 4.40 和图 4.41 显示了从Slave角度的两个过程示例。在这些示例中,Slave未能从Master 接收第一个数据包的任何部分(即 connEventCount = 0),并从第二个数据包(即 connEventCount = 1)获取锚点定时。

在这里插入图片描述
Slave在每个连接事件中都应处于活动状态,直到它从主设备接收到一个 NESN 设置为 1 的数据包。从那时起,它可以使用第 4.5.1 节中定义的 slave latency。

4.5.6 Closing connection events

好了,连接这些都建立上了,我们开始数据传送之旅。BLE 是周期性业务,所以每次的数据交互,只能在每个 Connection Event 中,那么一个 Connection Event 有多长呢?这个就涉及到一个概念,叫 MD。

Data Physical Channel PDU Header 的 MD 位用于指示设备有更多数据要发送。它的物理含义是,代表了当前的这个包后面还有没有跟进其他的非空数据包。如何理解呢?

比如,Master 想发 40 个 Bytes 的数据,(默认情况下,27 Bytes 为一个 Date Length),那么就要分为两包发送,第一次发送 27 Bytes,第二次发送 13 Bytes;那么在第一组包中的 Header 域中的 MD 字段,就要被设置成为 1,由于第二组发包后,发完了,那么第二组数据包的 Header 中的 MD 字段就被设置成为 0;

如果两个设备都没有在它们的数据包中设置 MD 位,则来自从设备的数据包关闭连接事件。

如果两个设备中的一个或两个都设置了 MD 位,主设备可以通过发送另一个数据包来继续连接事件,而从设备应该在发送其数据包后进行侦听。未能接收到一个数据包,或者在一个连接事件中接收到两个连续的具有无效 CRC 匹配的数据包将关闭该事件。

打个比如:如果双方都没有要传输的数据,那么 MD 都为 0,则这次的 CE 就提前结束,CE 就显得比较小。

在这里插入图片描述
类似于上面的例子。如果 Master 有 40 Bytes 的数据传送,那么 Slave 也要陪着 Master 玩,那么这时的 CE 就会较大:
在这里插入图片描述
当然,只允许 Master 传数据,那是不合理的,Slave 也可以发送据呀,当 Slave 发送据 Master 没数据的时候,Slave 的 MD 就会被设置成为 1,Master 也只有陪玩:
在这里插入图片描述
当然,Master 和 Slave 可以同时发数据,MD 都被设置成为 1:
在这里插入图片描述
这里我们总算是看出来了,MD 会影响到 CE 的长度;同时可看出来了,CE 最长不能超过 CI 的长度。那么有没有办法指定 CE 呢?当然可以,HCI 命令中,可以指定 CE MIN Length 和 CE MAX Length,如果一个 CE 装不了那么多数据,那么数据顺延到下一个 CI 去发就好,MD 照样置上。

所以 Core Spec 根据上面画的 4 个图的场景,根据 MD 的值,绘制了一个表格,来代表 MD 对 CE 的影响:
在这里插入图片描述



参考文章

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bluetooth 蓝牙介绍(三):低功耗蓝牙BLE空口协议Ⅱ 的相关文章

  • App 和设备通过蓝牙连接收发数据

    一 Android 中进行蓝牙开发需要用到的类和执行过程 1 使用BluetoothAdapter startLeScance来扫描设备 2 在扫描到设备的回调函数中的得到BluetoothDevice 对象 并使用Bluetooth st
  • Android蓝牙开发浅析

    由于近期正在开发一个通过蓝牙进行数据传递的模块 在参考了有关资料 并详细阅读了Android的官方文档后 总结了Android中蓝牙模块的使用 更新 之前承诺的蓝牙通讯模块的源码已经放出 详情请点击一下链接 http blog csdn n
  • JavaSE + bluecove 蓝牙连接

    最近公司准备将旧系统的 NET部分翻版 项目除了有后台的还有个与设备对接的客户端用蓝牙连接的 所有这周对相关技术做了一个验证 搜了一下Java 蓝牙相关信息 我去资料也太少了 少也就算了连bluecove库也是有问题的 经过艰难的查找 最终
  • Android 蓝牙 hfp音频连接

    Android 蓝牙 hfp音频连接 1 连接音频 2 音频连接状态 该文章基于Android Q 1 连接音频 在手机音频正常连接时 接通电话 点选蓝牙通话 mDeviceManager connectAudio返回true 如果是之前默
  • 蓝牙之九-AT命令

    AT命令用于HF协议 该命令使参考3GPP 27 007协议 以下是HFP规范 每个命令行只有一个命令 AG侧默认不回显命令 AG使用冗长的格式返回结果 以下字符将被用于AT命令和返回结果格式中
  • 蓝牙AVRCP协议解析

    在这里讨论蓝牙的AVRCP协议 要理解AVRCP 需要先了解AVCTP 我们分两个部分来进行 1 AVCTP协议 2 AVRCP协议 下面先来看AVRCp协议 一 概述 1 定义 AVCTP Audio Video Control Tran
  • 疑难杂症 解决Ubuntu16.04 蓝牙搜索不到附近设备 适用于18.04

    文章目录 1 问题描述 2 问题症结 3 解决办法 References 1 问题描述 打开蓝牙搜索设备无果 2 问题症结 终端下输入命令 dmesg grep i blue BCM Patch brcm BCM hcd not found
  • 微信小程序之蓝牙 BLE 踩坑记录

    前言 前段时间接手了一个微信小程序的开发 主要使用了小程序在今年 3 月开放的蓝牙 API 此过程踩坑无数 特此记录一下跳坑过程 顺便开了另一个相关的小项目 欢迎 start 和 fork BLE MiniProgram API简介 微信小
  • 使用蓝牙耳机听群晖ds218play中的音乐(audio station)

    缘起 有时需要欣赏nas中的音乐而又不影响家人 有什么方法呢 思路 研究了一下 发现新版的群晖dms支持蓝牙usb蓝牙适配器 可以使用audio station播放 蓝牙耳机收听 步骤 1 购买CSR USB蓝牙适配器 2 插入ds218p
  • 蓝牙DA14580学习教程(附开源可编程手环/手表全套学习资料下载地址)

    DA14580学习 DA14580用来干什么 1 超长待机的智能手环 手表和其他智能穿戴设备 2 智能鼠标 键盘 遥控器 触控板 语音和手势识别控制板等 3 计步 如小米手环 活动和睡眠监测器 血压血糖心率监测器 4 多感测器运动电脑平台
  • nRF52832学习记录(九、SAADC)

    nRF52xx 处理器中的ADC为一个逐次逼近的模拟数字转换器 所有nRF52xx 系列处理器的内部 ADC 称为 SAADC 目录 nRF52xx SAADC基础介绍 SAADC采样示例 SAADC EasyDMA 缓冲采样示例 SAAD
  • windows10连接小米耳机Redmi AirDots 2

    1 控制面板 2 添加蓝牙设备 3 搜索 4 下一步 如果链接不上 请删除已有设备从第一步开始重新做
  • Android中BLE连接出现“BluetoothGatt status 133”的解决方法

    http www loverobots cn android ble connection solution bluetoothgatt status 133 html 前 言 最近的工作方向一直在低功耗蓝牙方面 也就是BLE Blueto
  • 基于STM8的ADC0832采集及蓝牙通信系统

    为了方便大家学习 工程已经打包上传 http download csdn net detail devintt 8029389 最近在淘宝逛的时候发现了一款单片机 STM8 相比之前一直使用的也是8位的AVR相比 感觉STM8更为强大 芯片
  • 蓝牙(二)蓝牙搜索、配对、连接

    1 搜索 从上一节我们可以知道 蓝牙状态发生了改变 并发生了回调 咱们就从回调开始 DevicePickerFragment java 用于蓝牙设置界面的蓝牙配置和管理 Override public void onBluetoothSta
  • pulseaudio使用过程中遇到的问题

    W pulseaudio main c This program is not intended to be run as root unless system is specified E pulseaudio core util c H
  • Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备 如果你还没阅读过 建议先看看上一篇文章Android蓝牙开发教程 二 连接蓝牙设备 在上一篇文章中 无论是自动连接还是被动连接 连接成功后 都是将获取到的BluetoothSocket交由连接
  • 蓝牙之十三-HFPclient JNI层

    JNI到app JAVA
  • android bluetooth UUID蓝牙查询表

    UUID是 Universally Unique Identifier 的简称 通用唯一识别码的意思 对于蓝牙设备 每个服务都有通用 独立 唯一的UUID与之对应 也就是说 在同一时间 同一地点 不可能有两个相同的UUID标识的不同服务 以
  • 【经典蓝牙 SSP协议介绍】

    协议定义 SSP Secure Simple Pairing 安全简单配对 协议目的 1 为用户简化配对过程 2 维护或提高蓝牙无线技术的安全性 安全性指两点目标 1 被动窃听保护 2 中间人 MITM 攻击保护 协议流程 下面说下我认为的

随机推荐

  • vue3 父子组件传参详解

    前言 我引用了大佬的文章 但我实在找不到网址链接了 我记录在笔记上的 如果大佬看见了 麻烦给我说一下 我注明一下出处 建议先看son vue 里面写了那三种方式 首先放一个我的demo defineProps什么的父子传参api不用引入 直
  • 06 科技英语|控制与优化学科词汇

    maneuver n 策略 v 操控 调遣 manipulate vt 熟练控制 scalability n 可扩展性 leverage n 杠杆 v 促使 改变 flexibility n 弹性 dispatch n 急件 v 调度 派遣
  • extern关键字的用法知识点总结

    extern关键字的用法 编译C文件的步骤 数据类型及其长度 知识点总结 一 extern关键字的用法 extern关键字可以用来声明变量 函数作为外部变量或者函数供其它文件使用 extern表明变量或者函数是定义在其他其他文件中的 例如
  • 《Python编程:从入门到实践》第九章练习题

    Python编程 从入门到实践 第九章练习题 Python编程 从入门到实践 第九章练习题 9 1 餐馆 9 2 三家餐馆 9 3 用户 9 4 就餐人数 9 5 尝试登录次数 9 6 冰淇淋小店 9 7 管理员 9 8 权限 9 9 电瓶
  • python+selenium+PhantomJS爬取唯品会

    由于唯品会是利用js动态生成html作为反爬机制 所以不能用以前的爬取html的方法进行爬取 本程序是用selenium PhantomJS对唯品会进行爬取 可以根据需要输入要爬取的商品 还有爬取的起始页和结束页 程序代码以及注释的内容如下
  • vue[el-table]表格内附件上传、elementui 的http-request 上传附件,并且还可以传参数

    解决 通过http request
  • cmd 窗口 make clean process_begin: CreateProcess(NULL, rm Dynamics.o test.o, …) failed.

    CMD执行make clean报错 make clean rm Dynamics o test o process begin CreateProcess NULL rm Dynamics o test o failed make e 2
  • layui 弹出iframe选择数据并获取数据

    var layer layui layer layer open type 2 2表示弹出的是iframe 1表示弹出的是层 offset auto title 选择题目 font size 18px area 500px 300px sc
  • 华为HCIE云计算之IPsan存储裸设备映射给Linux主机

    华为HCIE云计算之IPsan存储裸设备映射给Linux主机 一 环境简介 1 Linux系统版本 2 各服务器IP地址 二 配置数据存储 1 登录华为V3数据存储 2 创建LUN 3 创建Lun组 4 创建主机 5 创建主机组 6 创建主
  • 行业轮动策略(思想+源码)

    一 行业轮动策略简介 行业轮动是利用市场趋势获利的一种主动量化投资交易策略 其本质是利用不同投资品种强势时间的错位对行业品种进行切换以达到投资收益最大化的目的 通俗点讲就是根据不同行业的区间表现差异 性进行轮动配置 力求能够抓住区间内表现较
  • yarn add报错error: Missing list of packages to add to your project.

    问题描述 运行yarn add命令安装全部依赖项报错 原因 yarn安装全部依赖是 yarn 或者 yarn install 不是yarn add这个命令 yarn add 后面需要跟具体的包名安装某个包 解决 更换成 yarn 或者 ya
  • DDR3详解(以Micron MT41J128M8 1Gb DDR3 SDRAM为例)之一

    1 结构框图 2 管脚功能描述 管脚符号 类型 描述 A0 A9 A10 AP A11 A12 BC A13 Input 地址输入 为ACTIVATE命令提供行地址 和为READ WRITE命令的列地址和自动预充电位 A10 以便从某个ba
  • 基于Selenium模块实现无界面模式 & 执行JS脚本

    此篇文章主要介绍如何使用 Selenium 模块实现 无界面模式 执行JS脚本 把滚动条拉到底部 并以具体的示例进行展示 1 Selenium 设置无界面模式 创建浏览器对象之前 创建 options 功能对象 options webdri
  • Qt 自动单元测试Auto Test Project详解

    Qt 自动单元测试Auto Test Project详解 有时 残缺也是一种美 测试 则意味着需要投入 有些项目的迭代周期很短 如果也搞一个 test 则可能性价比很低 Qt 自动单元测试Auto Test Project详解 官方 htt
  • Eigen矩阵运算库快速上手

    目录 1 配置 2 初始化 2 1 Array类 2 2 Vector类 2 3 Matrix类 2 4 Vector赋值 2 5 高级初始化 3 矩阵计算 3 1 矩阵基本计算 3 2 线性求解 3 3 特征值计算 3 4 奇异值分解 总
  • spring的自动装配三种模式

    第一种装配模式是我们非常熟悉的xml配置 这种装配需要写id class 还有这个类具体的属性值等等 较为麻烦 第二种byName和byType的自动装配模式 如何设置呢 我们有三个类 cat dog people 并且people种有ca
  • MATLAB进阶教程第一节(图形绘制)

    本节是matlab进阶教程的第一节 头一次看的小白请先看完我的matlab入门基础 方便消化 对那些急需图形绘制的朋友将会有很大帮助 一 二维图形的绘制 1 1plot函数 形式 plot X Y S X Y是向量 分别表示点集的横坐标和纵
  • c++基础十四(冒泡排序)

    冒泡排序 基本思路 对于一组要排序的元素列 依次比较相邻的两个数 将比较小的数放在前面 比较大的数放在后面 如此继续 直到比较到最后的两个数 将小数放在前面 大数放在后面 重复步骤 直至全部排序完成 例子 数组Num 5 9 6 7 3 1
  • 常用的MySQL 优化方法

    数据库优化一方面是找出系统的瓶颈 提高MySQL数据库的整体性能 而另一方面需要合理的结构设计和参数调整 以提高用户的相应速度 同时还要尽可能的节约系统资源 以便让系统提供更大的负荷 本文我们来谈谈项目中常用的MySQL优化方法 共19条
  • Bluetooth 蓝牙介绍(三):低功耗蓝牙BLE空口协议Ⅱ

    文章目录 前言 4 5 CONNECTION STATE 4 5 1 Connection events 4 5 2 Supervision timeout 4 5 3 Connection event transmit window 4