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

OpenHarmony-4.HDI 框架

  • HDI 框架

1.HDI介绍

  HDI(Hardware Device Interface,硬件设备接口)是HDF驱动框架为开发者提供的硬件规范化描述性接口,位于基础系统服务层和设备驱动层之间,是连通驱动程序和系统服务进行数据流通的桥梁,是提供给硬件系统服务开发者使用的、统一的硬件设备功能抽象接口,其目的是为系统服务屏蔽南向设备差异。

  在OpenHarmony 分层结构中,HDI位于 “基础系统服务层”和“设备抽象层(DAL)”之间。硬件设备通过DAL抽象化,并基于IDL(Interface Description Language)接口描述语言描述后,为上层应用或服务提供了规范的硬件设备接口。
在这里插入图片描述

2.HDI实现

2.1.IDL接口描述语言

  IDL(Interface Description Language)是一类用来描述接口的语言,通过一种中立的方式来定义客户端与服务端均认可的编程接口,可以实现在二者间的跨进程通信(IPC)。跨进程通信意味着可以在一个进程访问另一个进程的数据,或调用另一个进程的方法。通常把应用接口提供方(供调用)称为服务端,调用方称为客户端。

  IDL先把需要传递的对象分解成操作系统能够理解的基本类型,然后根据接口声明编译,生成IPC/RPC代理(Proxy)和桩(Stub)的C/C++代码,从而为调用者提供一致的接口和调用方式。

  使用IDL语法描述HDI接口并保存为.idl文件,.idl文件在编译过程中转换为C/C++语言的函数接口声明、客户端与服务端IPC相关过程代码,开发时只需要基于生成的头文件中函数接口实现具体服务功能即可。代码生成与编译功能已经集成在hdi.gni编译模板,基于该编译模板编写idl文件的BUILD.gn就可以简单的生成客户端、服务端代码并编译为共享库。如下图所示:
在这里插入图片描述

drivers_interface 仓库:

├── README.en.md
├── README.md
├── sensor                          #sensor HDI 接口定义
│   └── v1_0                        #sensor HDI 接口 v1.0版本定义
│       ├── BUILD.gn                #sensor idl文件编译脚本
│       ├── ISensorCallback.idl     #sensor callback 接口定义idl文件
│       ├── ISensorInterface.idl    #sensor interface 接口定义idl文件
│       └── SensorTypes.idl         #sensor 数据类型定义idl文件
├── audio                           #audio HDI 接口定义
│   └── ...
├── camera                          #camera HDI接口定义
├── codec                           #codec HDI接口定义
├── display                         #display HDI接口定义
├── face_auth                       #faceauth HDI接口定义
├── format                          #format HDI接口定义
├── input                           #input HDI接口定义
├── misc                            #misc HDI接口定义
├── pinauth                         #pinauth HDI接口定义
├── usb                             #usb HDI接口定义
├── fingerprint_auth                #fingerprintauth HDI接口定义
└── wlan                            #wlan HDI接口定义

2.2.使用IDL语法编写 .idl 文件

  创建对应模块/版本接口目录,初始版本定义为v1_0,如 drivers/interface/input/v1.0/目录:

