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

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介

        蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz-2.485GHz左右),进行电磁波传输,总共有83.5MHz的带宽资源。

1.1、背景

        蓝牙(Bluetooth)一词取自于十世纪丹麦国王哈拉尔HaralBluetooth。一位来自英特尔的工程师 Jim Kardach将“蓝牙”与后来的无线通讯技术标准关联在一起的。他在一次无线通讯行业会议上,提议将“Bluetooth”作为无线通讯技术标准的名称。蓝牙的 LOGO 则是来自后弗萨克文的符文组合,将哈拉尔国王名字的首字母 H 和 B 拼在一起,成为了今天大家熟知的蓝色徽标。

蓝牙技术开始于爱立信联合在 1994 年创制的方案,该方案旨在研究移动电话和其他配件间进行低功耗、低成本无线通信连接的方法。发明者希望为设备间的无线通讯创造一组统一规则(标准化协议),以解决用户间互不兼容的移动电子设备的通信问题,1999年在爱立信联合IBM、英特尔、诺基亚及东芝公司等公司在1999 年 7 月 26 日正式公布 1.0A 版,确定使用 2.4GHz 频段。从此之后,蓝牙就开始了迅速发展的历程。

1.2、发展历程

版本时间PHY极限速率主要技术更新
1.0A/1.0B19990.7Mbit/s最早期的蓝牙 1.0 A 和 1.0B 版存在多个问题,有多家厂商指出他们的产品互不兼容。.
2.0+EDR20041Mbps(3Mbps with EDR)

新增的 EDR(Enhanced Data Rate)技术通过提高多任务处理和多种蓝牙设备同时运行的能力,使得蓝牙设备的传输率可达 3Mbps。蓝牙 2.0 支持双工模式:可以一边进行语音通讯,一边传输文档/高质素图片。同时,EDR 技术通过减少工作负债循环来降低功耗,由于带宽的增加,蓝牙 2.0 增加了连接设备的数量。

3.0+HS20091Mbps(3Mbps with EDR,24Mbps over 802.11 WIFI)High Speed 可以使蓝牙调用 802.11 WiFi 用于实现高速数据传输,传输率高达 24Mbps,是蓝牙 2.0 的 8 倍,轻松实现录像机至高清电视、PC 至 PMP、UMPC 至打印机之间的资料传输。
4.0+BLE20133Mbps with EDR ,1Mbps LE蓝牙 4.0 是迄今为止第一个蓝牙综合协议规范,将三种规格集成在一起。其中最重要的变化就是 BLE(Bluetooth Low Energy)低功耗功能,提出了低功耗蓝牙、传统蓝牙和高速蓝牙三种模式。
5.020172Mbit/s LE

有效传输距离是蓝牙 4.2 的四倍

(理论上可达 300 米)更低的功耗,低速率下保持几个uA,增加了信标、MASH组网、扩展广播、 室内定位等等新的技术。

        

当前的蓝牙技术主要分为BR/EDR(Basic Rate /Enhanced Data Rate)和低耗能(LE)两种技术类型。其中BR/EDR型是以点对点网络拓扑结构创建一对一设备通信;LE型则使用点对点(一对一)、广播(一对多)和网格(多对多)等多种网络拓扑结构。

        低功耗蓝牙不能向后兼容原有的蓝牙协议(经典蓝牙协议),所以它们之间是不能互通的。蓝牙4.0规范允许设备同时支持经典与低功耗蓝牙协议。

2、工作方式

广播模式、主从模式、主从一体模式、扫描模式、透传模式、AT指令模式

3、分类(蓝牙规范)

在介绍蓝牙协议之前,我们可以先复习一下TCP/IP5层网络模型和它所对应的网络协议集

可能不同应用的只需要关注在不同层次上的网络协议就可以满足日常工作使用了,像应用开发的程序猿,一般只关注应用层的协议,http,https等等;网络的程序猿可能只需要关注TCP协议、IP协议以及ARP协议等;WiFi的程序猿主要focus在802.11协议上。但蓝牙技术不同,它并不处于TCP/IP5层模型中的任何一层,而是覆盖了整个5层TCP/IP模型。有了这个概念之后,让我们来看看下图

