GR5526 128BIT UUID改16BIT UUID
以下两个宏定义是我添加的。其中USING_128BIT_UUID的条件编译部分是SDK原生部分,USING_16BIT_UUID条件编译部分则是由我修改,通过这样的修改,128BIT UUID就变更为16BIT UUID了。如果你的广播、扫描响应有涉及UUID,不要忘记更改它。
#define USING_128BIT_UUID (0)//使用128bit UUID,请定义为1.
#define USING_16BIT_UUID (1)//使用16bit UUID,请定义为1.
/******************************************************************************************** @file otas.c** @brief Over The Air Server Implementation.****************************************************************************************** @attention#####Copyright (c) 2019 GOODIXAll rights reserved.Redistribution and use in source and binary forms, with or withoutmodification, are permitted provided that the following conditions are met:* Redistributions of source code must retain the above copyrightnotice, this list of conditions and the following disclaimer.* Redistributions in binary form must reproduce the above copyrightnotice, this list of conditions and the following disclaimer in thedocumentation and/or other materials provided with the distribution.* Neither the name of GOODIX nor the names of its contributors may be usedto endorse or promote products derived from this software withoutspecific prior written permission.THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THEIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSEARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT HOLDERS AND CONTRIBUTORS BELIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, ORCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OFSUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESSINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER INCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THEPOSSIBILITY OF SUCH DAMAGE.******************************************************************************************//** INCLUDE FILES*****************************************************************************************/
#include "otas.h"
#include "ble_prf_types.h"
#include "ble_prf_utils.h"
#include "utility.h"#define USING_128BIT_UUID (0)//使用128bit UUID,请定义为1.
#define USING_16BIT_UUID (1)//使用16bit UUID,请定义为1.
/** DEFINES*****************************************************************************************/
/**@brief Proprietary UUIDs. */
#if(USING_128BIT_UUID==1)#define OTA_SERVICE_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, 0x01, 0x04, 0xED, 0xA6}#define OTA_SERVICE_TX_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, 0x02, 0x04, 0xED, 0xA6}#define OTA_SERVICE_RX_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, 0x03, 0x04, 0xED, 0xA6}#define OTA_SERVICE_CTRL_UUID {0x1B, 0xD7, 0x90, 0xEC, 0xE8, 0xB9, 0x75, 0x80, 0x0A, 0x46, 0x44, 0xD3, 0x04, 0x04, 0xED, 0xA6}
#elif(USING_16BIT_UUID==1)#define OTA_SERVICE_UUID 0xFF00#define OTA_SERVICE_TX_UUID 0xFF01#define OTA_SERVICE_RX_UUID 0xFF02#define OTA_SERVICE_CTRL_UUID 0xFF03
#endif/**@brief Macros for conversion of 128bit to 16bit UUID. */
#if(USING_128BIT_UUID==1)#define ATT_128_PRIMARY_SERVICE BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_PRIMARY_SERVICE)#define ATT_128_CHARACTERISTIC BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DECL_CHARACTERISTIC)#define ATT_128_CLIENT_CHAR_CFG BLE_ATT_16_TO_128_ARRAY(BLE_ATT_DESC_CLIENT_CHAR_CFG)
#elif(USING_16BIT_UUID==1)#endif
/** ENUMERATIONS*****************************************************************************************/
/**@brief OTA Service Attributes Indexes. */
enum otas_attr_idx_tag
{OTAS_IDX_SVC,OTAS_IDX_TX_CHAR,OTAS_IDX_TX_VAL,OTAS_IDX_TX_CFG,OTAS_IDX_RX_CHAR,OTAS_IDX_RX_VAL,OTAS_IDX_CTRL_CHAR,OTAS_IDX_CTRL_VAL,OTAS_IDX_NB,
};/** STRUCT DEFINE*****************************************************************************************/
struct otas_env_t
{otas_init_t otas_init;uint16_t ntf_cfg[OTAS_CONNECTION_MAX];uint16_t start_hdl;ble_gatts_create_db_t otas_att_db;
};/** LOCAL VARIABLE DEFINITIONS*****************************************************************************************/
static struct otas_env_t s_otas_env;
static uint16_t s_char_mask = 0xff;
#if(USING_128BIT_UUID==1)static const uint8_t s_otas_svc_uuid[] = {BLE_UUID_OTA_SERVICE};
#elif(USING_16BIT_UUID==1)static const uint8_t s_otas_svc_uuid[] = BLE_ATT_16_TO_16_ARRAY(OTA_SERVICE_UUID);
#endif/**@brief Full OTAS Database Description - Used to add attributes into the database. */
#if(USING_128BIT_UUID==1)static const ble_gatts_attm_desc_128_t otas_att_db[OTAS_IDX_NB] = {static const ble_gatts_attm_desc_t otas_att_db[OTAS_IDX_NB] = {// OTA service[OTAS_IDX_SVC] = {ATT_128_PRIMARY_SERVICE, BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA TX Characteristic Declaration[OTAS_IDX_TX_CHAR] = {ATT_128_CHARACTERISTIC,BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA TX Characteristic Value[OTAS_IDX_TX_VAL] = {OTA_SERVICE_TX_UUID,BLE_GATTS_NOTIFY_PERM_UNSEC, (BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_128)),OTAS_MAX_DATA_LEN},// OTA TX Characteristic - Client Characteristic Configuration Descriptor[OTAS_IDX_TX_CFG] = {ATT_128_CLIENT_CHAR_CFG,BLE_GATTS_READ_PERM_UNSEC| BLE_GATTS_WRITE_REQ_PERM_UNSEC,0,0},// OTA RX Characteristic Declaration[OTAS_IDX_RX_CHAR] = {ATT_128_CHARACTERISTIC, BLE_GATTS_READ_PERM_UNSEC, 0, 0 },// OTA RX Characteristic Value[OTAS_IDX_RX_VAL] = {OTA_SERVICE_RX_UUID,BLE_GATTS_WRITE_CMD_PERM_UNSEC,(BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_128)),OTAS_MAX_DATA_LEN},// OTA CTRL Characteristic Declaration[OTAS_IDX_CTRL_CHAR] = {ATT_128_CHARACTERISTIC, BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA CTRL Characteristic Value[OTAS_IDX_CTRL_VAL] = {OTA_SERVICE_CTRL_UUID,BLE_GATTS_WRITE_CMD_PERM_UNSEC,(BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_128)),sizeof(uint32_t)},
};
#elif(USING_16BIT_UUID==1)
static const ble_gatts_attm_desc_t otas_att_db[OTAS_IDX_NB] = {// OTA service[OTAS_IDX_SVC] = {BLE_ATT_DECL_PRIMARY_SERVICE, BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA TX Characteristic Declaration[OTAS_IDX_TX_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC,BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA TX Characteristic Value[OTAS_IDX_TX_VAL] = {OTA_SERVICE_TX_UUID,BLE_GATTS_NOTIFY_PERM_UNSEC, (BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_16)),OTAS_MAX_DATA_LEN},// OTA TX Characteristic - Client Characteristic Configuration Descriptor[OTAS_IDX_TX_CFG] = {BLE_ATT_DESC_CLIENT_CHAR_CFG,BLE_GATTS_READ_PERM_UNSEC| BLE_GATTS_WRITE_REQ_PERM_UNSEC,0,0},// OTA RX Characteristic Declaration[OTAS_IDX_RX_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, BLE_GATTS_READ_PERM_UNSEC, 0, 0 },// OTA RX Characteristic Value[OTAS_IDX_RX_VAL] = {OTA_SERVICE_RX_UUID,BLE_GATTS_WRITE_CMD_PERM_UNSEC,(BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_16)),OTAS_MAX_DATA_LEN},// OTA CTRL Characteristic Declaration[OTAS_IDX_CTRL_CHAR] = {BLE_ATT_DECL_CHARACTERISTIC, BLE_GATTS_READ_PERM_UNSEC, 0, 0},// OTA CTRL Characteristic Value[OTAS_IDX_CTRL_VAL] = {OTA_SERVICE_CTRL_UUID,BLE_GATTS_WRITE_CMD_PERM_UNSEC,(BLE_GATTS_ATT_VAL_LOC_USER | BLE_GATTS_ATT_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_16)),sizeof(uint32_t)},
};
#endif
/** LOCAL FUNCTION DEFINITIONS*****************************************************************************************/
/******************************************************************************************** @brief Handles reception of the attribute info request message.** @param[in] conn_idx: Connection index* @param[in] p_param: The parameters of the read request.******************************************************************************************/
static void otas_read_att_evt_handler(uint8_t conn_idx, const ble_gatts_evt_read_t *p_param)
{ble_gatts_read_cfm_t cfm;uint8_t handle = p_param->handle;uint8_t tab_index = 0;tab_index = prf_find_idx_by_handle(handle, s_otas_env.start_hdl, OTAS_IDX_NB, (uint8_t*)&s_char_mask);cfm.handle = handle;cfm.status = BLE_SUCCESS;switch(tab_index){case OTAS_IDX_TX_CFG:cfm.length = sizeof(uint16_t);cfm.value = (uint8_t *)(&s_otas_env.ntf_cfg[conn_idx]);break;default:cfm.length = 0;cfm.status = BLE_ATT_ERR_INVALID_HANDLE;break;}ble_gatts_read_cfm(conn_idx,&cfm);
}/******************************************************************************************** @brief Handles reception of the write request.** @param[in] conn_idx: of connection index* @param[in] p_param: Pointer to the parameters of the write request.******************************************************************************************/
static void otas_write_att_evt_handler(uint8_t conn_idx, const ble_gatts_evt_write_t *p_param)
{ble_gatts_write_cfm_t cfm;uint8_t handle = p_param->handle;uint8_t tab_index = 0;uint16_t cccd_value = 0;otas_evt_t event;tab_index = prf_find_idx_by_handle(handle, s_otas_env.start_hdl, OTAS_IDX_NB, (uint8_t*)&s_char_mask);cfm.handle = handle;cfm.status = BLE_SUCCESS;switch(tab_index){case OTAS_IDX_RX_VAL:if(s_otas_env.otas_init.evt_handler != NULL){event.conn_idx = conn_idx;event.evt_type = OTAS_EVT_RX_RECEIVE_DATA;event.p_data = (uint8_t*)p_param->value;event.length = p_param->length;s_otas_env.otas_init.evt_handler(&event);}break;case OTAS_IDX_TX_CFG:cccd_value = le16toh(&p_param->value[0]);if(s_otas_env.otas_init.evt_handler != NULL){event.conn_idx = conn_idx;event.evt_type = (cccd_value == PRF_CLI_START_NTF) ?\OTAS_EVT_TX_NOTIFICATION_ENABLED :OTAS_EVT_TX_NOTIFICATION_DISABLED;s_otas_env.otas_init.evt_handler(&event);}s_otas_env.ntf_cfg[conn_idx] = cccd_value;break;case OTAS_IDX_CTRL_VAL:if(le32toh(&p_param->value[0]) == OTAS_CTRL_ENTER_DFU){if(s_otas_env.otas_init.evt_handler != NULL){event.conn_idx = conn_idx;event.evt_type = OTAS_EVT_DFU_MODE_ENTER;s_otas_env.otas_init.evt_handler(&event);}}break;default:cfm.status = BLE_ATT_ERR_INVALID_HANDLE;break;}ble_gatts_write_cfm(conn_idx,&cfm);
}/******************************************************************************************** @brief Handles reception of the cccd recover request.** @param[in]: conn_idx: Connection index* @param[in]: handle: The handle of cccd attribute.* @param[in]: cccd_value: The value of cccd attribute.******************************************************************************************/
static void otas_cccd_set_evt_handler(uint8_t conn_idx, uint16_t handle, uint16_t cccd_value)
{uint8_t tab_index = 0;otas_evt_t event;if (!prf_is_cccd_value_valid(cccd_value)){return;}tab_index = prf_find_idx_by_handle(handle, s_otas_env.start_hdl, OTAS_IDX_NB, (uint8_t*)&s_char_mask);switch(tab_index){case OTAS_IDX_TX_CFG:if(s_otas_env.otas_init.evt_handler != NULL){event.conn_idx = conn_idx;event.evt_type = (cccd_value == PRF_CLI_START_NTF) ?\OTAS_EVT_TX_NOTIFICATION_ENABLED :OTAS_EVT_TX_NOTIFICATION_DISABLED;s_otas_env.otas_init.evt_handler(&event);}s_otas_env.ntf_cfg[conn_idx] = cccd_value;break;default:break;}
}/******************************************************************************************** @brief Handles reception of the complete event.** @param[in] conn_idx: Connection index* @param[in] p_param: Pointer to the parameters of the complete event.** @return If the event was consumed or not.******************************************************************************************/
static void otas_ntf_cplt_evt_handler(uint8_t conn_idx, uint8_t status, const ble_gatts_evt_ntf_ind_t *p_ntf_ind)
{if(s_otas_env.otas_init.evt_handler != NULL){otas_evt_t event;event.conn_idx = conn_idx;if(status == BLE_SUCCESS){if(p_ntf_ind->type == BLE_GATT_NOTIFICATION){event.evt_type = OTAS_EVT_NOTIFY_COMPLETE;s_otas_env.otas_init.evt_handler(&event);}}}}static void otas_ble_evt_handler(const ble_evt_t *p_evt)
{if (NULL == p_evt){return;}switch (p_evt->evt_id){case BLE_GATTS_EVT_READ_REQUEST:otas_read_att_evt_handler(p_evt->evt.gatts_evt.index, &p_evt->evt.gatts_evt.params.read_req);break;case BLE_GATTS_EVT_WRITE_REQUEST:otas_write_att_evt_handler(p_evt->evt.gatts_evt.index, &p_evt->evt.gatts_evt.params.write_req);break;case BLE_GATTS_EVT_NTF_IND:otas_ntf_cplt_evt_handler(p_evt->evt.gatts_evt.index, p_evt->evt_status, &p_evt->evt.gatts_evt.params.ntf_ind_sended);break;case BLE_GATTS_EVT_CCCD_RECOVERY:otas_cccd_set_evt_handler(p_evt->evt.gatts_evt.index, p_evt->evt.gatts_evt.params.cccd_recovery.handle, p_evt->evt.gatts_evt.params.cccd_recovery.cccd_val);break;}
}/** GLOBAL FUNCTION DEFINITIONS*****************************************************************************************/
sdk_err_t otas_notify_tx_data(uint8_t conn_idx,uint8_t* p_data,uint16_t len)
{sdk_err_t error_code = SDK_ERR_NTF_DISABLED;ble_gatts_noti_ind_t send_cmd;if(s_otas_env.ntf_cfg[conn_idx] == PRF_CLI_START_NTF){// Fill in the parameter structuresend_cmd.type = BLE_GATT_NOTIFICATION;send_cmd.handle = prf_find_handle_by_idx(OTAS_IDX_TX_VAL, s_otas_env.start_hdl, (uint8_t*)&s_char_mask);// pack measured value in databasesend_cmd.length = len;send_cmd.value = p_data;// send notification to peer deviceerror_code = ble_gatts_noti_ind(conn_idx,&send_cmd);} return error_code;
}sdk_err_t otas_service_init(otas_init_t *p_otas_init)
{if (NULL == p_otas_init){return SDK_ERR_POINTER_NULL;}s_otas_env.otas_init.evt_handler = p_otas_init->evt_handler;memset(&s_otas_env.otas_att_db, 0, sizeof(ble_gatts_create_db_t));s_otas_env.start_hdl = PRF_INVALID_HANDLE;s_otas_env.otas_att_db.shdl = &s_otas_env.start_hdl;s_otas_env.otas_att_db.uuid = s_otas_svc_uuid;s_otas_env.otas_att_db.attr_tab_cfg = (uint8_t *)&s_char_mask;s_otas_env.otas_att_db.max_nb_attr = OTAS_IDX_NB;#if(USING_128BIT_UUID==1)s_otas_env.otas_att_db.srvc_perm = BLE_GATTS_SRVC_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_128);s_otas_env.otas_att_db.attr_tab_type = BLE_GATTS_SERVICE_TABLE_TYPE_128;s_otas_env.otas_att_db.attr_tab.attr_tab_128 = otas_att_db;#elif(USING_16BIT_UUID==1)s_otas_env.otas_att_db.srvc_perm = BLE_GATTS_SRVC_UUID_TYPE_SET(BLE_GATTS_UUID_TYPE_16);s_otas_env.otas_att_db.attr_tab_type = BLE_GATTS_SERVICE_TABLE_TYPE_16;s_otas_env.otas_att_db.attr_tab.attr_tab_16 = otas_att_db;#endifreturn ble_gatts_prf_add(&s_otas_env.otas_att_db, otas_ble_evt_handler);
}
相关文章:
GR5526 128BIT UUID改16BIT UUID
以下两个宏定义是我添加的。其中USING_128BIT_UUID的条件编译部分是SDK原生部分,USING_16BIT_UUID条件编译部分则是由我修改,通过这样的修改,128BIT UUID就变更为16BIT UUID了。如果你的广播、扫描响应有涉及UUID,不要忘记更改它。…...
【Android】使用 CameraX 实现基础拍照功能
目录 目录 1. 基础开发环境 2. 添加相关依赖 3. APP 布局 4. 主流程逻辑 5. 调试或安装 APK 1. 基础开发环境 JDK:JDK17 Android Studio:Android Studio Giraffe | 2022.3.1 Android SDK:Android API 34 Gradle: gradle-7.2-bin.zip Ca…...

刷题笔记 day2
力扣 1089 复写零 思路:双指针 第一步:利用指针 cur 去记录最后一位要复写的数 , 利用指针 dest 指向最后一位数所要复写的位置; 实现过程:最开始 cur 指向0,dest 指向 -1 , 当arr[cur] ! …...

回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测
回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测 目录 回归预测 | MATLAB实现SO-CNN-LSTM蛇群算法优化卷积长短期记忆神经网络多输入单输出回归预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SO-CNN-LS…...

使用UltraISO制作麒麟v10系统盘
大家好,我是早九晚十二,目前是做运维相关的工作。写博客是为了积累,希望大家一起进步! 我的主页:早九晚十二 文章目录 1 背景2 准备工作2.1 镜像准备2.2 制作工具2.3 启动U盘 3 制作步骤3.1 找到ISO文件,右…...

【RabbitMQ】之消息的可靠性方案
目录 一、数据丢失场景二、数据可靠性方案 1、生产者丢失消息解决方案2、MQ 队列丢失消息解决方案3、消费者丢失消息解决方案 一、数据丢失场景 MQ 消息数据完整的链路为:从 Producer 发送消息到 RabbitMQ 服务器中,再由 Broker 服务的 Exchange 根据…...

性能测试/负载测试/压力测试之间的区别
做测试一年多来,虽然平时的工作都能很好的完成,但最近突然发现自己在关于测试的整体知识体系上面的了解很是欠缺,所以,在工作之余也做了一些测试方面的知识的补充。不足之处,还请大家多多交流,互相学习。 …...

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper
根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下: 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例,穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…...
sonarqube PHP编码规范检查
一、PSR规范整理 PHP 已有的编码规范如下 https://blog.csdn.net/qq_40876291/article/details/103848172 1.1 基本编码规范:PSR1 官网规范链接 https://www.php-fig.org/psr/psr-1/ 文件只能使用<?php和<?标记。文件必须仅使用UTF-8,而不使…...
Kylin 麒麟 Qt软件 QtCreator 中文输入法问题
Kylin 麒麟 Qt软件 QtCreator 中文输入法问题 背景: QtCreator 和程序在麒麟系统下没法进行输入,或没法进行输入法的切换。 包括麒麟自带默认搜狗输入法的切换也不行。 使用下面的命令进行安装后,可以正常在QtCreator和程序中使用输入法。 …...

租赁固定资产管理
智能租赁资产管理系统可以为企业单位提供RFID资产管理系统。移动APP资产管理,准确总结易损耗品和固定资金,从入库到仓库库存实时跟踪,控制出库和入库的全过程。同时,备件和耗材与所属资产设备有关,便于备件的申请和管理…...
【Kubernetes】Kubernetes的概念
Kubernetes 一、Kubernetes 概述1.Kubernetes 是什么?2. Kubernetes 的作用3. 为什么要用 Kubernetes?4. Kubernetes 的概念5. Kubernetes 的主要功能6. Kubernetes 集群架构与组件二、Kubernetes 的组件1. Master 组件1.1 Kube-apiserver1.2 Kube-controller-manager1.3 Kub…...

抖音短视频seo源码矩阵系统开发
一、前言: 抖音SEO源码矩阵系统开发是一项专为抖音平台设计的SEO优化系统,能够帮助用户提升抖音视频的搜索排名和曝光度。为了确保系统运行正常,需要安装FFmpeg和FFprobe工具。FFmpeg是一个用于处理多媒体数据的开源工具集,而FFpr…...
npm install pnpm -g报错解决!
目录 报错信息:(反正就是各种err) 报错分析: 错误处理: 其它pnpm报错传送门: 报错信息:(反正就是各种err) npm ERR! code EPERM npm ERR! syscall mkdir npm ERR! pa…...

vue2、vue3生命周期详解以及对比
文章目录 对比vue2-vue3vue3生命周期生命周期的主要阶段详情 vue2 生命周期生命周期钩子函数 总共11个 常用的8个按照这四个阶段我们对应有八个生命周期钩子函数vue生命周期使用场景 对比vue2-vue3 如果熟悉vue2的话,vue3信手拈来,看图 vue3生命周期 on…...

JSON动态生成表格
<!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><script>var fromjava"{\"total\":3,\"students\":[{\"name\":\"张三\",\&q…...
C# Winform中使用SendMessage方法(发送消息与接收消息)
C# Winform窗口间消息通知,使用Windows API SendMessage方法跨进程实现消息发送,重写WndProc方法接收消息并消息处理 主要使用到如下三个方法函数: WndProc:主要用在拦截并处理系统消息和自定义消息 可以重写WndProc函数…...

Netty各组件基本用法、入站和出站详情、群聊系统的实现、粘包和拆包
Netty Bootstrap和ServerBootstrapFuture和ChannelFutureChannelSelectorNioEventLoop和NioEventLoopGroupByteBuf示例代码 Channel相关组件入站详情出站详情对象编解码ProtoBuf和ProtoStuffnetty实现群聊系统粘包和拆包TCP协议特点举个例子 Bootstrap和ServerBootstrap Boots…...

Day03-作业(AxiosElementUI)
作业1: 根据需求完成如下页面数据列表展示 需求:Vue挂载完成后,通过axios发送异步请求到服务端,获取学生列表数据,并通过Vue展示在页面上 获取数据url:http://yapi.smart-xwork.cn/mock/169327/student 素材: <!DOCTYPE html…...

低代码开发平台源码:基于模型驱动,内置功能强大的建模引擎,零代码也能快速创建智能化、移动化的企业应用程序
管理后台低代码PaaS平台是一款基于 Salesforce Platform 的开源替代方案,旨在为企业提供高效、灵活、易于使用的低代码开发平台。低代码PaaS平台的10大核心引擎功能:1.建模引擎 2.移动引擎 3.流程引擎 4.页面引擎 5.报表引擎 6.安全引擎 7.API引擎 8.应用集成引擎 9…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...