-rw-r--r--. 1 iscas iscas 1.1K Dec 17 11:28 BUILD.gn
-rw-r--r--. 1 iscas iscas 2.4K Dec 17 11:28 IInputCallback.idl
-rw-r--r--. 1 iscas iscas  14K Dec 17 11:28 IInputInterfaces.idl
-rw-r--r--. 1 iscas iscas 5.4K Dec 17 11:28 InputTypes.idl
  • 定义接口IInputInterfaces.idl
 46 package ohos.hdi.input.v1_0;4748 import ohos.hdi.input.v1_0.IInputCallback;49 import ohos.hdi.input.v1_0.InputTypes;61 interface IInputInterfaces {75     ScanInputDevice([out] struct DevDesc[] staArr);89     OpenInputDevice([in] unsigned int devIndex);103    CloseInputDevice([in] unsigned int devIndex);118    GetInputDevice([in] unsigned int devIndex, [out] struct DeviceInfo devInfo);119    ...120 }
  • 如果接口中用到了自定义数据类型,将自定义类型定义到一个单独的.idl文件,如InputTypes.idl
 53 struct DevDesc {54     unsigned int devIndex;        /**< Device index */55     unsigned int devType;         /**< Device type */56 };5761 struct DevIdentify {62     unsigned short busType;       /**< Bus type */63     unsigned short vendor;        /**< Vendor ID */64     unsigned short product;       /**< Product ID */65     unsigned short version;       /**< Version */66 };
  • 如果需要从服务端回调,可以定义callback接口类,如IInputCallback.idl
 45 package ohos.hdi.input.v1_0;47 import ohos.hdi.input.v1_0.InputTypes;58 [callback] interface IInputCallback {69     EventPkgCallback([in] struct EventPackage[] pkgs, [in] unsigned int devIndex);79     HotPlugCallback([in] struct HotPlugEvent event);80 }

2.3.编写 idl文件的BUILD.gn

  drivers_interface/input/v1_0目录中添加BUILD.gn文件,内容如下:

 14 import("//build/config/components/hdi/hdi.gni")1516 if (defined(ohos_lite)) {17   group("libinput_proxy_1.0") {18     deps = []19     public_configs = []20   }21 } else {22   hdi("input") {23     module_name = "input_service"2425     sources = [26       "IInputCallback.idl",27       "IInputInterfaces.idl",28       "InputTypes.idl",29     ]30     mode = "passthrough"31     language = "cpp"32     subsystem_name = "hdf"33     part_name = "drivers_interface_input"34   }35 }

2.4.实现 HDI 服务

   .idl文件在编译过程中除了生成C/C++语言的函数接口声明、客户端与服务端IPC相关过程代码,还会生成驱动入口文件和驱动服务实现文件的模板(如图中间部分所示),实际开发中需要做的就是参照这两个模板根据实际业务需求将文件重新实现即可(如图右侧目录结构所示)。参考Battery IDL 接口如下图所示:
在这里插入图片描述

  在上述步骤中idl编译后将在out目录out/rk3568/gen/drivers/interfaces/input/v1_0生成中间代码。基于工具自动生成的input_interface_service.h,实现其中的服务接口。

oh41/out/rk3568/gen/drivers/interface/input/v1_0$ ls -lh
total 56K
-rw-rw-r-- 1 iscas iscas 1.7K 1217 16:16 iinput_callback.h
-rw-rw-r-- 1 iscas iscas 3.4K 1217 16:16 iinput_interfaces.h
-rw-rw-r-- 1 iscas iscas 1.1K 1217 16:16 input_callback_service.cpp
-rw-rw-r-- 1 iscas iscas 1.3K 1217 16:16 input_callback_service.h
-rw-rw-r-- 1 iscas iscas 1.7K 1217 16:16 input_interfaces_proxy.cpp
-rw-rw-r-- 1 iscas iscas 3.2K 1217 16:16 input_interfaces_service.cpp
-rw-rw-r-- 1 iscas iscas 2.7K 1217 16:16 input_interfaces_service.h
-rw-rw-r-- 1 iscas iscas 2.6K 1217 16:16 input_types.h

2.4.1.实现HDI服务接口

  基于工具自动生成的input_interface_service.h,实现其中的服务接口,并将相关源码编译为 libinput_interfaces_service_1.0.z.so。

  • drivers_peripheral\input\hdi_service\input_interfaces_impl.h:
#ifndef OHOS_HDI_INPUT_V1_0_INPUTINTERFACEIMPL_H
#define OHOS_HDI_INPUT_V1_0_INPUTINTERFACEIMPL_H#include "input_manager.h"
#include "v1_0/iinput_interfaces.h"namespace OHOS {
namespace HDI {
namespace Input {
namespace V1_0 {
class InputInterfacesImpl : public IInputInterfaces {
public:InputInterfacesImpl(): inputInterface_(NULL) {}virtual ~InputInterfacesImpl(){ReleaseInputInterface(&inputInterface_);}void Init();int32_t ScanInputDevice(std::vector<DevDesc> &staArr) override;int32_t OpenInputDevice(uint32_t devIndex) override;int32_t CloseInputDevice(uint32_t devIndex) override;int32_t GetInputDevice(uint32_t devIndex, DeviceInfo &devInfo) override;int32_t GetInputDeviceList(uint32_t &devNum, std::vector<DeviceInfo> &devList, uint32_t size) override;int32_t SetPowerStatus(uint32_t devIndex, uint32_t status) override;int32_t GetPowerStatus(uint32_t devIndex, uint32_t &status) override;int32_t GetDeviceType(uint32_t devIndex, uint32_t &deviceType) override;int32_t GetChipInfo(uint32_t devIndex, std::string &chipInfo) override;int32_t GetVendorName(uint32_t devIndex, std::string &vendorName) override;int32_t GetChipName(uint32_t devIndex, std::string &chipName) override;int32_t SetGestureMode(uint32_t devIndex, uint32_t gestureMode) override;int32_t RunCapacitanceTest(uint32_t devIndex, uint32_t testType, std::string &result,uint32_t length) override;int32_t RunExtraCommand(uint32_t devIndex, const ExtraCmd &cmd) override;int32_t RegisterReportCallback(uint32_t devIndex, const sptr<IInputCallback> &eventPkgCallback) override;int32_t UnregisterReportCallback(uint32_t devIndex) override;int32_t RegisterHotPlugCallback(const sptr<IInputCallback> &hotPlugCallback) override;int32_t UnregisterHotPlugCallback() override;
private:IInputInterface *inputInterface_;
};
} // V1_0
} // Input
} // HDI
} // OHOS#endif // OHOS_HDI_INPUT_V1_0_INPUTINTERFACEIMPL_H
  • drivers_peripheral\input\hdi_service\input_interfaces_impl.cpp:
int32_t InputInterfacesImpl::ScanInputDevice(std::vector<DevDesc> &staArr)
{if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||inputInterface_->iInputManager->ScanInputDevice == nullptr) {HDF_LOGE("%{public}s: get input device Module instance failed", __func__);return HDF_FAILURE;}InputDevDesc staArrHdf[MAX_DEVICES];int32_t ret = memset_s(staArrHdf, MAX_DEVICES * sizeof(InputDevDesc), 0, MAX_DEVICES * sizeof(InputDevDesc));ret = inputInterface_->iInputManager->ScanInputDevice(staArrHdf, MAX_DEVICES);for (uint32_t i = 0; i < MAX_DEVICES; i++) {DevDesc StaArr;StaArr.devIndex = staArrHdf[i].devIndex;StaArr.devType = staArrHdf[i].devType;staArr.push_back(StaArr);}return ret;
}int32_t InputInterfacesImpl::OpenInputDevice(uint32_t devIndex)
{if (inputInterface_ == nullptr || inputInterface_->iInputManager == nullptr ||inputInterface_->iInputManager->OpenInputDevice == nullptr) {HDF_LOGE("%{public}s: get input device Module instance failed", __func__);return HDF_FAILURE;}int32_t ret = inputInterface_->iInputManager->OpenInputDevice(devIndex);return ret;
}
...

2.4.2.实现驱动入口

  HDI服务发布是基于用户态HDF驱动框架,所以需要实现一个驱动入口。驱动实现代码参考已经在out目录中生成,可以根据业务需要直接使用该文件或参考该文件按业务需要重新实现, 然后将驱动入口源码编译为libinput_driver.z.so(该名称无强制规定,与hcs配置中配套即可)。

  • drivers_peripheral\input\hdi_service\input_interfaces_driver.cpp:
static void HdfInputInterfacesDriverRelease(struct HdfDeviceObject *deviceObject)
{HDF_LOGI("HdfInputInterfacesDriverRelease enter");if (deviceObject->service == nullptr) {HDF_LOGE("HdfInputInterfacesDriverRelease not initted");return;}auto *hdfInputInterfacesHost = CONTAINER_OF(deviceObject->service, struct HdfInputInterfacesHost, ioService);delete hdfInputInterfacesHost;
}struct HdfDriverEntry g_inputinterfacesDriverEntry = {.moduleVersion = 1,.moduleName = "input_service",.Bind = HdfInputInterfacesDriverBind,.Init = HdfInputInterfacesDriverInit,.Release = HdfInputInterfacesDriverRelease,
};

vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs

2.4.3.发布服务

  在产品hcs配置中声明HDI服务,以标准系统rk3568为例,HDF设备配置路径为vendor/hihope/rk3568/hdf_config/uhdf/device_info.hcs,在其中新增以下配置:

310             input_hdi_device :: device {
311                 device0 :: deviceNode {
312                     policy = 2;
313                     priority = 100;
314                     moduleName = "libinput_driver.z.so";
315                     serviceName = "input_interfaces_service";
316                 }
317             }

2.4.6.HDI使用

  • 在需要使用HDI服务的客户端BUILD.gn中增加依赖: “drivers_interface_input:libinput_proxy_1.0”
 powermgr/battery_manager/charger/BUILD.gn:60   external_deps = [61     "c_utils:utils",62     "config_policy:configpolicy_util",63     "drivers_interface_battery:libbattery_proxy_2.0",64     "drivers_interface_input:libinput_proxy_1.0",65     "init:libbegetutil",66     "ipc:ipc_core",67   ]
  • 在代码中调用HDI接口
base/powermgr/battery_manager/charger/src/charger_thread.cpp:
339 void ChargerThread::InitInput()
340 {
341     inputInterface = nullptr;
342     inputInterface = HDI::Input::V1_0::IInputInterfaces::Get(true);
347
348     const uint32_t POWERKEY_INPUT_DEVICE = 2;
349     int32_t ret = inputInterface->OpenInputDevice(POWERKEY_INPUT_DEVICE);
355
356     uint32_t devType = INDEV_TYPE_UNKNOWN;
357     ret = inputInterface->GetDeviceType(POWERKEY_INPUT_DEVICE, devType);
363
364     /* first param is powerkey input device, refer to device node '/dev/hdf_input_event2', so pass 2 */
365     if (g_callback == nullptr) {
366         g_callback = new (std::nothrow) HdfInputEventCallback();
367     }
372     ret = inputInterface->RegisterReportCallback(POWERKEY_INPUT_DEVICE, g_callback);
378 }

3.HDI 部署

  在不同量级的 OpenHarmony 系统上,HDI 存在两种部署形态,IPC 模式和直通模式。

在这里插入图片描述

  • 轻量级 OpenHarmony 系统,出于减小系统性能负载考虑,HDI 实现为用户态共享库,由系统服务直接加载 HDI 实现到自己进程中函数调用使用。HDI 实现封装具体的用户态-内核态交互过程,当需要访问驱动程序时使用 IO Service 请求将消息通过 system call 方式调用到内核驱动实现。

  • 标准 OpenHarmony 系统,HDI 以独立服务进程方式部署,系统服务只加载 HDI 客户端实现到自己进程中,实际业务运行在独立进程中,客户端通过 IPC 与服务端交互,便于架构解耦、权限管理。

3.1.HDI接口实现

  直通模式为函数实现方式,无论调用还是实现都不需要其他组件支持即可实现。

  IPC 模式基于 OpenHarmony 系统通信框架的通用模型,但是因为驱动很多时候涉及到底层操作和多系统迁移的场景而使用C语言编写,所以驱动框架还提供了 HDI 服务的 C 语言实现的基础组件,C++实现则主要使用系统通信框架组件。

