1. 系统架构概述

OpenHarmony蓝牙系统采用分层架构设计,基于HDF(Hardware Driver Foundation)驱动框架和系统能力管理(System Ability)机制实现。

1.1 架构层次

┌─────────────────────────────────────────────────────────────┐
│                    应用层 (Application)                      │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   C API     │  │  ArkTS API  │  │  C++ API    │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
├─────────────────────────────────────────────────────────────┤
│                    框架层 (Framework)                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │  适配器层    │  │  IPC通信    │  │  接口管理   │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
├─────────────────────────────────────────────────────────────┤
│                    服务层 (Service)                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │Host Server  │  │Profile服务  │  │GATT服务     │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
├─────────────────────────────────────────────────────────────┤
│                    驱动层 (Driver)                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   HDF驱动   │  │  芯片适配   │  │  协议栈     │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
└─────────────────────────────────────────────────────────────┘

1.2 核心组件

1.2.1 蓝牙框架仓库
  • 路径: foundation/communication/bluetooth
  • 功能: 提供C/C++/JS API接口和框架实现
  • 关键模块:
    • frameworks/inner/: 内部框架实现
    • frameworks/c_api/: C语言接口实现
    • frameworks/js/napi/: JS/ArkTS接口实现
    • interfaces/: API接口定义
1.2.2 蓝牙服务仓库
  • 路径: foundation/communication/bluetooth_service
  • 功能: 系统服务实现,系统能力ID为1130
  • 关键配置:
    • sa_profile/1130.json: 系统能力配置
    • services/bluetooth/server/: 服务实现

2. 系统能力管理

2.1 系统能力配置

系统能力ID: 1130 (bluetooth_service)

配置文件: foundation\communication\bluetooth_service\sa_profile\1130.json

{"process": "bluetooth_service","systemability": [{"name": 1130,"libpath": "libbluetooth_server.z.so","run-on-create": true,"distributed": false,"dump_level": 1}]
}

2.2 服务启动流程

  1. Init进程解析1130.json配置文件
  2. 加载libbluetooth_server.z.so
  3. 创建BluetoothHostServer实例
  4. 注册系统能力到SystemAbilityManager

3. 核心接口定义

3.1 C API接口

头文件: foundation\communication\bluetooth\interfaces\c_api\include\oh_bluetooth.h

3.1.1 蓝牙开关状态查询
/*** @brief 获取蓝牙开关状态* @param state 输出参数,返回当前状态* @return 0表示成功,非0表示错误码*/
Bluetooth_ResultCode OH_Bluetooth_GetBluetoothSwitchState(Bluetooth_SwitchState *state);
3.1.2 状态枚举定义

foundation\communication\bluetooth\interfaces\c_api\include\oh_bluetooth.h

typedef enum Bluetooth_SwitchState {BLUETOOTH_STATE_OFF = 0,           // 蓝牙关闭BLUETOOTH_STATE_TURNING_ON = 1,    // 蓝牙开启中BLUETOOTH_STATE_ON = 2,            // 蓝牙已开启BLUETOOTH_STATE_TURNING_OFF = 3,   // 蓝牙关闭中BLUETOOTH_STATE_BLE_TURNING_ON = 4, // BLE模式开启中BLUETOOTH_STATE_BLE_ON = 5,        // BLE模式已开启BLUETOOTH_STATE_BLE_TURNING_OFF = 6  // BLE模式关闭中
} Bluetooth_SwitchState;

3.2 系统服务接口

头文件: foundation\communication\bluetooth_service\services\bluetooth\server\include\bluetooth_host_server.h

3.2.1 核心服务方法
class BluetoothHostServer : public SystemAbility {int32_t EnableBt() override;                    // 启用蓝牙int32_t DisableBt() override;                   // 禁用蓝牙int32_t GetBtState(int32_t &state) override;    // 获取蓝牙状态int32_t EnableBle(bool noAutoConnect = false);  // 启用BLEint32_t DisableBle() override;                  // 禁用BLE
};

4. 实现原理

4.1 蓝牙状态管理

