zephyr架构下Bluetooth advertising接口
目录
概述
1 函数接口
2 主要函数介绍
2.1 bt_le_adv_start函数
2.1.1 函数功能介绍
2.1.2 典型使用示例
2.1.3 广播间隔
2.1.4 注意事项
2.2 bt_le_adv_stop 函数
2.2.1 函数功能
2.2.2 使用方法介绍
2.2.3 实际应用示例
2.2.4 关键注意事项
2.2.5 常见问题解决
2.2.6 应用总结
2.3 bt_enable
2.3.1 函数功能
2.3.2 典型使用模式
2.3.3 关键处理流程
2.3.4 注意事项
2.3.5 初始化失败常见原因
2.3.6 实际应用示例
2.3.7 应用总结
2.4 bt_le_adv_update_data函数
2.4.1 函数功能
2.4.2 典型使用场景
2.4.3 关键特性
2.4.4 实现原理
2.4.5 注意事项
2.4.6 错误处理最佳实践
2.4.7 典型应用案例
2.4.8 应用总结
概述
本文主要介绍zephyr架构下Bluetooth advertising一些接口函数的功能和使用方法,这些函数是bluetooth的最重要的一些接口,掌握这些函数的用法是进行蓝牙功能开发的基础。
1 函数接口
基于zephyr OS架构下实现Bluetooth advertising功能其使用的函数接口有如下这些
函数名称 | 功能 | 说明 |
bt_le_adv_start | 实现广播功能 | BLE模块被使能后,启用该函数进行广播,可通过设置不同的参数,实现不同的广播方式 |
bt_enable | 使能BLE | 使能BLE的功能,该函数 |
bt_le_adv_stop | 停止广播 | 关闭广播功能,下次要重新广播时,需要调用bt_le_adv_start |
bt_le_adv_update_data | 更新广播数据 |
2 主要函数介绍
2.1 bt_le_adv_start函数
2.1.1 函数功能介绍
bt_le_adv_start
是蓝牙低功耗 (BLE) 协议栈中的一个关键 API 函数,用于启动设备的广播(Advertising)功能。这个函数允许 BLE 设备(Peripheral 角色)向周围设备广播自己的存在,并携带相关信息。bt_le_adv_start
是 BLE 设备广播功能的核心 API,合理配置广播参数和数据可以优化设备发现性、连接速度和功耗表现。开发者需要根据具体应用场景(如 Beacon、可连接外设等)选择合适的广播模式和数据结构。
1)功能概述
作用:启动 BLE 设备的广播功能
适用角色:Peripheral(外设)或 Broadcaster(广播者)
广播模式:可配置为可连接广播、不可连接广播、可扫描广播等
广播数据:可携带设备名称、服务 UUID、厂商数据等
2)函数原型:
int bt_le_adv_start(const struct bt_le_adv_param *param,const struct bt_data *ad,size_t ad_len,const struct bt_data *sd,size_t sd_len);
3)参数说明
参数 | 类型 | 说明 |
---|---|---|
param | bt_le_adv_param* | 广播参数配置(广播类型、间隔等) |
ad | bt_data* | 广播数据(Advertising Data) |
ad_len | size_t | 广播数据项数量 |
sd | bt_data* | 扫描响应数据(Scan Response Data) |
sd_len | size_t | 扫描响应数据项数量 |
4)广播参数配置(bt_le_adv_param)
struct bt_le_adv_param {uint8_t id; // 广播集 IDuint32_t options; // 广播选项(如 BT_LE_ADV_OPT_CONNECTABLE)uint16_t interval_min; // 最小广播间隔(单位:0.625ms)uint16_t interval_max; // 最大广播间隔(单位:0.625ms)uint8_t peer[6]; // 定向广播的目标地址(可选)
};
常用广播选项(options)
BT_LE_ADV_OPT_CONNECTABLE
- 可连接广播
BT_LE_ADV_OPT_USE_NAME
- 在广播中包含设备名称
BT_LE_ADV_OPT_SCANNABLE
- 允许扫描响应
BT_LE_ADV_OPT_ONE_TIME
- 仅广播一次
5)广播数据类型(bt_data)
struct bt_data {uint8_t type; // 数据类型(如 BT_DATA_NAME_COMPLETE)uint8_t data_len;const uint8_t *data;
};
2.1.2 典型使用示例
1)1. 基本可连接广播
static const struct bt_data ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL | BT_LE_AD_NO_BREDR),BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};static const struct bt_le_adv_param *adv_param = BT_LE_ADV_PARAM(BT_LE_ADV_OPT_CONNECTABLE | BT_LE_ADV_OPT_USE_NAME,BT_GAP_ADV_FAST_INT_MIN_1,BT_GAP_ADV_FAST_INT_MAX_1,NULL
);bt_le_adv_start(adv_param, ad, ARRAY_SIZE(ad), NULL, 0);
2)不可连接广播(Beacon 模式)
static const uint8_t beacon_data[] = {0x01, 0x02, 0x03, 0x04, // 厂商特定数据
};static const struct bt_data ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NONCONN_IND),BT_DATA(BT_DATA_MANUFACTURER_DATA, beacon_data, sizeof(beacon_data)),
};bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad), NULL, 0);
2.1.3 广播间隔
BLE 广播间隔以 0.625ms 为单位:
-
快速广播:20ms - 60ms(
BT_GAP_ADV_FAST_INT_MIN_1
= 32 = 20ms) -
慢速广播:100ms - 150ms(
BT_GAP_ADV_SLOW_INT_MIN
= 160 = 100ms)
返回值
-
0
:广播启动成功 -
负值:错误码(如
-EINVAL
参数错误,-ENOMEM
内存不足)
2.1.4 注意事项
广播数据总长度不能超过 31 字节
扫描响应数据也受 31 字节限制
广播间隔影响功耗和可发现性
某些广播模式(如定向广播)有额外限制
2.2 bt_le_adv_stop 函数
2.2.1 函数功能
bt_le_adv_stop
是蓝牙低功耗 (BLE) 协议栈中的一个关键 API 函数,用于停止正在进行的广播。它通常与 bt_le_adv_start
配对使用,用于控制 BLE 设备的广播生命周期。
1)核心功能
停止广播:立即终止当前正在进行的 BLE 广播
释放资源:释放与广播相关的协议栈资源
配合广播控制:通常用于动态广播管理场景
2)函数原型(基于 Zephyr BLE 协议栈)
int bt_le_adv_stop(void);
参数
-
无参数:直接停止当前活跃的广播
返回值
返回值 | 说明 |
---|---|
0 | 停止广播成功 |
-EALREADY | 当前没有活跃的广播 |
其他负值 | 其他错误(如协议栈错误) |
2.2.2 使用方法介绍
1) 基本启停控制
// 启动广播
bt_le_adv_start(...);// 一段时间后停止广播
bt_le_adv_stop();
2)条件性停止广播
if (need_to_stop_advertising) {int err = bt_le_adv_stop();if (err) {printk("Stop failed (err %d)\n", err);}
}
3) 广播模式切换
// 先停止当前广播
bt_le_adv_stop();// 更换参数后重新启动
bt_le_adv_start(new_params, ...);
2.2.3 实际应用示例
场景:温度传感器按需广播
void start_temp_advertising(void) {bt_le_adv_start(..., temp_ad_data, ...);
}void stop_advertising_when_connected(void) {// 当连接建立时自动停止广播// 或手动调用:bt_le_adv_stop();
}void on_button_press(void) {// 按钮按下时重新广播bt_le_adv_stop(); // 先确保停止start_temp_advertising();
}
2.2.4 关键注意事项
无广播时的调用
如果没有活跃的广播,调用会返回-EALREADY
(非致命错误)线程安全性
建议在协议栈线程(如 Zephyr 的 Bluetooth 线程)上下文中调用与连接的交互
如果设备已通过广播建立连接,广播会自动停止,此时调用会返回-EALREADY
低功耗场景
停止广播会显著降低功耗(广播是功耗主要来源之一)广播集支持
在支持多广播集的协议栈中(如 Zephyr 2.7+),可能需要指定广播集 ID
2.2.5 常见问题解决
Q1:停止广播后为什么设备仍可被扫描到?
A1:可能是其他广播实例仍在运行,或广播停止有延迟(检查返回值)
Q2:如何确保广播完全停止?
A2:
do {err = bt_le_adv_stop();
} while (err == 0); // 直到返回-EALREADY
Q3:停止广播会影响已建立的连接吗?
A3:不会,只影响广播行为,不影响现有连接
2.2.6 应用总结
bt_le_adv_stop
是 BLE 设备广播管理的核心控制点,合理使用可以实现:
精确的广播生命周期控制
动态广播策略切换
有效的功耗管理
在需要频繁切换广播模式或优化功耗的场景中,正确使用该API至关重要。
2.3 bt_enable
2.3.1 函数功能
bt_enable
是蓝牙协议栈中的核心初始化函数,用于启用和初始化蓝牙控制器及协议栈。它是任何蓝牙应用程序的第一个关键调用,为后续所有蓝牙操作建立基础环境。
函数原型(基于Zephyr等常见协议栈)
int bt_enable(bt_ready_cb_t cb);
参数说明
参数 | 类型 | 说明 |
---|---|---|
cb | bt_ready_cb_t | 蓝牙初始化完成后的回调函数(可设为NULL) |
回调函数类型定义:
typedef void (*bt_ready_cb_t)(int err);
核心功能
硬件初始化
初始化蓝牙射频控制器(Radio)
配置底层硬件(如时钟、电源等)
协议栈加载
加载HCI层、L2CAP、ATT/GATT等协议栈组件
初始化安全管理器(SM)
默认配置应用
设置默认蓝牙MAC地址
应用编译时配置的默认参数
状态切换
将蓝牙控制器从OFF状态切换到READY状态
返回值
返回值 | 说明 |
---|---|
0 | 初始化流程成功启动(注意:实际结果通过回调返回) |
-EALREADY | 蓝牙协议栈已启用 |
-ENOMEM | 内存不足 |
-EIO | 硬件初始化失败 |
2.3.2 典型使用模式
1) 同步初始化(无回调)
int err = bt_enable(NULL);
if (err) {printk("Bluetooth init failed (err %d)\n", err);return;
}
// 继续其他蓝牙操作
2)异步初始化(带回调)
void bt_ready(int err) {if (err) {printk("Bluetooth init failed (err %d)\n", err);return;}printk("Bluetooth initialized\n");// 在这里启动广播/扫描等操作
}void main(void) {int err = bt_enable(bt_ready);if (err) {printk("Bluetooth enable failed (err %d)\n", err);}
}
2.3.3 关键处理流程
2.3.4 注意事项
单次调用限制
多数实现要求全局只调用一次
重复调用需先调用
bt_disable()
回调上下文
回调函数通常在蓝牙线程执行
避免在回调中进行阻塞操作
依赖关系
必须在所有其他蓝牙API前调用
通常应在系统初始化完成后调用
调试支持
可通过
CONFIG_BT_DEBUG
等选项启用调试日志
2.3.5 初始化失败常见原因
硬件问题
蓝牙芯片未正确供电
射频电路故障
配置冲突
与其他无线服务(如WiFi)共用资源
错误的时钟配置
资源不足
内存池大小不足(检查
CONFIG_BT_*_TX_COUNT
等配置)中断冲突
2.3.6 实际应用示例
1) 简单外设初始化
void main(void)
{bt_enable(NULL); // 同步初始化bt_le_adv_start(...); // 立即开始广播
}
2)带错误恢复的初始化
void bt_retry_init(int err)
{if (err) {k_sleep(K_SECONDS(1));bt_enable(bt_retry_init); // 重试初始化}
}void main(void)
{bt_enable(bt_retry_init);
}
2.3.7 应用总结
bt_enable
是蓝牙开发的第一个关键调用,其核心价值在于:
-
建立蓝牙操作的基础环境
-
提供同步/异步两种初始化模式
-
协调硬件和协议栈的启动
正确使用该API需要注意:
-
调用时机(早于其他蓝牙操作)
-
错误处理机制
-
特定协议栈的特殊要求
在复杂应用中,建议使用异步回调模式,以便在初始化完成后自动执行后续蓝牙操作流程。
2.4 bt_le_adv_update_data函数
2.4.1 函数功能
bt_le_adv_update_data
是蓝牙低功耗 (BLE) 协议栈中的一个关键 API 函数,用于动态更新正在进行的广播数据或扫描响应数据,而无需停止并重新启动广播。
核心功能
动态更新广播数据:修改广播包(Advertising Data)或扫描响应包(Scan Response Data)内容
无需重启广播:保持广播持续进行,避免广播中断导致的设备不可见期
实时数据刷新:适用于需要频繁更新广播信息的场景(如传感器数据变化)
函数原型(基于Zephyr等常见协议栈)
int bt_le_adv_update_data(const struct bt_data *ad, size_t ad_len,const struct bt_data *sd,size_t sd_len);
参数说明
参数 | 类型 | 说明 |
---|---|---|
ad | bt_data* | 新的广播数据数组 |
ad_len | size_t | 广播数据项数量 |
sd | bt_data* | 新的扫描响应数据数组 |
sd_len | size_t | 扫描响应数据项数量 |
返回值
返回值 | 说明 |
---|---|
0 | 数据更新成功 |
-EINVAL | 参数无效(如数据长度超限) |
-ENOMEM | 内存不足 |
-EAGAIN | 协议栈繁忙,需重试 |
-ENOTCONN | 当前未进行广播 |
2.4.2 典型使用场景
1) 传感器数据实时更新
// 初始广播
bt_le_adv_start(..., initial_ad, ...);// 当温度变化时更新数据
void update_temp_data(float new_temp)
{uint8_t temp_encoded = (uint8_t)(new_temp * 2);struct bt_data new_ad[] = {BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_GENERAL),BT_DATA(BT_DATA_MANUFACTURER_DATA, &temp_encoded, 1)};bt_le_adv_update_data(new_ad, ARRAY_SIZE(new_ad), NULL, 0);
}
2) 动态切换广播模式
// 从普通广播切换到信标模式
struct bt_data beacon_ad[] =
{BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NONCONN_IND),BT_DATA(BT_DATA_MANUFACTURER_DATA, beacon_payload, sizeof(beacon_payload))
};bt_le_adv_update_data(beacon_ad, ARRAY_SIZE(beacon_ad), NULL, 0);
2.4.3 关键特性
原子性更新
1)数据更新在单个广播间隔内完 ;
2)接收端不会看到部分更新的数据
广播连续
1)保持现有广播间隔不变;
2)避免传统"停止-修改-重启"方式导致的 ~300ms 广播中断
数据限制
1)仍需遵守31字节的广播数据长度限制;
2)数据类型需符合蓝牙规范(不能动态修改AD Type)
2.4.4 实现原理
2.4.5 注意事项
广播必须处于活跃状态
1)需在bt_le_adv_start之后调用
2)已连接的设备会自动停止广播
数据一致性
1)更新期间应避免修改原始数据缓冲区
2)建议使用静态或全局数据数组
性能考量
1)频繁更新(如每秒多次)可能影响射频稳定性
2)建议合并更新(如每200ms批量更新一次)
厂商限制
1)某些低端蓝牙芯片可能不支持实时更新
2)需要检查协议栈实现是否支持该功能
2.4.6 错误处理最佳实践
int err = bt_le_adv_update_data(new_ad, ad_len, NULL, 0);
if (err == -ENOTCONN)
{// 广播未激活,重新启动bt_le_adv_start(...);
}
else if (err){printk("Update failed (err %d), retrying...\n", err);k_sleep(K_MSEC(100));// 重试逻辑}
2.4.7 典型应用案例
电子价签系统
不建立连接,通过广播更新价格信息
每15分钟更新一次广播数据
运动传感器
实时广播心率/步数变化
保持低功耗的同时更新数据
智能信标
动态调整广播内容(如店铺促销信息)
基于位置切换广播UUID
2.4.8 应用总结
bt_le_adv_update_data
提供了高效的广播数据动态更新机制,特别适合:
需要保持持续广播可见性的场景
实时数据传输但无需建立连接的用例
低功耗设备的数据更新需求
正确使用该API可以避免传统重启广播方式带来的连接中断风险,同时保证数据更新的实时性和可靠性。开发者应注意目标平台的协议栈实现差异,并进行充分的错误场景测试。
相关文章:
zephyr架构下Bluetooth advertising接口
目录 概述 1 函数接口 2 主要函数介绍 2.1 bt_le_adv_start函数 2.1.1 函数功能介绍 2.1.2 典型使用示例 2.1.3 广播间隔 2.1.4 注意事项 2.2 bt_le_adv_stop 函数 2.2.1 函数功能 2.2.2 使用方法介绍 2.2.3 实际应用示例 2.2.4 关键注意事项 2.2.5 常见问题解决 …...
Oracle官宣 MySQL+APEX+AI三认证限时免费
1 MySQL8 OCP 考试代码 1Z0-908 免费时间:2025年4月20日至7月31日 https://education.oracle.com/mysql-promo 2 APEX云开发专家 考试代码 1Z0-771 免费时间:2025年5月15日截止! https://mylearn.oracle.com/ou/learning-path/become…...
深入理解N皇后问题:从DFS到对角线优化
N皇后问题是一个经典的算法问题,要求在NN的棋盘上放置N个皇后,使得它们互不攻击。本文将全面解析该问题的解法,特别聚焦于DFS算法和对角线优化的数学原理。 问题描述 在NN的国际象棋棋盘上放置N个皇后,要求: 任意两个…...
1软考系统架构设计师:第一章系统架构概述 - 超简记忆要点、知识体系全解、考点深度解析、真题训练附答案及解析
超简记忆要点 一、考试大纲 目标:架构设计能力(需求→架构)能力:技术/方法/行业科目:综合(选择)、案例(问答)、论文(论述) 二、架构核心 定义…...
MuJoCo 关节角速度记录与可视化,监控机械臂运动状态
视频讲解: MuJoCo 关节角速度记录与可视化,监控机械臂运动状态 代码仓库:GitHub - LitchiCheng/mujoco-learning 关节空间的轨迹优化,实际上是对于角速度起到加减速规划的控制,故一般来说具有该效果的速度变化会显得丝…...
如何打包python程序为可执行文件
将 Python 程序打包为可执行文件是一个常见需求,尤其是在希望将应用程序分享给不具备 Python 环境的用户时。以下是使用 PyInstaller 工具将 Python 程序打包为可执行文件的步骤。 步骤 1:安装 PyInstaller 如果您还没有安装 PyInstaller,请…...
产销协同是什么?产销协同流程有哪些?
目录 一、产销协同是什么 1.从市场需求的角度来看 2.企业内部运营的角度来看 3.从供应链的角度来看 二、实现产销协同的八大步骤 1. 市场需求预测 2. 销售计划制定 3. 生产能力评估 4. 生产计划制定 5. 库存管理 6. 信息共享与沟通 7. 订单执行与跟踪 8. 绩效评估…...
SQL 查询进阶:WHERE 子句与连接查询详解
SQL(Structured Query Language)是管理关系型数据库的核心语言,熟练掌握其查询功能对于数据处理至关重要。本文将深入探讨 SQL 中的两个关键概念:WHERE 子句和连接查询。我们将详细讲解 WHERE 子句中的模糊查询、IS NULL、IS NOT …...
【计算机视觉】CV实战项目- DFace: 基于深度学习的高性能人脸识别
图:MTCNN的三阶段网络结构(P-Net、R-Net、O-Net) DFace深度解析:基于深度学习的高性能人脸识别 深度解析DFace:基于PyTorch的实时人脸检测与识别系统技术背景与项目概述核心功能与特点实战部署指南环境准备硬件要求软…...
基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述
以下是基于Docker、Kubernetes和Jenkins的百节点部署架构图及信息流描述,使用文本和Mermaid语法表示: 架构图(Mermaid语法) #mermaid-svg-WWCAqL1oWjvRywVJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-WWCAq…...
百度搜索AI开放计划:让应用连接精准流量的秘诀
引言 在人工智能技术深刻改变各行各业的今天,每天都有许多AI应用诞生。然而无论是开发者还是用户依然会感到自己的应用鲜有人使用或是需求没有被充分满足。这种情况正说明了为什么我们需要SEO流量,而一个能够与AI应用直接相关的SEO平台更是呼之欲出。百度…...
Redis数据结构SDS,IntSet,Dict
1.字符串:SDS SDS的底层是C语言编写的构建的一种简单动态字符串 简称SDS,是redis比较常见的数据结构。 由于以下几种缺点,Redis并没有直接采用C语言的字符串。 1.获取长度需要计算 2.非二进制安全 :中间不能有 \0,…...
leetcode201.数字范围按位与
找到公共前缀部分,然后后面的部分全0 class Solution {public int rangeBitwiseAnd(int left, int right) {int offset 0;while (left ! right) {offset;left left >> 1;right right >> 1;}return right << offset;} }...
云服务器 —— 公有 IP 与 私有 IP
云服务器的 公有 IP 和 私有 IP 在网络架构中扮演不同的角色,具体用途和区别如下: 目录 1. 公有 IP(Public IP) 作用: 特点: 示例场景: 2. 私有 IP(Private IP) 作用…...
北斗导航 | Transformer增强BiLSTM网络的GNSS伪距观测量误差探测
在GNSS(全球导航卫星系统)定位中,伪距观测量的误差直接影响定位精度。结合Transformer和LSTM的优势,可以设计一种混合模型以提升误差探测能力。以下是具体的技术实现方案: 1. 模型架构设计 1.1 输入特征设计 原始GNSS观测数据: 伪距观测值(C/A码、P码)、载波相位、多普…...
0803分页_加载更多-网络ajax请求2-react-仿低代码平台项目
文章目录 1 分页1.1 url与分页参数1.2 分页组件与url1.3 列表页引用分页组件 2 加载更多2.1 状态2.2 触发时机2.3 加载数据2.4优化 结语 1 分页 1.1 url与分页参数 查询问卷列表接口,添加分页参数: page:当前页码(第几页&#…...
React 与 Vue 的区别:你会选择哪个框架呢
🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》 🍚 蓝桥云课签约作者、…...
Jmeter如何取JDBC request响应参数作为下一个接口的值?
1、 功能参数说明 Variable Name:数据库连接池的名字,需要与JDBC Connection Configuration的Variable Name Bound Pool名字保持一致 Query:填写的sql语句未尾不要加“;” Parameter valus:参数值,对查询条件进行参数化 Paramete…...
【C++】14.容器适配器 | stack | queue | 仿函数 | priority_queue
1. 容器适配器 什么是适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设 计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。 在C中,容器适配器(Container Adapters&…...
论文阅读:2025 arxiv Aligning to What? Limits to RLHF Based Alignment
Aligning to What? Limits to RLHF Based Alignment https://arxiv.org/pdf/2503.09025 https://www.doubao.com/chat/3871529075012866 速览 这篇论文主要探讨了强化学习从人类反馈(RLHF)在对齐大型语言模型(LLMs)时的局限性…...
利用Arcgis自己绘制shp文件
1.选择自己想要创建的shp文件的位置 我是直接创建在连接文件夹中 2.右键-新建-shp 3.设置名称、要素类型、空间参考 4、点击创建要素 5、右侧选择图层、创建面 6、开始绘制,双击任意位置结束绘制 之后可以改一下shp文件的名字...
路由器重分发(OSPF+静态路由)
路由器重分发(OSPF静态路由) 静态路由充当不了翻译官 OSPF路由 OSPF路由需要宣告自己的ip, Router(config)#router ospf 1 Router(config-router)#network 10.10.10.0 0.0.0.255 area 0还要帮静态路由的也宣告一下 Router(config)#ip route…...
KTT入门
Kinetic tournament tree 简称 KTT 下文中全部简写。 KTT 用于解决类以下问题: 已知 N N N 条一次函数,求解一段区间内函数最大值。支持修改操作可以修改 x i x_i xi 或者 b i b_i bi 的值。具体做法: 我们考虑线段树来维护一个类似 Δ \Delta Δ 的东西,我们令当…...
WPF 上位机开发模板
WPF 上位机开发模板 WPF上位机开发模板,集成了基础操作菜单、海康视觉实时图像界面、串口通讯、网口通讯、主流PLC通讯、数据存储、图片存储、参数配置、权限管理、第三方webapi接口接入、数据追溯与查询等功能。 一、项目结构 WpfSupervisor/ ├── Models/ …...
理想星环OS选择NuttX作为MCU侧OS的核心原因分析
文章目录 引言一、POSIX兼容性:降低汽车软件迁移成本二、轻量级与模块化:适配MCU资源约束三、硬实时性能:保障车辆控制确定性四、多芯片适配:加速车企供应链灵活性五、安全与可靠性:构建纵深防御体系六、社区与生态&am…...
IP数据报发送和转发的过程
1. 发送端准备数据 应用程序(比如浏览器)要发送数据,比如访问一个网站。 应用层(HTTP) → 传输层(TCP/UDP) → 网络层(IP)。 IP层负责把数据包打包,加上必要…...
Pinia 详细解析:Vue3 的状态管理利器
一、Pinia 概述 Pinia 是 Vue 3 的官方推荐状态管理库,由 Vue 核心团队维护。它是对 Vuex 的改进和简化,提供了更简洁的 API 和更好的 TypeScript 支持。 Pinia 的核心优势 更简单的 API:相比 Vuex 减少了概念和模板代码完美的 TypeScript…...
pytorch python常用指令
一、常用的conda指令 创建新的python环境 conda create -n env_name python3.x 查看已有的python环境 conda env list 进入已有的python环境 conda activate env_name 退出当前的python环境 conda deactivate 二、常用的pip指令 pip install -r requirements.txt 根据…...
ubantu18.04(Hadoop3.1.3)之Spark安装和编程实践
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。 以下所有操…...
Ubuntu下安装vsode+qt搭建开发框架(二)
Ubuntu下安装vsode+qt搭建开发框架(二) 上一节介绍了vsode下搭建qt环境,采用的项目构建方式是使用qt官方的qmake工具。然而从qt6之后,官方已经开始推荐使用cmake来构建项目;并且许多项目都是cmake直接构建的,用cmake来构建项目具有可以更方便的融合其他开源项目。 一、vs…...
获取房源信息并完成可视化——网络爬虫实战1
房源信息爬虫与可视化分析程序 个人程序全网一手,盗卖必究 项目介绍 本项目是一个基于Python的房源信息爬虫与可视化分析工具,可以爬取链家网的二手房源信息,并对数据进行清洗、分析和可视化展示。通过本工具,用户可以快速了解特…...
css word
介绍 CSS word-spacing 属性,用于指定段字之间的空间,例如: p {word-spacing:30px; }word-spacing属性增加或减少字与字之间的空白。 注意: 负值是允许的。 浏览器支持 表格中的数字表示支持该属性的第一个浏览器版本号。 属…...
[mysql]约束(上)
约束 道德约束,法律约束,这个约束在表里面是狭义的. 约束广义的,比如数值型你就不能录入’abc’.字符,定义了varchar(15)范围不能超过数量15. 我们这个章节要说的约束是狭义的,是具体的我们设定的约束, 为什么我们需要约束呢 我们是为了数据的精确性和可靠性,我们了为了防…...
Eclipse 插件开发 2
Eclipse 插件开发 2 1 插件配置 1 插件配置 <?xml version"1.0" encoding"UTF-8"?> <?eclipse version"3.4"?> <plugin><extension point"org.eclipse.ui.commands"><category id"com.xu.learn.…...
用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1
希望借助手写这个go的中间件项目,能够理解go语言的特性以及用go写中间件的优势之处,同时也是为了更好的使用和优化公司用到的trpc,并且作者之前也使用过grpc并有一定的兴趣,所以打算从0构建一个rpc系统,对于生产环境已…...
树莓派(Raspberry Pi)入门建议
树莓派(Raspberry Pi)是一个低成本、信用卡大小的微型电脑,它的核心价值在于高度灵活的可编程性和丰富的硬件扩展能力。根据你的兴趣和需求,它可以用来做各种有趣且实用的项目,以下是常见的应用场景和实例:…...
SpringBoot物资管理系统 | JavaWeb项目设计与实现
概述 基于JavaWeb技术实现了一套完整的物资管理解决方案。该系统适用于企业、学校、医院等机构,提供高效的物资入库、申报、公告管理等功能,帮助用户实现物资管理的数字化与智能化。 主要内容 1. 管理员功能实现 5.1.1 物资管…...
《P1950 长方形》
题目描述 小明今天突发奇想,想从一张用过的纸中剪出一个长方形。 为了简化问题,小明做出如下规定: (1)这张纸的长宽分别为 n,m。小明将这张纸看成是由nm个格子组成,在剪的时候,只能沿着格子的…...
SpringCloud微服务架构
Spring Cloud是一个广泛使用的微服务框架,它基于Spring Boot构建,旨在帮助开发者构建复杂的分布式系统。Spring Cloud提供了多种工具和库,使得开发人员可以轻松地构建和部署微服务架构。以下是一些关键组件和概念,帮助你理解Sprin…...
网络管理知识点
1.传统网络管理:Web网管方式,CLI方式,基于SNMP集中管理 2.SNMP简单网络管理协议 SNMPV1实现方便,安全性弱 SNMPV2支持更多错误 SNMPV3认证加密,访问控制 3.SNMP,UDP传输效率较高,报文容易丢失…...
【Web应用服务器_Tomcat】二、Tomcat 核心配置与集群搭建
在企业级 Java Web 应用的部署场景中,Tomcat 作为主流的 Servlet 容器和 Web 服务器,其核心配置的优化以及集群搭建对于保障应用的高性能、高可用性至关重要。 一、Tomcat 核心配置优化 1.1 server.xml 配置文件解析 Tomcat 的核心配置文件server…...
模板引擎语法-算术运算
模板引擎语法-算术运算 文章目录 模板引擎语法-算术运算[toc]1.加法运算2.减法运算3.乘法与除法运算4.四则运算5.整除运算 在Django框架模板中,没有专门定义关于算术运算的语法。不过,通过一些标签和过滤器的配合使用,可以模拟实现类似“加减…...
MySQL 联合查询教程
MySQL 联合查询教程 在 MySQL 中,联合查询用于从多个表中检索数据,常用于关联表中的信息。联合查询(JOIN)通过将两个或更多表根据一定条件连接起来,从而形成一个虚拟的结果集。MySQL 支持多种类型的联合查询ÿ…...
罗技Flow跨电脑控制
Windows 下载适用于 Windows 10 或更高版本的应用程序 macOS 下载适用于 macOS 12 或更高版本的应用程序 Flow 让您可以在两台电脑之间甚至 Windows 和 macOS 之间畅快办公。 只需将支持 Flow 的鼠标的光标移动到屏幕边缘即可在电脑和操作系统之间切换。支持 Flow 的键盘会…...
Unity网络编程入门:掌握Netcode for GameObjects实现多人游戏基础(Day 39)
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
LeetCode100题
LeetCode100 两数之和 遍历数组,以哈希表存数与下标,边存边查,速找和为目标值的两数下标 class Solution {public int[] twoSum(int[] nums, int target) {int[] ansnew int[2];HashMap<Integer,Integer> mapnew HashMap<>();…...
鸿蒙代码@Builder
#代码如下: Entry Component struct CardExample {State title: string "欢迎使用鸿蒙";State content: string "这是一段自定义内容";build() {Column() {this.MyCard({ title: this.title, content: this.content })}.padding(20)}BuilderM…...
Gewechat启动启动报错
Centos7,测试连接时发现这个错误。 [rootxin ~]# curl -i -X POST http://127.0.0.1:2531/v2/api/tools/getTokenId curl: (56) Recv failure: Connection reset by peer 1、删除原容器,重新构建。 docker run -itd \--name gewe \--privileged \-v /ro…...
硅谷甄选41集-71集
第四十三集:完全按照视频敲代码的话会发现左侧顶部tabbar的display:flex失效了,是因为拆分开的子组件里面多了一个div,去掉就好了,vue3不需要再额外包裹元素。因为路径变化了,所以找不到图片的话在前面再加一个…。 第四十五集&am…...
PyQt6实例_消息工具_使用与完整代码分享
目录 使用 每日消息 全局查询 更新数据库 代码 数据库表创建 代码-数据库相关操作 代码-界面与操作逻辑 视频 使用 工具有三个面板:每日消息、全局查询、更新数据库 “每日消息”和“全局查询”,数据源:同花顺7x24小时快讯 “更新…...