3.2.IPC模式下的调用原理

  在IPC模式下,当系统服务调用HDI接口时,通过proxy库将函数调用转换为IPC请求,将接口调用的参数进行序列化;IPC请求通过IPC框架发送到服务端,请求将被stub库先处理,然后对接口调用的参数进行反序列化,再转换成对服务实现的函数调用,从而实现接口调用过程。

refer to

  • https://gitee.com/openharmony/drivers_interface
  • https://laval.csdn.net/67341a85cd8b2677c3df7942.html
  • https://baijiahao.baidu.com/s?id=1731328576146856524&wfr=spider&for=pc
  • https://developer.huawei.com/consumer/cn/forum/topic/0204858485287900172
  • https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/IDL/idl-guidelines.md#%E5%88%9B%E5%BB%BAidl%E6%96%87%E4%BB%B6

相关文章:

OpenHarmony-4.HDI 框架

HDI 框架 1.HDI介绍 HDI&#xff08;Hardware Device Interface&#xff0c;硬件设备接口&#xff09;是HDF驱动框架为开发者提供的硬件规范化描述性接口&#xff0c;位于基础系统服务层和设备驱动层之间&#xff0c;是连通驱动程序和系统服务进行数据流通的桥梁&#xff0c;是…...

leecode494.目标和

这道题目第一眼感觉就不像是动态规划&#xff0c;可以看出来是回溯问题&#xff0c;但是暴力回溯超时&#xff0c;想要用动态规划得进行一点数学转换 class Solution { public:int findTargetSumWays(vector<int>& nums, int target) {int nnums.size(),bagWeight0,s…...

在Spring中application 的配置属性(详细)

application 的配置属性。 这些属性是否生效取决于对应的组件是否声明为 Spring 应用程序上下文里的 Bean &#xff08;基本是自动配置 的&#xff09;&#xff0c;为一个不生效的组件设置属性是没有用的。 multipart multipart.enabled 开启上传支持&#xff08;默认&a…...

jvm符号引用和直接引用

在解析阶段中,符号引用和直接引用是Java类加载和内存管理中的重要概念,它们之间存在显著的区别。以下是对这两个概念的详细解析: 一、定义与特性 符号引用(Symbolic Reference) 定义:符号引用是编译器生成的用于表示类、方法、字段等的引用方式。特性: 独立性:符号引用…...

一文流:JVM精讲(多图提醒⚠️)

一文流系列是作者苦于技术知识学了-忘了,背了-忘了的苦恼,决心把技术知识的要点一笔笔✍️出来,一图图画出来,一句句讲出来,以求刻在🧠里。 该系列文章会把核心要点提炼出来,以求掌握精髓,至于其他细节,写在文章里,留待后续回忆。 目前进度请查看: :::info https:/…...

python 分段拟合笔记

效果图: 源代码: import numpy as np import cv2 import matplotlib.pyplot as plt from numpy.polynomial.polynomial import Polynomialdef nihe(x_points,y_points,p_id):# 按照 p_id 将 points 分成两组group_0_x = []group_0_y = []group_1_x = []group_1_y = []for i, …...

Mysql索引类型总结

按照数据结构维度划分&#xff1a; BTree 索引&#xff1a;MySQL 里默认和最常用的索引类型。只有叶子节点存储 value&#xff0c;非叶子节点只有指针和 key。存储引擎 MyISAM 和 InnoDB 实现 BTree 索引都是使用 BTree&#xff0c;但二者实现方式不一样&#xff08;前面已经介…...

数据结构——队列的模拟实现

大家好&#xff0c;上一篇博客我带领大家进行了数据结构当中的栈的模拟实现 今天我将带领大家实现一个新的数据结构————队列 一&#xff1a;队列简介 首先来认识一下队列&#xff1a; 队列就像我们上学时的排队一样&#xff0c;有一个队头也有一个队尾。 有人入队的话就…...

在window环境下安装openssl生成钥私、证书和签名,nodejs利用express实现ssl的https访问和测试

