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

【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析

目录

一、服务发现的核心目标:能力画像对齐

二、控制器(CT)服务记录:控制能力的声明

2.1 必选字段:角色与协议的刚性契约

2.1.1 服务类标识(Service Class ID List)

2.1.2 协议描述列表(Protocol Descriptor List)

2.1.3 蓝牙配置文件描述(Bluetooth Profile Descriptor List)

2.1.4 支持的功能特性(Supported Features)

2.2 条件字段:浏览支持的开关(C1 条件)

2.2.1 附加协议描述列表(Additional Protocol Descriptor List)

2.2.2 配置逻辑

2.3 可选字段:设备标识与厂商信息

2.4 版本兼容性:1.4 vs 1.6 的契约差异

2.5 关键实现规则

2.6 示例:CT服务记录配置

2.7 开发者注意事项

三、目标端(TG)服务记录解析

3.1 必选字段(Mandatory, M)

3.1.1 服务类标识(Service Class ID List)

3.1.2 协议描述列表(Protocol Descriptor List)

3.1.3 蓝牙配置文件描述(Bluetooth Profile Descriptor List)

3.1.4 支持的功能特性(Supported Features)

3.2 条件必选字段(Conditional, C1/C2)

3.2.1 附加协议描述列表(Additional Protocol Descriptor List, C1)