在图中我们可以看到,蓝牙的架构分为HostController两个模块。在开发过程中,我们一般把蓝牙的架构分为这两个模块,

Host主要是各种业务场景需求的实现

Controller部分主要负责的是蓝牙报文的收发以及蓝牙物理连接的管理这些基本功能

        通常绝大部分的开发工作都是在Host端进行,Controller部分的工作大都是由专门的蓝牙芯片厂商来负责;Host和Controller分模块的最初设计理念是想让这两个模块单独运行在两颗不同的芯片甚至系统上,之间通过硬件通信端口(串口,USB)使用HCI协议进行连接和通信,这样可以方便替换和升级,例如对于不带蓝牙功能的电脑,我们可以买一个USB蓝牙接收器插到电脑上,就可以支持了蓝牙功能,这个场景下,HOST模块就是运行在电脑系统上,Controller模块就是运行在USB蓝牙接收器上。现在虽然有不少芯片把Host和Controller模块都放在了一颗芯片上,但是基本还是遵循这样的层次结构,只是将HCI协议从硬件通信端口换成了软件端口。
        从应用场景来说,蓝牙规范针对了我们日常生活中会碰到的非常多的场景分别定义了不同的场景规范(Profile)来支持这些场景下的需求

在图中我们可以看见:

HFP(Hands Free Profile):来支持蓝牙耳机通话场景

SPP(Serial Port Profile):用于串口传输

OPP(Object Push Profile):用于设备之间的文件传输场景

A2DP(Advanced Audio Distribution Profile):用于蓝牙耳机收听音乐场景

AVRCP(A/V Remote Control Profile):用于蓝牙耳机音乐播放控制场景

PAN(Personal Area Networking Profile):可以让手机作为蓝牙热点提供上网服务

HOGP(HID Over GATT Profile):低功耗蓝牙鼠标键盘,充一次电可以用三个月到半年。

蓝牙其实还有其他的像打印(Basic Printing Profile),心率(Heart Rate Profile),寻物(Find Me Profile)等等一系列场景规范(Profile)来支持不同的应用场景

传统蓝牙和低功耗蓝牙虽然都是蓝牙技术,但两种之间有非常大的差别,一个简单的区分就是看版本,版本低于4.0的都是经典蓝牙,高于4.0的才能支持低功耗蓝牙。在这里我们简单介绍一下两种蓝牙技术的概念

3.1传统蓝牙

        泛指支持蓝牙协议在4.0以下的模块,一般用于数据量比较大的传输,如:语音、音乐等较高数据量传输。 经典蓝牙模块可再细分为:传统蓝牙模块和高速蓝牙模块。传统蓝牙模块在2004年推出,主要代表是支持蓝牙2.1协议的模块,在智能手机爆发的时期得到广泛支持。高速蓝牙模块在2009年推出,速率提高到约24Mbps,是传统蓝牙模块的八倍,可以轻松用于录像机至高清电视、PC至PMP、UMPC至打印机之间的资料传输。

3.1.1、协议架构

蓝牙协议规定了两个层次的协议,分别为蓝牙核心协议(Bluetooth Core)和蓝牙应用层协议(Bluetooth Application)

蓝牙核心协议

Bluetooth Core由两部分组成,Host和Controller。这两部分在不同的蓝牙技术中,承担角色略有不同,但大致的功能是相同的。Controller负责定义RF、Baseband等偏硬件的规范,并在这之上抽象出用于通信的逻辑链路(Logical Link);Host负责在逻辑链路的基础上,进行更为友好的封装,这样就可以屏蔽掉蓝牙技术的细节,让Bluetooth Application更为方便的使用。