在生成我们自己的 SSL 证书之前&#xff0c;让我们创建一个简单的 Express应用程序。 要创建一个新的 Express 项目&#xff0c;让我们创建一个名为node-ssl -server 的目录&#xff0c;用终端cmd中进入node-ssl-server目录。 cd node-ssl-server 然后初始化一个新的 npm 项目…...

Redis 最佳实践

这是以前写下来的文章&#xff0c;发出来备份一下 Redis 在企业中的最佳实践可以帮助提高性能、可用性和数据管理效率。以下是一些推荐的做法&#xff1a; 选择合适的数据结构&#xff1a; 根据需求选择适当的 Redis 数据结构&#xff08;如 Strings、Lists、Sets、Hashes、So…...

网站灰度发布?Tomcat的8005、8009、8080三个端口的作用什么是CDNLVS、Nginx和Haproxy的优缺点服务器无法开机时

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c; 忍不住分享一下给大家。点击跳转到网站 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把…...

从客户跟进到库存管理:看板工具赋能新能源汽车销售

在新能源汽车市场日益扩张的今天&#xff0c;门店销售管理变得更加复杂和重要。从跟踪客户线索到优化订单流程&#xff0c;再到团队协作&#xff0c;效率低下常常成为许多门店的“隐形成本”。如果你曾为销售流程不畅、客户管理混乱而苦恼&#xff0c;那么一种简单直观的工具—…...

算法时间空间复杂度的计算

一、时间复杂度 &#xff1a;找循环最内层 二、空间复杂度&#xff1a; 1.找int float等变量 2.递归调用&#xff1a;空间复杂度递归调用的深度 int 型变量: 四个字节...

人才画像系统如何支撑企业的人才战略落地

在当今竞争激烈的商业环境中&#xff0c;企业的人才战略对于其长期发展至关重要。为了有效实施人才战略&#xff0c;企业需要一套精准、高效的人才管理工具&#xff0c;而人才画像系统正是满足这一需求的关键解决方案。本文将探讨人才画像系统如何支撑企业的人才战略落地&#…...

[数据结构] 链表

目录 1.链表的基本概念 2.链表的实现 -- 节点的构造和链接 节点如何构造? 如何将链表关联起来? 3.链表的方法(功能) 1).display() -- 链表的遍历 2).size() -- 求链表的长度 3).addFirst(int val) -- 头插法 4).addLast(int val) -- 尾插法 5).addIndex -- 在任意位置…...

三格电子——新品IE103转ModbusTCP网关

型号&#xff1a;SG-TCP-IEC103 产品概述 IE103转ModbusTCP网关型号SG-TCP-IEC103&#xff0c;是三格电子推出的工业级网关&#xff08;以下简称网关&#xff09;&#xff0c;主要用于IEC103数据采集、DLT645-1997/2007数据采集&#xff0c;IEC103支持遥测和遥信&#xff0c;可…...