4.1.1 状态转换图
[OFF] → [TURNING_ON] → [ON]↑           ↓
[TURNING_OFF] ← [TURNING_OFF][OFF] → [BLE_TURNING_ON] → [BLE_ON]↑           ↓
[BLE_TURNING_OFF] ← [BLE_TURNING_OFF]
4.1.2 状态同步机制

实现位置: foundation\communication\bluetooth\frameworks\inner\src\bluetooth_host.cpp

// 状态同步实现
void BluetoothHost::impl::BluetoothHostObserverImp::OnStateChanged(int32_t transport, int32_t status) {// 同步随机地址到服务if (status == BTStateID::STATE_TURN_ON) {host_.SyncRandomAddrToService();}// 通知所有观察者host_.observers_.ForEach([transport, status](auto observer) {observer->OnStateChanged(transport, status);});
}

4.2 服务发现机制

4.2.1 SystemAbilityManager交互

init进程可以通过SystemAbilityManager获取蓝牙服务

// 加载蓝牙服务
bool BluetoothHost::impl::LoadBluetoothHostService() {auto samgr = SystemAbilityManagerClient::GetInstance().GetSystemAbilityManager();if (samgr == nullptr) {return false;}// 异步加载系统能力int32_t ret = samgr->LoadSystemAbility(BLUETOOTH_HOST_ABILITY_ID, nullptr);return ret == ERR_OK;
}

4.3 进程间通信(IPC)

4.3.1 IPC接口定义

接口文件: frameworks/inner/ipc/interface/

核心接口:

  • IBluetoothHost: 主机服务接口
  • IBluetoothGattClient: GATT客户端接口
  • IBluetoothGattServer: GATT服务器接口
  • IBluetoothBleAdvertiser: BLE广播接口

5. 关键源码路径

5.1 框架实现

5.1.1 主机管理
  • 文件: foundation/communication/bluetooth/frameworks/inner/src/bluetooth_host.cpp
  • 功能: 蓝牙主机状态管理、服务发现
5.1.2 C API实现
  • 文件: foundation/communication/bluetooth/frameworks/c_api/src/oh_bluetooth.cpp
  • 功能: C语言接口的具体实现

5.2 服务实现

5.2.1 主机服务
  • 文件: foundation/communication/bluetooth_service/services/bluetooth/server/src/bluetooth_host_server.cpp
  • 功能: 系统服务的主要实现
5.2.2 Profile服务
  • 路径: foundation/communication/bluetooth_service/services/bluetooth/server/src/
  • 包含: A2DP, AVRCP, GATT, HID等Profile服务

5.3 配置文件

5.3.1 系统能力配置
  • 文件: foundation/communication/bluetooth_service/sa_profile/1130.json
  • 功能: 定义蓝牙服务的系统能力参数
5.3.2 构建配置
  • 文件: bluetooth/bundle.json
  • 功能: 定义组件依赖和构建参数

6. 调试方法

6.1 日志系统

6.1.1 日志标签
  • 框架日志: bt_fwk_host
  • C API日志: bt_c_api_ohbluetooth
  • 服务日志: bluetooth_service
6.1.2 日志查看命令
# 查看蓝牙框架日志
hilog | grep bt_fwk# 查看蓝牙服务日志
hilog | grep bluetooth_service# 查看C API调用日志
hilog | grep bt_c_api

6.2 系统调试

6.2.1 服务状态检查
# 进入设备shell
hdc shell# 在设备shell中执行以下命令:
# 查看蓝牙服务状态
ps -ef | grep bluetooth_service# 查看系统能力
samgr list | grep bluetooth# 查看蓝牙开关状态
param get persist.sys.bluetooth.enable# 查看蓝牙相关日志
hilog | grep bluetooth
6.2.2 配置文件调试
# 检查系统能力配置
hdc shell cat /system/etc/sa_profile/1130.json# 检查服务配置
hdc shell cat /system/etc/init/bluetooth_service.cfg

6.3 开发调试

6.3.1 构建调试版本
# 构建带调试信息的版本
./build.sh --product-name xxx --gn-args="is_debug=true"# 启用蓝牙调试日志
./build.sh --product-name xxx --gn-args="bt_debug_level=3"
6.3.2 运行时调试
# 设置调试参数
hdc shell param set bluetooth.debug.level 3# 重启蓝牙服务
service_control restart bluetooth_service