在一个系统中,Host只有一个,但Controller可以一个,也可以有多个。一个常见的例子是蓝牙耳机与手机之间的通信。在这种情况下,手机充当蓝牙主设备(Host),负责管理整个蓝牙连接。手机内部可能搭载了一个或多个蓝牙控制器(Controller),用来处理和管理蓝牙信号的发送和接收。当用户使用蓝牙耳机时,手机会与蓝牙耳机进行配对并建立连接。手机作为主设备发送音频数据到蓝牙耳机,而蓝牙耳机的控制器接收并处理这些数据,然后将音频播放出来。在这个例子中,手机是唯一的主设备(Host),但可能搭载一个或多个蓝牙控制器(Controller),以实现音频数据的传输和处理。

蓝牙应用层协议

定义了蓝牙设备之间进行数据传输和通信所需的协议和规范。

蓝牙应用层协议包括多个子协议,其中最常用的是串口配置协议(SPP)、对象交换协议(OPP)、电话簿访问协议(PBAP)、音频/视频远程控制协议(AVRCP)等。

SPP协议用于在蓝牙设备之间建立虚拟串口通信,可以实现数据的双向传输。

OPP协议用于在蓝牙设备之间进行对象(如照片、音乐等)的传输和共享。

PBAP协议用于在蓝牙设备之间共享电话簿数据,方便用户在蓝牙设备上查看和管理联系人信息。

AVRCP协议用于在蓝牙设备之间进行音频/视频播放控制,例如播放、暂停、下一曲等操作。

除了上述常用的应用层协议外,蓝牙还支持一些其他的应用层协议,如蓝牙打印协议(BPP)、蓝牙键盘协议(HID)等,这些协议都为不同类型的蓝牙设备之间的通信和数据传输提供了标准化的解决方案。通过应用层协议,蓝牙设备可以实现各种不同类型的功能和应用,为用户提供更加便利和丰富的蓝牙体验。

SPEC中蓝牙协议分为四个层次:物理层(Physical Layer)、逻辑层(Logical Layer)、L2CAP Layer和应用层(APP Layer)

3.1.1.1、物理层

        物理层负责提供数据传输的物理信道,蓝牙的物理层分为Physical Channel和Physical Links两个子层。一个通信系统中通常存在多种类型的物理信道,BR/EDRLE AMP 在物理层的实现就较大的差异。

相同点

BR/EDR、LE和AMP的RF都使用2.4GHz频段,频率范围是2.400-2.4835 GHz

不同点

分类频率信道备注
BR/EDR(经典蓝牙)分成79个channel,每一个channel占用1M的带宽5种物理信道(跳频信道)
LE(低功耗蓝牙)分成40个channel,每一个channel占用2M的带宽2种物理信道
AMP(高速数据传输)直接采用802.11(WIFI)的PHY规范一个AMP Physical Channel