遥感影像目标检测:从CNN(Faster-RCNN)到Transformer(DETR

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...

深入详解神经网络基础知识——理解前馈神经网络( FNN)、卷积神经网络(CNN)和循环神经网络(RNN)等概念及应用

深入详解神经网络基础知识 深度学习作为人工智能&#xff08;AI&#xff09;的核心分支之一&#xff0c;近年来在各个领域取得了显著的成果。从图像识别、自然语言处理到自动驾驶&#xff0c;深度学习技术的应用无处不在。而深度学习的基础&#xff0c;神经网络&#xff0c;是理…...

react 项目打包二级目 使用BrowserRouter 解决页面刷新404 找不到路由

使用BrowserRouter package 配置 &#xff08;这部分代码可以不做配置也能实现&#xff09; {"homepage": "/admin",}vite.config 配置 export default defineConfig({base: /admin])BrowserRouter 添加配置项 <BrowserRouter basename/admin>&l…...

EasyPlayer.js播放器Web播放H.265要兼顾哪些方面?

在数字化时代&#xff0c;流媒体技术已经成为信息传播和娱乐消费的重要方式。随着互联网技术的飞速发展和移动设备的普及&#xff0c;流媒体服务正在重塑我们的生活和工作方式。从视频点播、在线直播到音乐流媒体&#xff0c;流媒体技术的广泛应用不仅改变了内容的分发和消费模…...

使用 acme.sh 申请域名 SSL/TLS 证书完整指南

使用 acme.sh 申请域名 SSL/TLS 证书完整指南 简介为什么选择 acme.sh 和 ZeroSSL&#xff1f;前置要求安装过程 步骤一&#xff1a;安装 acme.sh步骤二&#xff1a;配置 ZeroSSL 证书申请 方法一&#xff1a;手动 DNS 验证&#xff08;推荐新手使用&#xff09;方法二&#xf…...

睡岗和玩手机数据集,4653张原始图,支持YOLO,VOC XML,COCO JSON格式的标注

睡岗和玩手机数据集&#xff0c;4653张原始图&#xff0c;支持YOLO&#xff0c;VOC XML&#xff0c;COCO JSON格式的标注 数据集分割 训练组70&#xff05; 3257图片 有效集20&#xff05; 931图片 测试集10&#xff05; 465图片 预处理 没有采用任何预处…...

[Unity] 【VR】【游戏开发】在VR中使用New Input System获取按键值的完整教程

在使用Unity开发VR项目时,推荐使用 New Input System 来处理输入操作。相比于旧的Input系统,New Input System更加灵活、功能强大,尤其在处理VR控制器的按键输入时具有明显优势。本文将详细介绍如何在VR项目中使用New Input System获取按键值,并通过代码示例和图文讲解,帮…...

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…...

2024年合肥师范学院信息安全小组内部选拔赛(c211)WP

目录 前言MISC签到题_熟悉吗又来一道签到题文件包含 CRYPTO古典1古典2RSA webbaby_sql 前言 [HFNU 校级选拔] 已经结束&#xff0c;接下来一起了解下题目是怎么做的。 通过网盘分享的文件&#xff1a;ARCHPR_4.66.266.0_汉化绿色版.7z 链接: https://pan.baidu.com/s/1N_c0PJX…...

GESP CCF C++八级编程等级考试认证真题 2024年12月

202412 GESP CCF C八级编程等级考试认证真题 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 小杨家响应国家“以旧换新”政策&#xff0c;将自家的汽油车置换为新能源汽车&#xff0c;正在准备自编车牌。自编车牌包括5 位数字或英文字母&#xff0c…...

GlusterFS 部署全攻略:详细步骤与要点解析(上)

文章目录 1、二进制部署1.1 安装yum源1.2 准备服务器1.3 添加本地解析1.4关闭防火墙及selinux1.5 加载内核模块1.6 格式化分区和挂载brick1.7 安装GlusterFS1.8 iptables配置1.9 配置可信任池1.10 设置GlusterFS卷1.11 测试volume卷 2、使用heketi将二进制GlusterFS集群作为k8s…...

充分利用 AIStor 的网络配置

![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2F%2Ffiles.mdnice.com%2Fuser%2F41350%2F4ce80f61-875a-493b-a4ad-e884d7835be1.png&pos_idimg-flS gQlNx-1734678799…...

算法题(10):好数

审题&#xff1a; 需要判断出1-N的范围内有多少个好数&#xff0c;并输出 思路&#xff1a; 遍历数据&#xff1a;需要用for循环&#xff08;从1循环到N&#xff09; 每一位判断&#xff1a;用while循环&#xff0c;先从个位开始&#xff0c;每循环一次就让记录位数的变量&…...

使用二分查找法找出给定点距离给定点集合距离最近的点

1、场景描述 给定点Point A &#xff08;x,y&#xff09;和 直线点集合 Points [(x1,y1),(x2,y2),(x3,y3),(x4,y4),(x5,y5)......],计算出集合中距离点A最近的一个点 &#xff08;如果集合中的两个点距离A点最近且相等&#xff0c;则只取其中一个&#xff09; 2、代码&#x…...