7. 常见问题与解决

7.1 服务启动失败

  • 症状: 蓝牙服务无法启动
  • 检查: 查看1130.json配置是否正确
  • 解决: 确认libbluetooth_server.z.so存在且权限正确

7.2 状态同步问题

  • 症状: 状态显示不一致
  • 检查: 查看bt_fwk_host日志
  • 解决: 重启bluetooth_service服务

7.3 API调用失败

  • 症状: C API返回错误码
  • 检查: 确认参数有效性和权限
  • 解决: 检查蓝牙服务是否已启动

8. 传统蓝牙设备实现原理

8.1 蓝牙耳机实现原理

8.1.1 系统架构

蓝牙耳机协议栈架构:

┌─────────────────────────────────────────────────────────────┐
│                    应用层 (音乐APP)                         │
├─────────────────────────────────────────────────────────────┤
│                    框架层 (AVRCP)                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │ 媒体控制    │  │  音量管理   │  │  状态同步   │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
├─────────────────────────────────────────────────────────────┤
│                    服务层 (A2DP/AVRCP)                    │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │ A2DP Source │  │ AVRCP CT    │  │ 音频路由    │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
├─────────────────────────────────────────────────────────────┤
│                    协议栈 (蓝牙协议)                        │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐          │
│  │   L2CAP     │  │    AVDTP    │  │   AVCTP     │          │
│  └─────────────┘  └─────────────┘  └─────────────┘          │
└─────────────────────────────────────────────────────────────┘
8.1.2 关键源码文件

A2DP源端实现:

  • 文件路径: foundation/communication/bluetooth_service/services/bluetooth/server/src/bluetooth_a2dp_source_server.cpp
  • 核心类: BluetoothA2dpSourceServer
  • 功能: 音频流传输、编码配置、连接管理

AVRCP控制器实现:

  • 文件路径: foundation/communication/bluetooth_service/services/bluetooth/server/src/bluetooth_avrcp_ct_server.cpp
  • 核心类: BluetoothAvrcpCtServer
  • 功能: 媒体控制、音量调节、状态同步
8.1.3 连接流程
手机蓝牙服务A2DP模块AVRCP模块耳机发现蓝牙耳机发起配对请求配对确认建立A2DP连接配置音频流参数协商编解码器建立AVRCP连接注册媒体控制回调交换控制命令手机蓝牙服务A2DP模块AVRCP模块耳机
8.1.4 音频编码配置

支持的编码格式:

编码格式采样率位深度通道数
SBC44.1kHz16bit立体声
AAC48kHz16bit立体声
aptX48kHz16bit立体声

配置流程:

// 在bluetooth_a2dp_source_server.cpp中的配置流程
void OnConfigurationChanged(const RawAddress &device, const A2dpSrcCodecInfo &info, int error) {// 处理编解码器配置变更BluetoothA2dpCodecInfo tmpInfo {};tmpInfo.bitsPerSample = info.bitsPerSample;tmpInfo.channelMode = info.channelMode;tmpInfo.codecType = info.codecType;tmpInfo.sampleRate = info.sampleRate;// 通知应用层配置已更新
}

8.2 蓝牙遥控器实现原理

8.2.1 HID协议实现

HID主机实现:

  • 文件路径: foundation/communication/bluetooth_service/services/bluetooth/server/src/bluetooth_hid_host_server.cpp
  • 核心类: BluetoothHidHostServer
  • 功能: HID设备连接、按键事件处理、电池状态监控
8.2.2 遥控器按键映射

标准HID按键码:

功能键HID码功能描述
0x010x30电源键
0x020x31音量+
0x030x32音量-
0x040x33频道+
0x050x34频道-
0x060x35静音
0x070x36主页
0x080x37返回
8.2.3 连接和事件处理
电视HID服务遥控器启动HID主机服务发现遥控器设备发送设备描述符注册按键回调按键按下事件分发按键码发送LED状态反馈更新LED指示电视HID服务遥控器
8.2.4 低功耗管理

省电模式:

// 在bluetooth_hid_host_server.cpp中的状态管理
void OnConnectionStateChanged(const RawAddress &device, int state) {if (state == BTConnectState::CONNECTED) {// 激活高功耗模式SetPowerMode(HIGH_POWER);} else if (state == BTConnectState::DISCONNECTED) {// 切换到低功耗模式SetPowerMode(LOW_POWER);}
}

8.3 蓝牙音箱实现原理

8.3.1 A2DP接收端实现

A2DP接收端:

  • 文件路径: foundation/communication/bluetooth_service/services/bluetooth/server/src/bluetooth_a2dp_sink_server.cpp
  • 核心类: BluetoothA2dpSinkServer
  • 功能: 音频接收、解码播放、音量控制
8.3.2 音频路由管理

音频路径配置:

手机(A2DP Source) → 蓝牙协议栈 → 音箱(A2DP Sink) → 音频解码 → DAC → 扬声器
8.3.3 音量同步机制

绝对音量控制:

  • AVRCP绝对音量: 支持0-100级音量调节
  • 本地音量存储: 断电记忆音量设置
  • 同步机制: 双向音量状态同步

8.4 设备兼容性分析

8.4.1 设备类型识别

设备类别码(Class of Device):

设备类型CoD值主要服务类
耳机0x200404Audio
音箱0x200414Audio
遥控器0x002508HID
8.4.2 能力交换机制

SDP服务发现:

// 服务发现流程
void DiscoverServices(const RawAddress &device) {// 查询A2DP服务DiscoverA2dpService(device);// 查询AVRCP服务DiscoverAvrcpService(device);// 查询HID服务DiscoverHidService(device);
}

8.5 问题诊断与调试

8.5.1 连接问题分析

常见问题排查:

问题现象可能原因调试命令
无法发现设备设备未进入配对模式hcitool scan
配对失败PIN码错误或兼容性bluetooth_manage get_paired_devices
连接断开信号强度弱或电量低hilog | grep bluetooth
音频卡顿带宽不足或干扰cat /proc/bluetooth/stats
8.5.2 性能优化

音频延迟优化:

  1. 缓冲区大小: 调整为最小延迟模式
  2. 编解码器: 优先选择低延迟编解码器
  3. 连接参数: 优化连接间隔和超时

功耗优化:

  1. 扫描间隔: 降低非连接时的扫描频率
  2. 连接参数: 调整连接间隔平衡功耗和响应
  3. 深度睡眠: 支持空闲时的深度睡眠模式
8.5.3 调试工具

专用调试命令:

# 查看A2DP连接状态
hdc shell bluetooth_manage get_a2dp_connections# 查看AVRCP能力
hdc shell bluetooth_manage get_avrcp_capabilities# 查看HID设备列表
hdc shell bluetooth_manage get_hid_devices# 查看音频路由状态
hdc shell cat /sys/class/bluetooth/hci0/audio_state# 实时监控蓝牙数据
hdc shell hcidump -w /data/bluetooth.log

8.6 实际配置示例

8.6.1 蓝牙耳机配置

配置文件路径: /vendor/etc/bluetooth/audio_policy.conf

<audio_policy><a2dp_sink><supported_codecs><sbc bitrate="328000" sampling="44100" channels="2"/><aac bitrate="320000" sampling="48000" channels="2"/></supported_codecs></a2dp_sink>
</audio_policy>
8.6.2 遥控器按键映射

HID描述符配置:

// 标准遥控器HID描述符
static const uint8_t remote_hid_descriptor[] = {0x05, 0x01,        // Usage Page (Generic Desktop)0x09, 0x05,        // Usage (Game Pad)0xa1, 0x01,        // Collection (Application)0x85, 0x01,        // Report ID (1)0x05, 0x09,        // Usage Page (Button)0x19, 0x01,        // Usage Minimum (Button 1)0x29, 0x20,        // Usage Maximum (Button 32)0x15, 0x00,        // Logical Minimum (0)0x25, 0x01,        // Logical Maximum (1)0x75, 0x01,        // Report Size (1)0x95, 0x20,        // Report Count (32)0x81, 0x02,        // Input (Data, Variable, Absolute)0xc0               // End Collection
};

openharmony蓝牙开发常见问题分析

1. 蓝牙服务启动失败 / 反复重启

现象

  • system log 中不断出现 bluetooth_service 崩溃或 Service stopped (2900001)
  • 设置界面点击“打开蓝牙”无响应或立即回弹。

根因

  • 进程 bluetooth_service 中的线程 OS_IPC_10_25363libbluetooth_server.z.so 触发 cppcrash。
  • init 配置未正确拉起服务或 SELinux 权限拒绝。

解决办法

  • 临时规避:在 shell 执行 start bluetooth_service 强制拉起;若仍失败,重启设备可恢复。

2. 反复开关蓝牙导致内存泄漏

现象

  • 连续开关蓝牙 20 次以上,系统内存上涨 15 MB~180 MB 不等;settings 应用出现 appfreeze。
  • 设备长时间运行后出现 OOM,蓝牙功能不可用。

根因

  • 蓝牙适配层未释放 bt_hcibt_core 相关句柄。

解决办法

  • 临时:重启设备即可恢复。
  • 永久:
    1. libbluetooth_server.z.so 更新到补丁中。
    2. 如使用外置蓝牙芯片,改用芯片自带协议栈,减少 OpenHarmony host 栈资源占用 。

3. BLE 扫描失败,错误码 2900099 / Fails to start scan

现象

  • 调用 startBLEScan 返回 Operation failedFails to start scan as it is out of hardware resources.

根因

  • 硬件扫描通道被占满(其他应用/系统组件未释放)。
  • 权限不足:缺少 ohos.permission.DISCOVER_BLUETOOTHohos.permission.LOCATION

解决办法

  1. 检查并动态申请权限:
    abilityAccessCtrl.requestPermissionsFromUser(['ohos.permission.DISCOVER_BLUETOOTH', 'ohos.permission.LOCATION'])
    
  2. 扫描前先调用 stopBLEScan() 释放通道;必要时重启蓝牙服务:
    stop bluetooth_service && start bluetooth_service
    
  3. 若仍失败,查看 /var/log/hilog 是否有 hardware resource busy,重启设备即可恢复 。

4. GATT 特征值读写失败,错误码 2900005 / 2900008

现象

  • 已连接设备,调用 readCharacteristicValue / writeCharacteristicValue 返回 Device not connectedProxy is nullptr

根因

  • 对端设备异常断开,但本地 proxy 对象未及时清理。
  • 应用在前一次异步操作未完成时又发起下一次操作,导致状态错乱。

解决办法

  1. 每次读写前判断 connectionState === 'STATE_CONNECTED'
  2. 等待上一次操作的 callback / promise 返回后再执行下一次读写。
  3. 出现 Proxy is nullptr 时,主动断开连接并重新执行配对流程 。

5. 打开蓝牙后设置界面卡死(appfreeze)

现象

  • 进入设置 → 蓝牙,UI 假死 6 s 以上,系统提示 THREAD_BLOCK_6S

根因

  • systemui 进程在 libsamgr_proxy.z.so 中发生线程阻塞。

解决办法

  • 临时:下拉状态栏 → 关闭再打开蓝牙,或重启设备。
  • 永久:升级至 4.1.2 之后版本,官方已合入修复补丁 。

6. 蓝牙固件/串口适配失败

现象

  • 系统启动后 bluetooth_service 不停重启,dmesg 出现 ttyS* probe failbt_firmware not found

根因

  • init.<board>.cfg 中串口节点与原理图不一致;
  • vendor/<vendor>/<board>/bluetooth/ 下固件名或路径错误;
  • BUILD.gnp_namehardware.c 不匹配。

解决办法

  1. 对照原理图确认 UART 管脚,修改:
    device/<vendor>/<board>/cfg/init.<board>.cfg
    
    确保串口拥有者为 blue_host
  2. 核对固件文件名:
    vendor/<vendor>/<board>/bluetooth/BUILD.gn
    
    vendor/<vendor>/<board>/bluetooth/src/hardware.c
    
    p_name 完全一致 。
  3. 确认 ohos.build 中已包含 bluetooth 部件:
    "parts": { "bluetooth": { "module": "//bluetooth/..." } }
    

快速排查清单(Checklist)

检查点命令/路径预期结果
服务是否运行`ps -efgrep bluetooth_service`
串口是否匹配`dmesggrep tty`
固件是否存在ls /vendor/firmware/*.bin存在对应芯片固件
权限是否授予aa check -p ohos.permission.DISCOVER_BLUETOOTHgranted
日志是否有 crash`hiloggrep bluetooth_service`

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

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

相关文章

探索 Ultralytics YOLOv8标记图片

1、下载YOLOv8模型文件 下载地址&#xff1a;https://docs.ultralytics.com/zh/models/yolov8/#performance-metrics 2、编写python脚本 aaa.py import cv2 import numpy as np from ultralytics import YOLO import matplotlib.pyplot as pltdef plot_detection(image, box…

Matplotlib数据可视化实战:Matplotlib子图布局与管理入门

Matplotlib多子图布局实战 学习目标 通过本课程的学习&#xff0c;学员将掌握如何在Matplotlib中创建和管理多个子图&#xff0c;了解子图布局的基本原理和调整方法&#xff0c;能够有效地展示多个数据集&#xff0c;提升数据可视化的效果。 相关知识点 Matplotlib子图 学习内容…

【python实用小脚本-194】Python一键给PDF加水印:输入文字秒出防伪文件——再也不用开Photoshop

Python一键给PDF加水印&#xff1a;输入文字秒出防伪文件——再也不用开Photoshop PDF加水印, 本地脚本, 零会员费, 防伪标记, 瑞士军刀 故事开场&#xff1a;一把瑞士军刀救了投标的你 周五下午&#xff0c;你把 100 页标书 PDF 发给客户&#xff0c;却担心被同行盗用。 想加水…

开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑

文章的目的为了记录使用C 进行QT Widget 开发学习的经历。临时学习&#xff0c;完成app的开发。开发流程和要点有些记忆模糊&#xff0c;赶紧记录&#xff0c;防止忘记。 相关链接&#xff1a; 开源 C QT Widget 开发&#xff08;一&#xff09;工程文件结构-CSDN博客 开源 C…

【密码学实战】X86、ARM、RISC-V 全量指令集与密码加速技术全景解析

前言 CPU 指令集是硬件与软件交互的核心桥梁&#xff0c;其设计直接决定计算系统的性能边界与应用场景。在数字化时代&#xff0c;信息安全依赖密码算法的高效实现&#xff0c;而指令集扩展则成为密码加速的 “隐形引擎”—— 从服务器端的高吞吐量加密&#xff0c;到移动端的…

2025-08-21 Python进阶2——数据结构

文章目录1 列表&#xff08;List&#xff09;1.1 列表常用方法1.2 列表的特殊用途1.2.1 实现堆栈&#xff08;后进先出&#xff09;1.2.2 实现队列&#xff08;先进先出&#xff09;1.3 列表推导式1.4 嵌套列表推导式2 del 语句3 元组&#xff08;Tuple&#xff09;4 集合&…

告别手工编写测试脚本!Claude+Playwright MCP快速生成自动化测试脚本

在进行自动化测试时&#xff0c;前端页面因为频繁迭代UI 结构常有变动&#xff0c;这往往使得自动化测试的脚本往往“写得快、废得也快”&#xff0c;维护成本极高。在大模型之前大家往往都会使用录制类工具&#xff0c;但录制类工具生成的代码灵活性较差、定位方式不太合理只能…

一款更适合 SpringBoot 的API文档新选择(Spring Boot 应用 API 文档)

SpringDoc&#xff1a;Spring Boot 应用 API 文档生成的现代化解决方案 概述 SpringDoc 是一个专为 Spring Boot 应用设计的开源库&#xff0c;能够自动生成符合 OpenAPI 3 规范的 API 文档。它通过扫描项目中的控制器、方法注解及相关配置&#xff0c;动态生成 JSON/YAML/HTML…

文献阅读 250821-When and where soil dryness matters to ecosystem photosynthesis

When and where soil dryness matters to ecosystem photosynthesis 来自 <When and where soil dryness matters to ecosystem photosynthesis | Nature Plants> ## Abstract: Background: Projected increases in the intensity and frequency of droughts in the twen…

React学习(九)

目录&#xff1a;1.react-进阶-antd-新增2.react-进阶-antd-删除选中1.react-进阶-antd-新增新增代码&#xff0c;跟需改的代码类似&#xff0c;直接copy修改组件代码进行修改userEffect可以先带着&#xff0c;没啥用A6组件用到的函数跟修改的也类似&#xff1a;这个useEffect函…

零基础从头教学Linux(Day 17)

三层交换机一、三层交换机的配置1.关于如何配置三层交换机&#xff0c;首先我们应该先创建VLANSwitch>en Switch#vlan database % Warning: It is recommended to configure VLAN from config mode,as VLAN database mode is being deprecated. Please consult userdocument…

任务十四 推荐页面接口开发

一、接口准备 在对接qq音乐接口之前,首先要将之前的项目,一定要记得备份一份; 备份完成之后,首先要在vscode终端安装axios,这个是请求后端的工具,和之前的ajax一样,都是请求后端的工具。只不过axios更专业化,跟强大 至于qq音乐接口怎么获取,一般有两个途径,第一个是…

医疗AI与医院数据仓库的智能化升级:异构采集、精准评估与高效交互的融合方向(下)

核心功能创新详解: 统一门户与角色化工作台: 统一入口: 用户通过单一URL登录,系统根据其角色和权限自动呈现专属工作台。 角色化工作台: 临床医生工作台: 首屏展示常用患者查询入口、快速统计(如“我的患者检验异常趋势”)、相关临床文献推荐、待处理任务(如报告审核)…

数据库面试常见问题

数据库 Delete Truncate Drop 区别 答:这三个操作都是针对数据库的表进行操作,都有删除表的功能,其中的区别在于: Delete:只将表中的数据进行删除,不删除定义不释放空间,是dml语句,需要提交事务,如果不想删除可以回滚。delete每次删除一行,并在事务日志中为所删除…

用nohup setsid绕过超时断连,稳定反弹Shell

在We渗透过程中&#xff0c;我们常常会利用目标系统的远程代码执行&#xff08;RCE&#xff09;漏洞进行反弹Shell。然而&#xff0c;由于Web服务器&#xff08;如PHP、Python后端&#xff09;的执行环境通常存在超时限制&#xff08;如max_execution_time或进程管理策略&#…

Java设计模式-模板方法模式

Java设计模式-模板方法模式 模式概述 模板方法模式简介 核心思想&#xff1a;定义一个操作中的算法骨架&#xff08;模板方法&#xff09;&#xff0c;将算法中某些步骤的具体实现延迟到子类中完成。子类可以在不改变算法整体结构的前提下&#xff0c;重定义这些步骤的行为&…

Centos7物理安装 Redis8.2.0

Centos7物理安装 Redis8.2.0一、准备依赖环境首先安装编译 Redis 所需的依赖&#xff1a;# CentOS/RHEL系统 yum install -y gcc gcc-c make wget 二、下载并编译 Redis 8.2.0# 1. 下载Redis 8.2.0源码包 wget https://download.redis.io/releases/redis-8.2.0.tar.gz# 2. 解压…

牛津大学xDeepMind 自然语言处理(3)

条件语言模型无条件语言模型 概率计算&#xff1a;通过链式法则分解为预测下一词概率&#xff08;将语言建模问题简化为建模给定前面词语历史的下一个词的概率&#xff09;基于循环神经网络的无条件语言模型&#xff1a;根据历史词语预测下一个词的概率条件语言模型 定义&#…

Vue2.x核心技术与实战(一)

目录 一、Vue2.x:快速上手+插值表达式+指令上 1.1 Vue快速上手 1.1.1 Vue概念 1.1.2 创建实例 1.1.3 插值表达式 { { }} 1.1.4 响应式特性 1.1.5 开发者工具 1.2 Vue指令 1.2.1 v-html 1.2.3 v-show / v-if v-show v-if 1.2.4 v-else / v-else-if 1.2.5 v-on v…

SCAU学习笔记 - 自科三面前端方向实战演示

本来是准备写完二面直接开始写算法三面的&#xff0c;maimai那个封面图我都做好了。但是可恶的出题人说要等我出完解析再针对性避开出题&#xff0c;所以swan决定把那个先搁置&#xff0c;本文我们先以2023年的自科三面前端方向题为例带各位快速入门前端三件套&#xff08;因为…