3.1.1.2、逻辑层

        主要功能是在已连接(的蓝牙设备之间,基于物理链路,建立逻辑信道。所谓的逻辑信道,和城市道路上的车道类似:一条城市单行道路可以看做一个物理链路,该物理链路根据行车用途,可以划分为多个逻辑信道,如直行车道、右转车道、左转车道、快速车道、慢速车道等等。如图

AMP ACL基于AMP技术的、面前连接的、异步传输链路,为AMP-U提供服务
BR/EDR ACL基于BR/EDR技术的ACL链路,为ACL-C、ACL-U提供服务
SCO/eSCO基于BR/EDR技术的、面向连接的、同步传输链路,为stream类型的Logical Link提供服务
ASB、PSB基于BR/EDR技术的、面向连接的广播传输链路,为ACL-U、PSB-U、PSB-C提供服务
CSB基于BR/EDR技术的、无连接的广播链路,为PBD提供服务。
LE ACL基于LE技术的、面前连接的、异步传输链路,为LE-U、LE-C提供服务
ADVB基于LE技术的、广告/广播链路,为ADVB-U、ADVB-C提供服务
3.1.1.3、L2CAP

L2CAP是逻辑链路控制和适配协议(Logical Link Control and Adaptation Protocol)的缩写,负责管理逻辑层提供的逻辑链路。基于该协议,不同Application可共享同一个逻辑链路,类似TCP/IP中端口(port)的概念。通过L2CAP层可以将ACL数据分组交换为便于高层应用的数据分组格式,并提供协议复用和服务质量交换等功能。L2CAP提供多路复用角色,允许许多不同的应用程序共享ACL-U,ASB-U,LE-U或AMP-U逻辑链接。通过协议多路复用、分段重组操作和组概念,向高层提供面向连接的和无连接的数据服务,L2CAP还屏蔽了低层传输协议中的很多特性,使得高层协议应用开发人员可以不必了解基层协议而进行开发。

3.1.1.4、应用层

基于L2CAP提供的channel,实现各种各样的应用功能。。Profile是蓝牙协议的特有概念,为了实现不同平台下的不同设备的互联互通,蓝牙协议不止规定了核心规范(称作Bluetooth core),也为各种不同的应用场景,定义了各种Application规范,这些应用层规范称作蓝牙profile。更新一下图

核心规范

Core Specifications,定义了蓝牙技术最核心的内容。覆盖了从物理层一直到传输层的内容。
Protocol规范

Protocol Specfications,在核心规范之上针对某一大类场景(例如音视频传输,线缆通信传输,网络通信传输)的数据通信需求来定义的传输协议,属于应用层协议,只在经典蓝牙中存在。
Profile规范

包含经典蓝牙的Traditional Profile Specifications和低功耗蓝牙的GATT Specifications。这类规范是针对某一个特定场景需求(例如听音乐,打电话)来对核心规范和protocol做出更细化的定义和对这些协议无法满足的一些细化需求做了补充协议。
蓝牙mesh规范

Mesh Networking Specifications,这是蓝牙最新的mesh规范。只使用了低功耗蓝牙的 

 3.1.2、代码(待更新)

待更新

3.2低功耗蓝牙

        指支持蓝牙协议4.0或更高的模块,也称为BLE模块,最大的特点是成本和功耗的降低,应用于实时性要求比较高的产品中,比如:智能家居类(蓝牙锁、蓝牙灯)、传感设备的数据发送(血压计、温度传感器)、消费类电子(电子烟、遥控玩具)等。

3.2.1、协议架构

BLE的协议可分为Bluetooth ApplicationBluetooth Core两大部分,Bluetooth Core又包含BLE Controller和BLE Host两部分(在传统蓝牙的协议架构的时候讲过)。Bluetooth Application主要调用API实现上层功能,本质上来说不属于协议层,重点了解GAP、ATT、Link Layer,其它有个简单认识即可

PS:传统蓝牙和低功耗蓝牙区别

PS.1、Controler端

在经典蓝牙的定义里,将这83.5MHz总共分为80个频道每个频道是1MHz带宽,蓝牙连接管理是用连接管理协议(Link Manager Protocol LMP)。低功耗蓝牙里,空中只有40个频道,每个频道是2MHz带宽,连接管理使用的是连接层(Link Layer),空中数据包的结构也完全不同。我们可以看到,Controler部分的功能完全是两个独立的路径,也就是说,经典蓝牙和低功耗蓝牙的controller可以独立存在,互相不依赖,所以目前市面上有只支持经典蓝牙的芯片,也有只支持低功耗蓝牙芯片,当然,也有两种蓝牙模式共存的芯片。

PS.2、Host端

        在经典蓝牙协议里,在逻辑链路控制与适配协议层(Logical Link Control and Adaptation Protocol L2CAP)之上,还根据不同的应用场景定义了不同的传输协议,例如RFCOM, AVDTP,AVCTP,在不同的传输协议之上才定义了不同的Profile,层次结构比较复杂,开发人员学习成本高。

        低功耗蓝牙就比较简单,只定义了一个属性协议(Attribute Protocol ATT),基于属性协议定义了一个通用属性场景规范(Generic Attribute Profile GATT)和其他的针对特定业务的场景规范(Profile),开发起来比较简单,整体框架也比较容易实现私有场景的开发。

PS.3、应用和功耗

应用区别:

        BLE低功耗蓝牙一般多用在蓝牙数据模块,拥有极低的运行和待机功耗,使用一粒纽扣电池可连续工作数年之久;

        BT经典蓝牙模块多用在蓝牙音频模块,音频需要大码流的数据传输更适合使用。
 
在功耗上:

        传统蓝牙有3个级别的功耗,class1、class2、class3分别支持100m、10m、1m的传输距离;

        低功耗蓝牙没有功耗级别,一般发送功率在7dbm。低功耗BLE5.0模块可支持蓝牙Mesh技术。

3.3蓝牙Mesh(待更新)

待更新

参考资料

三张图带你入门蓝牙规范

Bluetooth 蓝牙介绍(一) :基础知识

 蓝牙

深入浅出讲解低功耗蓝牙(BLE)协议栈

相关文章:

一文认识蓝牙(验证基于Aduino IDE的ESP32)

1、简介 蓝牙技术是一种无线通信的方式,利用特定频率的波段(2.4GHz-2.485GHz左右),进行电磁波传输,总共有83.5MHz的带宽资源。 1.1、背景 蓝牙(Bluetooth)一词取自于十世纪丹麦国王哈拉尔Haral…...

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近,也在对自己以前做的项目做一个知识点的梳理,发现可能自己以前更多的是用某个控件,以及看官方手册,但是没有更…...

Docker知识点总结

二、Docker基本命令: Docker支持CentOs 6 及以后的版本; CentOs7系统可以直接通过yum进行安装,安装前可以 1、查看一下系统是否已经安装了Docker: yum list installed | grep docker 2、安装docker: yum install docker -y -y 表示自动确认…...

Redis 消息队列:构建消息代理的 4 个简单步骤

消息代理是一种使系统、应用程序和服务能够通信和交换信息的软件。它在正式消息传递协议之间转换消息,并允许相互依赖的服务直接“对话”,即使是用不同语言编写或在不同平台上实现也是如此。在微服务中使用异步通信时,通常会使用消息代理。 消息代理可确保可靠且稳定的通信,…...

kafka三节点集群平滑升级过程指导

一、前言 Apache Kafka作为常用的开源分布式流媒体平台,可以实时发布、订阅、存储和处理数据流,多用于作为消息队列获取实时数据,构建对数据流的变化进行实时反应的应用程序,已被数千家公司用于高性能数据管道、流分析、数据集成和任务关键型…...

Golang 简介与基本语法学习

Go,也被称为 Golang,是一门由 Google 设计的开源编程语言。它旨在提供高效的开发体验,同时具备并发性、内存安全和简洁性。本篇博客将介绍 Golang 的基本语法和一些示例,帮助读者快速入门这门令人着迷的语言。 简介 Go 语言的设…...

深入理解网络通信基本原理和tcp/ip协议

深入理解网络通信基本原理和tcp/ip协议 一、计算机网络体系1,计算机网络体系结构2,网络中数据传输2.1,浏览器中输入一个url的执行流程2.2,数据在网络中是的传输流程 3,三次握手和四次挥手3.1,三次握手3.1.1…...

Jetson系统烧录环境搭建

一 序言 Jetson 系列产品烧录系统的方法一般有两种,一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统(请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》)。另一种即为当前文档所描述的,在安装 Ubun…...

【MySQL】:约束全解析

🎥 屿小夏 : 个人主页 🔥个人专栏 : MySQL从入门到进阶 🌄 莫道桑榆晚,为霞尚满天! 文章目录 📑前言一. 约束概述二. 约束演示三. 外键约束3.1 介绍3.2 语法3.3 删除/更新行为 &…...

设计一基于Text generation web UI的语言模型部署与远程访问的方案​

前言 Text generation web UI可为类ChatGPT的大型语言模型提供能够快速上手的网页界面,不仅可以提高使用效率,还可满足私有化部署,或对模型进行自定义。目前,该Web UI已经支持了许多流行的语言模型,包括LLaMA、llama.…...

大数据概述

学习大数据有什么用? 2010年:大数据技术体系开始在国内火热 2015年:国务院印发《促进大数据发展行动纲要》 2016年:发改委发布关于组织实施促进大数据发展重大工程的通知 2017年:工信部印发大数据产业规划(2016-20…...

Muduo库编译学习(1)

1.muduo库简介 muduo是由Google大佬陈硕开发,是一个基于非阻塞IO和事件驱动的现代C网络库,原生支持one loop per thread这种IO模型,该库只支持Linux系统,网上大佬对其褒贬不一,作为小白用来学习就无可厚非了。 git仓库…...

【研发日记】Matlab/Simulink技能解锁(三)——在Stateflow编辑窗口Debug

文章目录 前言 State断点 Transition断点 条件断点 按State步进 Watch Data Value Sequence Viewer 分析和应用 总结 前言 见《【研发日记】Matlab/Simulink技能解锁(一)——在Simulink编辑窗口Debug》 见《【研发日记】Matlab/Simulink技能解锁(二)——在Function编辑…...

ZYNQ--MIG核配置

文章目录 MIG核配置界面多通道AXI读写DDR3MIG核配置界面 Clock Period: DDR3 芯片运行时钟周期,这个参数的范围和 FPGA 的芯片类型以及具体类型的速度等级有关。本实验选择 1250ps,对应 800M,这是本次实验所采用芯片可选的最大频率。注意这个时钟是 MIG IP 核产生,并输出给…...

MySQL 多表查询 连接查询 内连接

介绍 内连接查询是两张表中交集的部分 连接模式 隐式内连接 SELECT 字段列表 FROM 表1,表2 WHERE 条件显式内连接 SELECT 字段列表 FROM 表1 [INNER] JOIN 表2 ON 连接条件案例 有两张表一个表为学生表,另一个表为班级表,现在需要查询学生时候在查…...

T - SQL使用事务 及 在Winform使用事务

事务适用场景 1 事务使用在存储过程中,直接在数据库中进行编写 2 事务使用在Winfrom项目中 SQl:使用事务转账操作的实例 一般都会找一个变量记录错误的个数,error记录上一句sql的错误和错误编号 declare errornum int 0 -- 定义…...

string(三)--实现

大家看了这么久的string了&#xff0c;可能对string的简单实现有兴趣&#xff0c;所以我实现了一个string类的常用接口&#xff0c;大家可以自行查看&#xff1a; 我是分多文件写的&#xff1a; string.h: #pragma once #define _CRT_SECURE_NO_WARNINGS 1 #include <ios…...

textbox跨线程写入

实现实例1 实现效果 跨线程实现 // 委托&#xff0c;用于定义在UI线程上执行的方法签名 //public delegate void SetTextCallback(string text);public void textBoxText(string text){// 检查调用线程是否是创建控件的线程 if (textBox1.InvokeRequired){// 如果不是&#…...

幻兽帕鲁专用服务器搭建之Linux部署配置教程

大家好我是飞飞&#xff0c;上一期我分享了Windows系统的幻兽帕鲁服务器搭建教程。因为幻兽帕鲁这游戏对服务器的配置有一定的要求&#xff0c;很多小伙伴就寻思用Linux系统搭建占用会不会小一点&#xff1f;有计算机基础的小伙伴都知道Linux系统和Windows系统相比&#xff0c;…...

Kubernetes: 本地部署dashboard

本篇文章主要是介绍如何在本地部署kubernetes dashboard, 部署环境是mac m2 下载dashboard.yaml 官网release地址: kubernetes/dashboard/releases 本篇文章下载的是kubernetes-dashboard-v2.7.0的版本&#xff0c;通过wget命令下载到本地: wget https://raw.githubusercont…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...