3.2.2 Cover Art协议栈(Protocol Descriptor List #1, C2)

3.3 可选字段(Optional, O)

3.4 关键实现规则

3.5 TG与CT服务记录对比

3.6 示例:TG服务记录配置

3.7 开发者注意事项

四、实际应用场景示例

五、总结

六、参考资料


在蓝牙音视频远程控制协议(AVRCP)中,服务发现(Service Discovery Protocol, SDP)是设备间建立通信的关键环节。通过SDP,控制器(Controller, CT)与目标设备(Target, TG)能够交换服务能力信息,确保功能兼容性。本文基于AVRCP规范中的服务记录表(Table 8.1与Table 8.2),深入解析CT与TG的服务发现机制,并探讨其互操作性设计逻辑。

一、服务发现的核心目标:能力画像对齐

AVRCP 的 SDP 记录本质是设备的「数字名片」,CT 通过它回答「我能控制什么」,TG 回答「我支持什么」。服务记录通过属性-值对定义,核心字段包括:

  • 服务类(Service Class ID):声明角色(CT 为 Controller,TG 为 Target

  • 协议栈(Protocol Descriptor):指定 AVCTP 通道(控制 / 浏览)的 L2CAP PSM

  • 功能标志(Supported Features):枚举支持的 AVRCP 特性(如浏览、封面艺术)

二、控制器(CT)服务记录:控制能力的声明

CT(控制端,如手机、遥控器)通过 SDP 服务记录声明 「我能控制什么样的 TG」,而非自身功能。

核心目标:告知 TG「我的控制协议版本、期望的 TG 能力」,确保连接前的能力对齐。

2.1 必选字段:角色与协议的刚性契约

2.1.1 服务类标识(Service Class ID List)

  • 作用:声明设备支持的服务类型。

  • 必选字段:是(M)。

  • 结构

    • Service Class #0UUID = A/V Remote Control 兼容旧 TG(如 2016 年前的车载音响)。

    • Service Class #1UUID = A/V Remote Control Controller 明确 CT 角色,新 TG 优先识别。

开发红线:

  • 必须同时声明新旧服务类,缺一将导致部分 TG 无法识别(如仅支持旧类的车载无法连接新 CT)。

  • AVCTP 版本必须为 0x0104(当前唯一标准化版本),否则 TG 可能拒绝连接。


2.1.2 协议描述列表(Protocol Descriptor List)

定义设备通信所需的协议栈层级,包含L2CAP、AVCTP等协议参数。

  • 必选字段:是(M)。

  • 协议层级

    • L2CAP层

      1. UUID = L2CAP 基础传输协议。

      2. 参数 #0PSM = AVCTP(Uint16类型),PSM(Protocol/Service Multiplexer):标识逻辑通道类型。 指定逻辑通道用于AVCTP控制命令传输。

    • AVCTP层

      1. UUID = AVCTP 音视频控制传输协议。

      2. 参数 #0Version = 0x0104(Uint16类型) 对应AVCTP 1.4版本。

2.1.3 蓝牙配置文件描述(Bluetooth Profile Descriptor List)

  • 必选字段:是(M)。

  • 结构

    • Profile #0UUID = A/V Remote Control 标识遵循AVRCP规范。

    • 参数 #0Version = 0x0106(Uint16类型) 对应AVRCP 1.6版本。


2.1.4 支持的功能特性(Supported Features)

  • 必选字段:是(M)。

  • 类型:16位无符号整数(Uint16),通过位标志声明功能。

  • 位定义

Bit位功能描述说明
0Category 1(基础播放控制)必须支持(如播放/暂停)
1Category 2(音量调节)可选
2Category 3(设备信息查询)可选
3Category 4(设备状态查询)可选
6支持浏览(Browsing)需启用附加协议描述列表(C1)
7支持Cover Art元数据获取如专辑封面属性(GetImageProperties)
8支持Cover Art图像获取(GetImage)需动态分配OBEX通道(C2)
9支持关联缩略图获取(GetLinkedThumbnail)依赖Bit8支持
  • 保留位:Bit4-5、Bit10-15标记为RFA(Reserved for Future Addition),必须置0。


2.2 条件字段:浏览支持的开关(C1 条件)

触发条件字段名值规范状态典型场景
Bit6=1(支持浏览)附加协议描述符列表L2CAP PSM=0x0022(浏览通道)C1CT 期望 TG 支持曲目浏览(如车载获取手机歌单)
AVCTP 浏览通道版本0x0104(与控制通道一致)C1确保浏览协议版本兼容性

2.2.1 附加协议描述列表(Additional Protocol Descriptor List)

  • 条件必选字段:当Supported Features的Bit6(支持浏览)设为1时必选(C1)。

  • 协议层级

    • L2CAP层

      1. UUID = L2CAP

      2. 参数 #0PSM = AVCTP_Browsing 专用通道用于媒体文件系统浏览。

    • AVCTP层

      1. UUID = AVCTP

      2. 参数 #0Version = 0x0104 保持与主通道版本一致。

2.2.2 配置逻辑

if (SupportedFeatures.Bit6 == 1) {必须包含浏览通道协议描述符;else 禁止包含;
}

错误案例:某手机声明 Bit6=1 但未配置浏览通道,导致车载 TG 无法响应 Browse 命令。

互操作性设计:通过分层协议描述,设备可动态协商多通道共存,满足不同场景需求(如控制命令与媒体浏览分离)。


2.3 可选字段:设备标识与厂商信息

字段名类型示例值作用
Provider Name字符串"Xiaomi"厂商名称,用于设备识别(如车载显示手机品牌)
Service Name字符串"Phone Controller"服务名称,厂商自定义(非强制,但建议设置以提升用户体验)

最佳实践:

  • Provider Name(显示名称):建议与设备蓝牙名称一致,避免用户混淆。

  • Service Name(服务名称):字符串类型,可体现角色(如「AV Remote Controller」),增强可读性。


2.4 版本兼容性:1.4 vs 1.6 的契约差异

版本关键差异点影响范围
1.4无分组导航、封面艺术细分功能旧 TG 仅支持基础控制
1.6新增 Bit4(Player Settings)、Bit5(Group Navigation)新 TG 支持 EQ 设置、多播放组管理

开发建议:CT 统一声明 0x0106(1.6 版),向下兼容旧 TG(仅忽略新增位)。


2.5 关键实现规则

  • 功能依赖关系

    • 若声明支持浏览功能(Bit6=1),必须包含Additional Protocol Descriptor List(C1)。

    • Cover Art功能(Bit7-9)需依赖动态分配的OBEX通道(C2)。

  • 分类控制逻辑

    • Supported Features中声明的Category(Bit0-3)表示CT希望控制的TG能力范围,不要求CT自身支持所有强制命令例如:CT声明支持Category 2(音量控制),但实际可能仅支持静音功能。


2.6 示例:CT服务记录配置

Service Record:
- Service Class ID List:- UUID 0x110E (A/V Remote Control)- UUID 0x110C (A/V Remote Control Controller)
- Protocol Descriptor List:- L2CAP(PSM=AVCTP)- AVCTP(Version=1.4)
- Additional Protocol Descriptor List (if Bit6=1):- L2CAP(PSM=AVCTP_Browsing)- AVCTP(Version=1.4)
- Profile Descriptor List:- AVRCP v1.6
- Supported Features: 0x0141 (二进制 0000 0101 0000 0001)- Bit0=1(Category1)- Bit6=1(支持浏览)- Bit8=1(支持Cover Art图像获取)
- Provider Name: "AudioTech"
- Service Name: "Smart Controller"

Air log报文示例:


2.7 开发者注意事项

  • 位标志校验:实现时需检查功能依赖(如Bit6与C1的关联性)。

  • 动态通道分配:Cover Art需动态分配L2CAP PSM,避免端口冲突。

  • 兼容性测试:确保与不同TG设备的Category声明兼容,即使CT未完全实现相关命令。


三、目标端(TG)服务记录解析

在AVRCP里,目标端(TG)服务记录是设备展示自身能力的关键。通过这些记录,控制端(CT)能了解 TG 所支持的功能和协议,从而建立有效的通信。

TG服务记录同样遵循SDP规范,但角色定位与功能声明与CT存在显著差异。

3.1 必选字段(Mandatory, M)

所有TG设备必须包含以下字段,无论功能支持情况如何。

3.1.1 服务类标识(Service Class ID List)

  • 作用:明确设备为被控端(Target)角色。

  • 必选字段:是(M)。

  • 结构

    • Service Class #0UUID = A/V Remote Control Target 标识设备为TG角色,区别于CT的Controller标识。


3.1.2 协议描述列表(Protocol Descriptor List)

定义TG通信的协议栈,基础结构与CT一致,但附加通道存在差异:

  • 必选字段:是(M)。

  • 基础协议层级

    • L2CAP层PSM=AVCTP(同CT)。

    • AVCTP层Version=0x0104(AVCTP 1.4,与CT一致)。


3.1.3 蓝牙配置文件描述(Bluetooth Profile Descriptor List)

  • 必选字段:是(M)。

  • 结构

    • Profile #0UUID = A/V Remote Control(同CT)。

    • 参数 #0Version = 0x0106(AVRCP 1.6,与CT一致)。


3.1.4 支持的功能特性(Supported Features)

  • 必选字段:是(M)。

通过16位标志位(Uint16)声明功能,按支持情况分类如下:

①基础控制分类(Category)

Bit位功能描述依赖条件实现要求
0Category 1(播放控制)TG必须实现所有强制播放命令。
1Category 2(音量控制)必须实现如SetVolume等命令。
2Category 3(设备信息)必须实现如GetDeviceInfo。
3Category 4(设备状态)必须实现如GetPlayStatus。

②高级功能(功能位,对比CT):

Bit位功能描述触发条件实现要求与CT差异
4播放器应用设置(如均衡器)Bit0=1(必须支持Category1)需实现播放器参数设置命令。TG独有,CT无此位定义
5分组导航(如播放列表切换)Bit0=1需实现分组切换命令。TG独有
6支持浏览(虚拟文件系统)实际支持文件系统浏览需实现浏览协议栈(C1)。触发条件不同(CT无Category依赖)
7支持多播放器应用无依赖需管理多播放器实例。TG独有
8支持Cover Art(专辑封面)需实现OBEX协议栈(C2)需动态分配PSM并传输图像。同CT但实现方式不同(需OBEX)
  • 关键规则

    • Bit6(浏览支持):仅当TG实际支持"媒体播放器虚拟文件系统"浏览时置1,与Category无关。

    • Bit4-5:若设置,必须同时设置Bit0(Category1支持),确保基础控制能力。

③保留位(RFA)

  • Bit9-15:保留位,必须置0。


3.2 条件必选字段(Conditional, C1/C2)

根据设备支持的功能,动态包含以下字段。

3.2.1 附加协议描述列表(Additional Protocol Descriptor List, C1)

  • 触发条件

    • 支持 Category 1(播放控制)Category 3(设备信息查询),或

    • Supported FeaturesBit6(支持浏览) 置1。

  • 协议层级

    • Protocol #0 (L2CAP层): PSM = AVCTP_Browsing(浏览专用通道)。

    • Protocol #1 (AVCTP层): Version = 0x0104(AVCTP 1.4)。

3.2.2 Cover Art协议栈(Protocol Descriptor List #1, C2)

  • 触发条件Supported FeaturesBit8(支持Cover Art) 置1。

  • 协议层级

    • Protocol #0 (L2CAP层): 动态分配PSM(用于Cover Art数据传输)。

    • Protocol #1 (OBEX层): UUID = OBEX(图像传输协议)。


3.3 可选字段(Optional, O)

可选择性包含的字段,不影响核心功能:

  • Provider Name:设备制造商名称(字符串类型)。

  • Service Name:自定义服务名称(字符串类型)。

3.4 关键实现规则

  • 功能完整性要求:TG必须实现声明Category的所有强制命令例如:若声明支持Category2(音量控制),必须实现全部相关强制指令(如SetVolume)。

  • 条件性协议栈

    • C1:当TG支持Category1或3,或声明Bit6=1时,必须包含浏览通道协议描述。

    • C2:若支持Cover Art(Bit8=1),需动态分配PSM并声明OBEX协议栈。

  • Cover Art实现差异:TG使用OBEX协议传输图像数据,而CT通过AVCTP获取元数据(如GetImageProperties)。 体现TG作为数据源的主动传输角色。


3.5 TG与CT服务记录对比

特性TGCT
服务类标识A/V Remote Control TargetA/V Remote Control Controller
Supported Features包含播放器设置、分组导航等TG专属功能位包含Cover Art元数据获取等CT专属功能位
协议扩展使用OBEX传输Cover Art图像无OBEX依赖
功能完整性必须实现声明Category的全部强制命令仅声明期望控制的Category,无需完全实现

3.6 示例:TG服务记录配置

Service Record:
- Service Class ID List:- UUID 0x110C (A/V Remote Control Target)
- Protocol Descriptor List:- L2CAP(PSM=AVCTP)- AVCTP(Version=1.4)
- Additional Protocol Descriptor List (C1触发):- L2CAP(PSM=AVCTP_Browsing)- AVCTP(Version=1.4)
- Protocol Descriptor List #1 (C2触发):- L2CAP(PSM=0x1001)  // 动态分配- OBEX
- Profile Descriptor List:- AVRCP v1.6
- Supported Features: 0x01C1 (二进制 0000 0111 0000 0001)- Bit0=1(Category1)- Bit6=1(支持浏览)- Bit7=1(支持多播放器)- Bit8=1(支持Cover Art)
- Provider Name: "MediaPlayer Corp"
- Service Name: "Car Audio System"

Air log报文示例:


3.7 开发者注意事项

  • 严格功能实现:TG必须完整实现声明Category的所有强制命令,否则会导致控制失败。

  • 动态PSM管理:Cover Art通道的PSM需动态分配并确保唯一性,防止端口冲突。

  • OBEX协议集成:需实现OBEX协议栈以支持Cover Art图像传输,包括连接建立、数据分片等逻辑。

  • 虚拟文件系统要求:浏览功能(Bit6=1)需实现"Media Player Virtual Filesystem"结构,如文件夹层级、文件属性等。

  • 依赖关系校验

    • Bit4和Bit5需检查Bit0是否已置1。

    • C1触发需同时检查Category支持和Bit6状态。


四、实际应用场景示例

手机(CT)与车载音响(TG)的连接

  1. 服务发现阶段:手机通过SDP查询车载音响的服务记录,确认其支持AVRCP 1.6、Category 1(播放控制)及Cover Art。

  2. 协议通道建立

    1. 默认通道(PSM=AVCTP)用于传输播放/暂停指令。

    2. 动态分配Cover Art通道,通过OBEX获取专辑封面。

  3. 功能交互:若车载音响支持浏览(Bit6=1),手机可进一步访问其媒体库。


五、总结

AVRCP的服务发现机制通过标准化的服务记录表,实现了设备角色(CT/TG)、协议版本、功能特性的透明协商。其设计充分考虑了扩展性(如位掩码定义功能)与兼容性(版本号控制),为蓝牙音视频设备的互操作性提供了坚实基础。开发者需深入理解服务记录的字段含义及条件约束,以确保设备在复杂场景下的可靠交互。

六、参考资料

Advanced Audio Distribution Profile, Version 1.4 or later

Assigned Numbers | Bluetooth® Technology Website

相关文章:

【AVRCP】服务发现互操作性:CT 与 TG 的 SDP 协议契约解析

目录 一、服务发现的核心目标:能力画像对齐 二、控制器(CT)服务记录:控制能力的声明 2.1 必选字段:角色与协议的刚性契约 2.1.1 服务类标识(Service Class ID List) 2.1.2 协议描述列表&am…...

[从零开始学习JAVA] Stream流

前言: 本文我们将学习Stream流,他就像流水线一样,可以对我们要处理的对象进行逐步处理,最终达到我们想要的效果,是JAVA中的一大好帮手,值得我们了解和掌握。(通常和lambda 匿名内部类 方法引用相…...

K8S学习之基础三十八:Kube-static-metrics监控

Kube-static-metrics监控 ​ kube-static-metrics组件可以通过监听apiserver生成有关资源对象的状态指标,比如Node、Pod,需要注意的是kube-state-metrics只是简单的提供一个metrics数据,并不会存储这些指标数据,所以可以使用Prom…...

JAVA-多线程join()等待一个线程

引言:更多线程的认识可以看一篇博客: JAVA-Thread类实现多线程-CSDN博客 一、join()的作用 我们知道线程是随机调度执行的,但是有时候我们需要另一个任务完成了,我们才能继续,这个时候我们就可以使用join去等待线程结束…...

HashMap 常用方法

HashMap 常用方法 方法作用示例put(K key, V value)添加键值对map.put("apple", 10);get(Object key)获取指定键的值map.get("apple"); → 10remove(Object key)删除指定键的键值对map.remove("orange");containsKey(Object key)检查是否包含指…...

LogicFlow介绍

LogicFlow介绍 LogicFlow是一款流程图编辑框架,提供了一系列流程图交互、编辑所必需的功能和灵活的节点自定义、插件等拓展机制。LogicFlow支持前端自定义开发各种逻辑编排场景,如流程图、ER图、BPMN流程等。在工作审批流配置、机器人逻辑编排、无代码平…...

Docker搭建MySQL主从服务器

一、在主机上创建MySQL配置文件——my.cnf master服务器配置文件路径:/data/docker/containers/mysql-cluster-master/conf.d/my.cnf slave服务器配置文件路径: /data/docker/containers/mysql-cluster-master/conf.d/my.cnf master服务配置文件内容 …...

计算机二级web易错点(4)-选择题

选项 A&#xff1a;<input type"radio"> 用于创建单选按钮&#xff0c;同一组单选按钮中只能选择一个选项&#xff0c;所以该选项不符合要求。选项 B&#xff1a;HTML 中没有 type"check" 这种类型&#xff0c;是错误的写法&#xff0c;不能产生复选…...

3.19学习总结

学习了Java中的面向对象的知识点 完成一道算法题&#xff0c;找树左下角的值&#xff0c;错误的以为左下角只能是最底层的左节点&#xff0c;但指的是最底层最左边的节点...

Swagger-告别手写文档

文章目录 1. 引言2. Swagger是什么&#xff1f;3. SpringBoot2.7.3集成Swagger4. 常见注解 1. 引言 在RESTful API开发中&#xff0c;维护准确、易读的接口文档是团队协作的核心挑战&#xff0c;通常接口文档分为离线的和实时的。离线的接口文档工具有 YAPI等&#xff0c;其中…...

LeetCode-回文数

原题链接&#xff1a;9. 回文数 - 力扣&#xff08;LeetCode&#xff09; 首先我会想到的是&#xff0c;将这个数字转成字符串&#xff0c;然后通过前后指针判断是否相等&#xff0c;最终返回结果是否为回文数&#xff0c;时间复杂度&#xff1a;O(n)&#xff0c;空间复杂度&am…...

数据结构之链表(双链表)

目录 一、双向带头循环链表 概念 二、哨兵位的头节点 优点&#xff1a; 头节点的初始化 三、带头双向链表的实现 1.双链表的销毁 2.双链表的打印 3.双链表的尾插和头插 尾插&#xff1a; 头插&#xff1a; 4.双链表的尾删和头删 尾删&#xff1a; 头删&#xff1a; …...

硬件基础(5):(2)二极管分类

文章目录 &#x1f4cc; 二极管的分类与详细介绍1. **整流二极管&#xff08;Rectifier Diode&#xff09;**特点&#xff1a;选型依据&#xff1a;补充说明&#xff1a; 2. **快恢复二极管&#xff08;Fast Recovery Diode&#xff09;**特点&#xff1a;选型依据&#xff1a;…...

MQTT 和 Modbus 的优缺点对比

MQTT和Modbus协议是物联网&#xff08;IoT&#xff09;躲不开的两种协议&#xff0c;市面上覆盖了百分之98的产品。 MQTT由IBM在1999年发布。2014年&#xff0c;MQTT成为OASIS&#xff08;结构化信息标准促进组织&#xff09;的标准&#xff0c;后来被ISO/IEC 20922正式采纳&a…...

Android14 系统左右声音通道设置代码

Android14 系统左右声音通道设置代码 文章目录 Android14 系统左右声音通道设置代码一、前言二、系统级设置左右声音通道分析1、各方案设置左右声音通道的主要代码&#xff08;1&#xff09;3588 Android13 方案的实现&#xff08;2&#xff09;9679 Android14 方案的实现&…...

【Golang】go如何通过atomic原子操作来确保数据一致性

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...

2025年汽车加气站操作工考试精选题库

汽车加气站操作工题库中题目及答案&#xff1a; 单项选择题 1、按压力容器的设计压力分为&#xff08; &#xff09;个压力等级。 A. 3 B. 4 C. 5 答案&#xff1a;B 2、缓冲罐的安装位置在天然气压缩机&#xff08; &#xff09;。 A. 前 B. 后 C. 中间 答案&#…...

LLVM学习--外部项目

不包含于核心LLVM和Clang存储库的项目需要单独下载。在本章中&#xff0c;我们将介绍各种其他官方LLVM项目&#xff0c;并介绍如何构建和安装它们。仅仅对核心LLVM工具感兴趣的读者可以跳过本章&#xff0c;或者在需要的时候翻阅。 在本章中&#xff0c;我们将介绍以下项目安装…...

AUTOSAR_DoIP_Detailed

AUTOSAR DoIP模块详解 基于AUTOSAR标准的诊断通信协议实现 目录 架构概述通信流程消息格式配置结构详细序列总结1. 架构概述 1.1 模块架构 DoIP模块是AUTOSAR基础软件中负责诊断通信的核心组件。它通过TCP/IP网络实现诊断工具与ECU之间的通信。主要功能包括: 基础功能 基于UD…...

C语言:(大数相加版)数字阶梯求和

题目&#xff1a; 给定a和n&#xff0c;计算aaaaaaa...a(n个a)的和。 输入 测试数据有多组&#xff0c;输入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 输出 对于每组输入,请输出结果。 分析&#xff1a; 1. 方式和规定&#xff1a;大数相加必然越界…...

Echarts 折线图

功能 每月记录值&#xff0c;当数据大于600画红线&#xff0c;小于300画蓝线&#xff0c;其他在中间值为黑线。鼠标移动上去后&#xff0c;现在数据值。 option {tooltip: {trigger: axis, // 触发类型&#xff1a;坐标轴触发show: true, // 显示提示框formatter: function …...

element-plus中Dropdown下拉菜单组件的使用

1、基本使用 复制下面的代码&#xff1a; <!-- 选择查询类型 --> <el-dropdown trigger"click"><span class"el-dropdown-link"><span style"width:60px;color:#404040">查询类型</span><el-icon class"e…...

Kafka详解——介绍与部署

1. 什么是 Kafka&#xff1f; Kafka 是一个分布式的消息队列系统&#xff0c;最初由 LinkedIn 开发&#xff0c;后来成为 Apache 开源项目。它的主要用途包括实时数据处理、日志收集、数据流管道构建等。Kafka 具备高吞吐量、可扩展性、持久性和容错性&#xff0c;广泛应用于大…...

ngx_http_core_srv_conf_t

定义在 src\http\ngx_http_core_module.h typedef struct {/* array of the ngx_http_server_name_t, "server_name" directive */ngx_array_t server_names;/* server ctx */ngx_http_conf_ctx_t *ctx;u_char *file_…...

4.angular 服务

服务是在controller里面引入的服务&#xff1a; 最好是内部服务在前面&#xff0c;自定义服务在后面 内部服务 $scope $scope.$watch(‘属性名’, function(newVal, oldVal) {}, true) true是深度监听,对象函数等$scope.$apply 触发页面更新,里面传入回调函数,比如说之前那个…...

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于&#xff1a;先以卷积层构成的模块充分抽取空间特征&#xff0c;再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款&#xff08;增加通道数&#xff09;和加深 这一节的NiN提出…...

【设计模式】原型模式

三、原型模式 3.2 原型模式 同工厂模式一样&#xff0c;原型(Prototype) 模式也是一种创建型模式。原型模式通过一个对象 (原型对象)克隆出多个一模一样的对象。实际上&#xff0c;该模式与其说是一种设计模式&#xff0c;不如说是 一种创建对象的方法(对象克隆),尤其是创建给…...

力扣题目汇总 使用贪心算法解决问题

贪心算法是一种通过局部最优解来获得全局最优解的算法。它的核心思想是&#xff1a;在每一步中选择当前看起来最优的解&#xff0c;并希望通过一系列局部最优选择最终得到全局最优解。 121.买卖股票的最佳时机 分析&#xff1a; 在每一天求出当前最优的利润&#xff0c;也就…...

Mac下Ollama安装全攻略:开启本地大模型之旅

文章目录 Mac下Ollama安装全攻略&#xff1a;开启本地大模型之旅一、Ollama 是什么功能特点优势应用场景 二、安装前准备&#xff08;一&#xff09;系统要求&#xff08;二&#xff09;硬件要求 三、下载安装包&#xff08;一&#xff09;官网下载&#xff08;二&#xff09;其…...

[HelloCTF]PHPinclude-labs超详细WP-Level 1-FILE协议

源码分析 <?php include("get_flag.php");isset($_GET[wrappers]) ? include("file://".$_GET[wrappers]) : ;highlight_file(__FILE__); ?>第一句 include("get_flag.php");, 使代码包含了 get_flag.php 的内容 大概是生成 Flag 之类的…...

Skia 图形引擎介绍

文章目录 一、Skia 的基本概念1. 定位与作用2. 历史背景 二、Skia 的核心架构1. 模块化设计2. 渲染流程3. 跨平台适配 三、Skia 在 Flutter 中的角色1. 自绘 UI 的核心依赖2. 跨平台一致性3. 性能优化 四、Skia 的性能优势1. 高效的图形处理2. 与原生渲染的对比3. 性能瓶颈 五、…...

构建高可靠NFS存储:自动化挂载保障机制的设计与优势

一、背景与需求场景 在分布式系统或集群架构中&#xff0c;NFS&#xff08;Network File System&#xff09;是跨节点共享存储的经典方案。然而&#xff0c;传统/etc/fstab配置的静态挂载方式存在明显缺陷&#xff1a; 服务启动顺序不可控&#xff0c;网络未就绪时挂载失败临…...

Spring Boot对接twilio发送邮件信息

要在Spring Boot应用程序中对接Twilio发送邮件信息&#xff0c;您可以使用Twilio的SendGrid API。以下是一个简单的步骤指南&#xff0c;帮助您完成这一过程&#xff1a; 1. 创建Twilio账户并获取API密钥 注册一个Twilio账户&#xff08;如果您还没有的话&#xff09;。在Twi…...

如何创建并保存HTML文件?零基础入门教程

原文&#xff1a;如何创建并保存HTML文件&#xff1f;零基础入门教程 | w3cschool笔记 本文将以Windows系统为例&#xff0c;教你用最简单的记事本创建并保存第一个HTML网页。 &#x1f4dd; 第一步&#xff1a;准备工具 文本编辑器&#xff1a;使用系统自带的记事本&#xff…...

vue3 + css 列表无限循环滚动+鼠标移入停止滚动+移出继续滚动

1.动画文件.vue <template><div class"dashboard" click"setFullScreen"><div class"warp-box"><el-scrollbar ref"scrollRef" height"100%" scroll"handelScroll"><div class"…...

C#的简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式是一种创建型设计模式&#xff0c;主要将对象的创建和使用分离&#xff0c;使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;以下是 C# 实现的三个案例&#xff1a; 简单工厂模式 简单工厂模式通过一个工厂类来创建…...

Vue:Vue2和Vue3创建项目的几种常用方式以及区别

前言 Vue.js 和 Element UI 都是用 JavaScript 编写的。 1、Vue.js 是一个渐进式 JavaScript 框架。2、Element UI 是基于 Vue.js 的组件库。3、JavaScript 是这两个项目的主要编程语言。 而Element Plus是基于TypeScript开发的。 一、Vue2 1、基于vuecli工具创建 vue2 …...

C++ list类

C list类 目录 C list类引言1.list的使用1.1 list的构造1.2 list的iterator的使用1.3 list capacity1.4 list element acess1.5 list modifiers 2. list的迭代器失效3. list的模拟实现3.1 List.h文件3.2 List的反向迭代器 4.list与vector的对比 引言 在C标准库中&#xff0c;l…...

LeetCode 热题 100_跳跃游戏(78_55_中等_C++)(贪心算法)

LeetCode 热题 100_跳跃游戏&#xff08;78_55&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;贪心算法&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;贪心算法&#xff09;&am…...

【Redis】Redis的数据删除(过期)策略,数据淘汰策略。

如果问到&#xff1a;假如Redis的key过期之后&#xff0c;会立即删除吗&#xff1f; 其实就是想问数据删除(过期)策略。 如果面试官问到&#xff1a;如果缓存过多&#xff0c;内存是有限的&#xff0c;内存被占满了怎么办&#xff1f; 其实就是问&#xff1a;数据的淘汰策略。…...

C++和标准库速成(八)——指针、动态数组、const、constexpr和consteval

目录 1. 指针和动态数组1.1 栈和自由存储区1.2 使用指针1.3 动态分配的数组1.4 空指针常量 2. const2.1 const修饰类型2.2 const与指针2.3 使用const保护参数2.4 const方法(建议&#xff09; 3. constexpr4. consteval参考 1. 指针和动态数组 动态内存允许所创建的程序具有在编…...

深入解析 Spring Boot 中的 FailureAnalyzer

深入解析 Spring Boot 中的 FailureAnalyzer 在 Spring Boot 应用中&#xff0c;我们难免会遇到启动失败的情况&#xff0c;而默认的异常信息往往过于复杂&#xff0c;导致排查问题变得困难。Spring Boot 提供了一套强大的 FailureAnalyzer 机制&#xff0c;能够捕获常见的异常…...

20. Excel 自动化:Excel 对象模型

一 Excel 对象模型是什么 Excel对象模型是Excel图形用户界面的层次结构表示&#xff0c;它允许开发者通过编程来操作Excel的各种组件&#xff0c;如工作簿、工作表、单元格等。 xlwings 是一个Python库&#xff0c;它允许Python脚本与Excel进行交互。与一些其他Python库&#x…...

【Matlab GUI】封装matlab GUI为exe文件

注&#xff1a;封装后的exe还是需要有matlab环境才能运行 &#xff08;1&#xff09;安装MCRinstaller.exe文件&#xff0c;在matlab安装目录下的toolbox/compiler/deploy/win64文件夹里 &#xff08;2&#xff09;安装完MCRinstaller.exe&#xff0c;字命令窗口输入&#x…...

ModBus TCP/RTU互转(主)(从)|| Modbus主动轮询下发的工业应用 || 基于智能网关的串口服务器进行Modbus数据收发的工业应用

目录 前言 一、ModBus TCP/RTU互转&#xff08;从&#xff09;及应用|| 1.1 举栗子 二、ModBus TCP/RTU互转&#xff08;主&#xff09; 2.1 举栗子 三、ModBus 主动轮询 3.1 Modbus主动轮询原理 3.2 Modbus格式上传与下发 3.2.1.设置Modbus主动轮询指令 3.2.2 设…...

Linux top 命令详解:从入门到高级用法

Linux top 命令详解&#xff1a;从入门到高级用法 在 Linux 系统中&#xff0c;top 是一个强大的实时监控工具&#xff0c;用于查看系统资源使用情况和进程状态。它可以帮助你快速了解 CPU、内存、负载等信息&#xff0c;是系统管理员和开发者的日常利器。本文将从基本用法开始…...

【网络协议】基于UDP的可靠协议:KCP

TCP是为流量设计的&#xff08;每秒内可以传输多少KB的数据&#xff09;&#xff0c;讲究的是充分利用带宽。而 KCP是为流速设计的&#xff08;单个数据包从一端发送到一端需要多少时间&#xff09;&#xff0c;以10%-20%带宽浪费的代价换取了比 TCP快30%-40%的传输速度。TCP信…...

【Docker入门】构建推送第一个Docker映像

【Docker入门】构建推送第一个Docker映像 Build and Push the First Docker Image By JacksonML Docker的容器(Container)映像是轻量级的可执行独立包&#xff0c;包含代码、运行时、库、环境变量以及配置文件&#xff0c;它对于运行软件至关重要。注册表可在团队间分享映像。…...

Python----计算机视觉处理(Opencv:图像颜色替换)

一、开运算 开运算就是对图像先进行腐蚀操作&#xff0c; 然后进行膨胀操作。开运算可以去除二值化图中的小的噪点&#xff0c;并分离相连的物体。 其主要目的就是消除那些小白点 在开运算组件中&#xff0c;有一个叫做kernel的参数&#xff0c;指的是核的大小&#xff0c;通常…...

搭建自己的OCR服务

网上看到相关文章&#xff0c;这里整理记录一下&#xff0c;仅供学习。 搭建自己的OCR服务&#xff0c;第一步&#xff1a;选择合适的开源OCR项目 - PandaCode辉 - 博客园 一、OCR是什么&#xff1f; 光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09…...