迅为RK3576开发板Android 多屏显示
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。
1.1 Android 多屏同显
iTOP-RK3576 开发板支持以下屏幕
迅为 MIPI 7 寸屏幕
标准 HDMI 屏幕(通过 HDMI 线连接)
迅为 LVDS 7 寸屏幕
迅为 LVDS 10.1 寸 1024*600 屏幕
迅为 LVDS 10.1 寸 1280*800 屏幕
然后修改 Android 源码 kernel-6.1/arch/arm64/boot/dts/rockchip/topeet-screen-lcds.dtsi 中的
设备树文件,如下图所示。LVDS 屏幕是 MIPI 通过转接板连接显示的,RK3576 不支持 LVDS
显示接口。
我们可以根据自己的需求来修改 topeet-screen-lcds.dtsi 文件。总之,修改
topeet_screen_choose.dtsi 的规律是:打开所连接的屏幕对应的宏定义,rk3576 有三个显示通
道 vp0 vp1 vp2,所打开的宏定义对应的 vp 通道不能重复。默认打开对应的宏定义为多屏同显。
如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1280x800_GT9271, 需要将
kernel-6.1/arch/arm64/configs/rockchip_defconfig 文件中的
CONFIG_TOUCHSCREEN_GT9271=y 宏定义使能,然后再编译源码。
如果打开的宏定义是#define LCD_TYPE_LVDS_10_1_1024x600_GT911,需要将
kernel-6.1/arch/arm64/configs/rockchip_defconfig 文件中的 CONFIG_TOUCHSCREEN_GT9XX
宏定义使能,然后再编译源码。
1.2 Android 多屏异显
如果要支持多屏异显,首先要调试好双屏或多屏都可以正常显示,并且分别挂载在不同的
vp 上,可以参考上一个小节根据自己的需求打开 topeet-screen-lcds.dtsi 设备树中的宏定义。默
认开启后,多屏显示的是同一个画面(如果要支持双屏或者多屏异显,需要应用支持异显,才会显示不同的内容)。查看当前的屏幕显示状态输入以下命令
cat /sys/kernel/debug/dri/0/summary
如果双屏或者多屏的显示器分辨率比例不同,比如说主屏是 16:9,副屏是 4:3,那么副
屏显示的画面会拉伸或者缩小,原因是副屏的画面是主屏映射过去的,所以副屏上显示的是
主屏的分辨率。如果同样的屏幕情况下,应用支持异显,那么副屏会显示实际正常的分辨率。
所以如果要支持双屏或者多屏同显并要求显示正常,双屏或者多屏的屏幕的分辨率比要一致。
1.2.1 指定主副屏
多屏异显的实际应用中,需要指定哪个是主屏,哪个是副屏。修改 Android14 源码目录下
rk3576_android14/device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件,添加如下内容:
如果要指定 MIPI 屏幕为主屏,HDMI 屏幕为副屏,如下设置:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A
如果要指定 MIPI 屏幕为主屏,EDP 屏幕为副屏,如下设置:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=eDP
如果需要定义多个主副屏时,需要用逗号隔开,比如指定 MIPI eDP 为主屏,HDMI-A 为副屏,
设置如下:
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.primary=DSI,eDP
PRODUCT_PROPERTY_OVERRIDES += vendor.hwc.device.extend=HDMI-A
1.2.2 异显方案介绍
目前有两种异显方案分别是 Android Presentation 和 Andorid Activity 指定屏幕启动 。
Android Presentation,需要 APP 应用开发中调用相应接口使指定的 view (Presentation
view 是一个特殊的 dialog 类型 view)在副屏中显示。
Android Activity 指定屏幕启动,APP 在启动 activity 时可以使用 display id 参数在对应
的屏幕上直接显示。
两者主要区别在:
1 前者的 acitivity 需要独立开发,把需要显示的内容投到副屏,后者可以不需要源码,调用命令行或者系统接口把第三方 app 的 acitivity 投送到副屏;
2 .前者只有一个 activity 在顶层,通过特殊的 dialog 将指定内容显示在副屏,后者是两
个 activity 分别显示在主副屏。
接下来我们详细讲述这俩种方法。
1.2.3 Android Presentation
本小节讲解 Android Presentation 异显方案,瑞芯微和迅为提供了使用 Android Presentation
编写好的 APP 例程,接下来进行测试。
1.2.3.1 ApiDemos APP
在 Android12 源码中瑞芯微已经提供了使用 Presentation 接口的测试 APP,在源码
development/samples/ApiDemos 目录下,需要使用 mm 命令编译 APP。迅为提供了编译好的
测试 APP 在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_多屏显示配套
资料/Android/ApiDemosAPK”目录下。
此 APP 源码在 Android 源码 rk3576_android14/development/samples/ApiDemos 目录下,进
入此目录,输入“mm”命令进行编译,如下图所示:
然后使用 adb 命令安装 APP,依次点击 App->Activity->Presentation 选项,即可进入
Presentation 调用界面。如下图所示:
在该界面需点击如下副屏的 checkbox 选项,即可在副屏显示相应图片。如下所示:
副屏 HDMi 屏幕显示图片,如下所示:
1.2.3.2 Presentation sampleAPP
此 APP 在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_多屏显示配
套资料/Android/Presentation-sample”目录下,下载此 APP 工程,然后用 Androidstudio 打开,
并编译 apk。编译成功之后,安装 APP,APP 安装成功之后如下图所示:
打开 APP 如下图所示:
点击“显示副屏”按钮,会在副屏显示,如下图所示:
APP 重要知识点讲解:
随着用户的需求增多,特别是对于一些 Android 平板电脑以及其他的一些 Android 智能设
备可能有多个屏幕,用户不仅想要在主屏幕上显示内容,同样在第二屏幕上也要显示想要的
内容,这样可以达到更好的体验效果。Google 也是不负众望在 Android4.2 版本以后提供了
Presentation 类,可以轻松实现在两块屏幕上同时显示不同的内容。Presentation 是一个特殊的
dialog,它的目的是显示内容到第二屏幕。在 Presentation 创建的时候关联一个目标设备,确
定 Presentation 要显示在那个设备上,根据这个设备的信息来配置 Presentation 的 context 和
resources 信息。目前系统提供了两种方式来与目标显示屏进行绑定。
1 通过 MediaRouter 接口获取并绑定:
选择显示 presentation 的设备最简单的方法就是使用 Media Router,media router 服务持续
追踪在系统中哪个音频、视频线路是可用的,当 routes 被选择或者不被选择,或者更好的显
示 presentation display 的线路发生改变后 media router 就会发送消息。所以一些应用程序可以
自动监视这些消息来在首选设备上显示或取消 presentation。
首选显示 presentation 的设备是 Media Router 进行推荐的,如果应用想要显示内容在第二
屏幕上就该使用该设备。下面将给出如何使用 media router 在主屏的设备创建和显示
presentation。
MediaRouter mediaRouter =(MediaRouter)
context.getSystemService(Context.MEDIA_ROUTER_SERVICE); MediaRouter.RouteInfo route =
mediaRouter.getSelectedRoute();
if(route !=null){
Display presentationDisplay = route.getPresentationDisplay();
if(presentationDisplay !=null){
Presentation presentation =newMyPresentation(context, presentationDisplay);
presentation.show();
}
}
根据上面代码可以看出通过系统服务 Media Router 来选择一个合适的 route,从 route 中来
获取首选的 display,如果 display 不为空就会创建该 presentation,创建完成后调用 presentation
的 show 方法将该 presentation 显示出来。
2 通过 DisplayManager 接口获取并绑定
另外一个获取首选 display 的方法是直接使用 display Manager 来获取。display manager 服
务提供方法枚举和描述系统中所有的设备,包括可以显示 presentation 的设备。display manager
持续追踪系统中所有的设备,然而,并不是所有的设备都适合显示 presentation,例如,如果
一个 Activity 试图在主屏幕上显示一个 presentation,它可能会掩盖自己的内容,这就像在
Activity 上打开一个 dialog 一样。
DisplayManager displayManager =(DisplayManager)
context.getSystemService(Context.DISPLAY_SERVICE); Display[] presentationDisplays
=displayManager.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
if(presentationDisplays.length >0){
// If there is more than one suitable presentation display, then we could consider
// giving the user a choice. For this example, we simply choose the first display
// which is the one the system recommends as the preferred presentation display.
Display display = presentationDisplays[1]; // displays[1]是副屏
Presentation presentation =new MyPresentation(context, presentationDisplay);
presentation.show();
}
根据上面代码可以看出通过系统服务 Display Manager 来获取所有适合显示 presentation 的
display 列表,如果获取到了多个适合 display 对象,我们选择副屏的 display。最后显示
presentation。
1.2.4 Android Activity 指定屏幕启动
本小节讲解 Android Activity 指定屏幕启动异显方案,瑞芯微提供了使用 Android Activity
指定屏幕启动编写好的 APP 例程,接下来进行测试。
1.2.4.1 dualscreendemo APP
RK DualScreen 主要区别与 android presentation,在于它实现了应用的派发,允许厂商快
速根据现有的 app 功能,进行模块的集成,减少开发周期和研发成本。示例代码为
DualScreenDemo.zip 工程,在网盘资料“iTOP-RK3576 开发板/02_【iTOP-RK3576 开发板】/07_
多屏显示配套资料/Android/DualScreenDemo”目录下下载。
使用 Androidstudio 打开此工程代码,编译安装 APP,安装完成后如下所示:
打开此 APP,如下所示,有三个按钮。
第三个按钮使用了 Android Activity 指定屏幕启动,关键代码如下所示,第一个和第二个
按钮使用了 Presentation。
private void showSecondByActivity(Context context){
ActivityOptions options = ActivityOptions.makeBasic();
MediaRouter mediaRouter = (MediaRouter)
context.getSystemService(Context.MEDIA_ROUTER_SERVICE);
MediaRouter.RouteInfo route =
mediaRouter.getSelectedRoute(MediaRouter.ROUTE_TYPE_LIVE_VIDEO);
if (route != null) {
Display presentationDisplay = route.getPresentationDisplay();
options.setLaunchDisplayId(presentationDisplay.getDisplayId());
Intent intent = new Intent("android.intent.action.MUSIC_PLAYER");
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent, options.toBundle());
}
}
在 startActivity 接口参数中设置指定屏幕的 display id,Activity 将在指定屏幕上直接启
动显示。
Activity 的多显示器支持需要设备支持<feature
name="android.software.activities_on_secondary_displays" />。
同时 application 或者 activity 需要支持分屏属性即<application>或者<activity>标签下设
置新的属性 android:resizeableActivity="true",这个属性在你 target 到 Android N 后
android:resizeableActivity 的默认值就是 true。
ActivityOptions 提供两个新函数以支持多个显示器,分别是 setLaunchDisplayId()和
getLaunchDisplayId()。
setLaunchDisplayId() 指定 Activity 在启动后应显示在哪个显示器上。
getLaunchDisplayId() 返回操作组件的当前启动显示器。
在上述代码中使用 MediaRouter 接口获取副屏的 display id,同理也可以使用
DisplayManager 接口获取响应的 display id。
1.2.5 支持输入法在副屏显示
修改 Android14 源码下的 device/rockchip/common/display_settings.xml 文件,如下所示:
将设置相应屏幕 shouldShowIme 为 true,如上配置支持输入法在 local:1 的副屏上显示。
1.2.6 副屏 DPI 设置
修改 Android14 源码下的 device/rockchip/common/display_settings.xml 文件,如下所示:
修改 forcedDensity 的值可以修改副屏的屏幕密度。
1.2.7 主屏幕可以触摸,副屏不触摸
如果想要实现主屏可以触摸,副屏不用触摸的功能。有两种解决方式:第一种是在 App
应用代码中实现。第二种需要修改 framework 层的源码。
第一种方式:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);
第二种方式:
修改 Android14 源码 frameworks/native/services/inputflinger/reader/EventHub.cpp 文件,屏蔽掉 device->classes |= InputDeviceClass::EXTERNAL;属性,如下图所示:
1.2.8 多屏异触
多屏异触需要指定主副屏。这里使用修改 Android 源码的方式实现绑定副屏触摸芯片。这
样设置以后,系统开机会自动将 ft5x06 触摸绑定到副屏上面去。修改文件:
frameworks/native/services/inputflinger/reader/EventHub.cpp,添加如下加红的代码。通过修改
EventHub.cpp 文件,在 isExternalDeviceLocked 函数中判断设备名称为指定的副屏设备(比如
副屏的设备名称是 generic ft5x06 (79)),则返回 true。
bool EventHub::Device::isExternalDeviceLocked() {
const char *I2C_DEVICE_NAME = "generic ft5x06 (79)";
ALOGE("input deviceis '%s' ",device->identifier.name.c_str());
if (strcmp(device->identifier.name.c_str(), I2C_DEVICE_NAME) == 0) {
return true;
}
if (configuration) {
std::optional<bool> isInternal = configuration->getBool("device.internal");
if (isInternal.has_value()) {
return !isInternal.value();
}
}
return identifier.bus == BUS_USB || identifier.bus == BUS_BLUETOOTH;
}
这里的 I2C_DEVICE_NAME 需要根据实际情况添加,用户可根据 ALOGE 打印信息在
logcat 中寻找识别到的芯片实际的名字。下面是添加了 ALOGE 打印信息后在 logcat 中得到的
设备名字的截图:
上图中的 goodix-ts 和 generic ft5x06 (79)即为这里使用的触摸 IC 芯片的名字,将这个复制
到代码中即可。修改完毕,重新编译Android镜像,用户测试的时候可以直接使用ApiDemo APP
进行测试。
1.2.9 鼠标异屏切换
在多屏异显情况下,修改以下代码使鼠标箭头可以移动到需要的副屏上去进行操作。
我们需要修改 Android14 源码中
frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp 文件
搜索"sys.mouse.presentation",然后将下面的代码中 0 改为 1。
//-----rk-code----
char mMousePresentation[PROPERTY_VALUE_MAX] = {1};
property_get("sys.mouse.presentation", mMousePresentation, "1");
if (strcmp(mMousePresentation, "1") == 0) {
if (std::optional<FloatRect> rect = mPointerController->getBounds();
rect.has_value()) {
if(xCursorPosition==rect->left||xCursorPosition==rect->right||yCursorPosition==rect->top||yCursor
Position==rect->bottom){
mDisplayId=getPolicy()->notifyDisplayIdChanged();
}
}
}else{
mDisplayId = mPointerController->getDisplayId();
}
然后重新编译 Android 源码,然后烧写镜像。
1.2.10 副屏显示配置
1.2.10.1 副屏全屏显示
设置副屏(副屏 1、副屏 2 等)是否全屏显示可通过修改 persist.sys.rotation.efull-n(n=1、
2、3、….)参数的取值进行配置,若配置为 true 则会进行全屏显示。
现以 MIPI 主屏、 HDMI 副 屏 为 例 ,修改如下:
在 device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件中添加如下内容,使得
HDMI 副屏可以全屏显示(由于副屏图像参考主屏宽高比进行缩放,若宽高比不一致,则出
现黑边,所以默认 HDMI 副屏显示会有黑边):
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=true
修改完成后,保存退出,重新编译烧写镜像即可。
注:由于 mipi 竖屏显示与 HDMI 宽高比相差较大,HDMI 设置全屏显示后拉伸较明显!
1.2.10.2 副屏显示方向
副屏的旋转角度可通过 persist.sys.rotation.einit-n(n=1、2、3、….)属性控制,该属性用
于设置副屏(副屏 1、副屏 2 等)的显示方向,可取值为 0/1/2/3,分别表示将副屏显示方
向旋转(顺时针)0 度、90 度、180 度、270 度。
现以 MIPI 主屏、 HDMI 副 屏 为 例 ,修改如下:
在 device/rockchip/rk3576/topeet_rk3576/topeet_rk3576.mk 文件中添加如下内容,使得
HDMI 副屏的显示方向旋转 90 度:
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.einit-1=1
PRODUCT_PROPERTY_OVERRIDES += persist.sys.rotation.efull-1=false
修改完成后,保存退出,重新编译烧写镜像即可,HDMI 会旋转 90°竖屏显示。
相关文章:
迅为RK3576开发板Android 多屏显示
迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片,集成了4个Cortex-A72和4个Cortex-A53核心,以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。 1.1 Android 多屏同显 iTOP-RK3576 开发板支持…...
基于SpringBoot+Vue旅游管理系统的设计和实现(源码+文档+部署讲解)
个人名片 🔥 源码获取 | 毕设定制| 商务合作:《个人名片》 ⛺️心若有所向往,何惧道阻且长 文章目录 个人名片环境需要技术栈功能介绍功能说明 环境需要 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库&…...
Banana Pi BPI-RV2 RISC-V路由开发板采用矽昌通信SF2H8898芯片
Banana Pi BPI-RV2 开源网关是⼀款基于矽昌SF2H8898 SoC的设备,1 2.5 G WAN⽹络接⼝、5 个千兆LAN ⽹络接⼝、板载 512MB DDR3 内存 、128 MiB NAND、16 MiB NOR、M.2接⼝,MINI PCIE和USB 2.0接⼝等。 Banana Pi BPI-RV2 开源网关是矽昌和⾹蕉派开源社…...
【0x3D】HCI_Remote_Host_Supported_Features_Notification事件详解
目录 一、事件概述 二、事件格式及参数说明 2.1. HCI_Remote_Host_Supported_Features_Notification事件格式 2.2. BD_ADDR 2.3. Remote_Host_Supported_Features 三、事件作用 3.1. 设备特性沟通与理解 3.2. 功能协商与性能优化 3.3. 设备管理与配置更新 四、应用场…...
【腾讯云】AI驱动TDSQL-C Serveress 数据库技术实战营-如何是从0到1体验电商可视化分析小助手得统计功能,一句话就能输出目标统计图
欢迎来到《小5讲堂》 这是《腾讯云》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 背景效果图流程图创建数据库 基本信息数据库配置设置密码控制台开…...
Unity-Mirror网络框架-从入门到精通之RigidbodyBenchmark示例
文章目录 前言示例代码逻辑测试结论性能影响因素最后前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计,它…...
学习记录1
[SUCTF 2019]EasyWeb 直接给了源代码,分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…...
EWM 供应商退货
目录 1 简介 2 参考内向交货单退货场景 2.1 后台配置 ERP 配置 EWM 配置 2.2 主数据 2.3 业务操作 3 创建 return PO 退货场景 3.1 后台配置 ERP 配置 EWM 配置 3.2 主数据 3.3 业务操作 1 简介 EWM 供应商退货支持 2种方式退货: 1)参考内向交货单退货 2)创建…...
深度学习基础--GRU学习笔记(李沐《动手学习深度学习》)
前言 GRU是RNN模型的升级版,也是LSTM的弱化版,学习GRU也是为了学习LSTM做准备,这一篇文章是学习笔记;RNN:RNN讲解参考:李沐动手学习深度学习;欢迎收藏加关注,本人将会持续更新。 文…...
Linux-C/C++--初探linux应用编程概念
对于大多数首次接触 Linux 应用编程的读者来说,可能对应用编程(也可称为系统编程)这个概念并不 太了解,所以在正式学习 Linux 应用编程之前,笔者有必要向大家介绍这些简单基本的概念,从整体上认识 到应用编…...
计算机基础专业课
后面进一步完善内容! 第一部分:计算机基础知识5% 第一章:计算机概述 第二章:信息表示与编码 第二部分:计算机软硬件基础25% 第三章:计算机系统组成(计算机组成原理) 第四章&am…...
6. 快速掌握抽象类及接口
目录 1. 抽象类1.1 抽象类语法1.2 抽象类特性1.3 抽象类的作用 2. 接口2.1 接口语法2.2 接口的特性 3. 接口案例4. 常用接口4.1 Comparable接口---compareTo()方法4.2 clonable接口---clone方法4.2 深拷贝和浅拷贝 5. Object类5.1 equals()方法5.2 toString()方法5.3 hashCode(…...
P6周:VGG-16算法-Pytorch实现人脸识别
🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:Python 3.8.12 编译器:jupyter notebook 深度学习环境:torch 1.12.0cu113 一、前期准备 1.设置GPU im…...
GPT-5 传言:一场正在幕后发生的 AI 变革
新的一年,让我们从一个引人入胜的话题开始:如果我告诉你,GPT-5 并非虚构,而是真实存在呢?它不仅真实存在,而且正在你看不见的地方悄然塑造着世界。我的基本假设是:OpenAI 已经秘密开发出 GPT-5&…...
mac配置 iTerm2 使用lrzsz与服务器传输文件
mac配置 1. 安装支持rz和sz命令的lrzsz brew install lrzsz2. 下载iterm2-send-zmodem.sh和iterm2-recv-zmodem.sh两个脚本 # 克隆仓库 git clone https://github.com/aikuyun/iterm2-zmodem ~/iterm2-zmodem# 进入到仓库目录 cd ~/iterm2-zmodem# 设置脚本文件可执行权限 c…...
一、1-2 5G-A通感融合基站产品及开通
1、通感融合定义和场景(阅读) 1.1通感融合定义 1.2通感融合应用场景 2、通感融合架构和原理(较难,理解即可) 2.1 感知方式 2.2 通感融合架构 SF(Sensing Function):核心网感知控制…...
深度学习加速性能分析与Roofline Model
深度学习加速性能分析 动因:由于深度学习加速器普遍采用时分复用(当然随着Graphcore等dataflow类型的芯片除外,他们是空间划分)。此时,硬件资源在不同时刻执行的计算发生变化,很难以单一时刻的计算类型进行硬件设计。所以寻找平均资源利用率就变得更重要方法:针对不同任…...
React 第三方状态管理库相关 -- Redux MobX 篇
一、redux 首先安装依赖: npm install redux react-redux reduxjs/toolkit 示例代码: // src/store/index.js import { configureStore } from reduxjs/toolkit import couterSlice from ./couterSliceconst store configureStore({reducer:{coute…...
“扣子”开发之四:与千帆AppBuilder比较
上一个专题——“扣子”开发——未能落地,开始抱着极大的热情进入,但迅速被稚嫩的架构模型折磨打击,硬着头皮坚持了两周,终究还是感觉不实用不趁手放弃了。今天询问了下豆包,看看还有哪些比较好的AI开发平台࿰…...
C++实现红黑树
红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或 Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍&…...
Vue3:当v-if和v-for同时使用时产生的问题和解决办法
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码: https://gitee.com/nbacheng/nbci…...
python爬虫入门(理论)
python爬虫 学习网站 一、准备 环境搭建 requests beautifulsoup4 selenium 爬虫架构 URL管理器:管理URL,存储已爬取或待爬取的URL 网页下载器:破解网页,进行下载 网页解析器:对网页的HTML样式、连接的URL等进…...
有效提取激光雷达点云平面点
有效地面点云的提取和平面点的识别是通过一系列步骤实现的。以下是主要步骤: 高度过滤: 首先,根据激光雷达传感器的安装高度,对当前帧扫描得到的点云进行高度过滤,以初步分割出地面点云。假设第 k k k 帧的点云为 { …...
Vulnhub DC-8靶机攻击实战(一)
导语 Vulnhub DC-8靶机教程来了,好久没有更新打靶的教程了,这次我们在来更新一期关于Vulnhub DC-8的打靶训练,如下所示。 安装并且启动靶机 安装并且启动靶机,如下所示。 开始信息采集 进入到Kali中,通过如下的命令来查找到靶机的IP地址。 arp-scan -l根据上面的结…...
基于PHP的校园新闻发布管理
摘要 近年来,随着互联网技术的迅速发展,人们获取新闻的渠道也变得越来越多样化,已经不再拘束于传统的报纸、期刊、杂志等纸质化的方式,而是通过网络满足了人们获得第一手新闻的愿望,这样更加有助于实现新闻的规范化管…...
LabVIEW时域近场天线测试
随着通信技术的飞速发展,特别是在5G及未来通信技术中,天线性能的测试需求日益增加。对于短脉冲天线和宽带天线的时域特性测试,传统的频域测试方法已无法满足其需求。时域测试方法在这些应用中具有明显优势,可以提供更快速和精准的…...
组播PIM-原理介绍+报文分析+配置示例
个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 因此本文将在PIMv2协议报文的基础上进行介绍,以详细介绍组播协议PIM。 这里需要说明的是,以下内容都针对的是ASM&a…...
规避路由冲突
路由冲突是指在网络中存在两个或多个路由器在进行路由选择时出现矛盾,导致网络数据包无法正确传输,影响网络的正常运行。为了规避路由冲突,可以采取以下措施: 一、合理规划IP地址 分配唯一IP:确保每个设备在网络中都有…...
Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的…...
【C++】非类型模板参数 || 类模板的特化
目录 1. 非类型模板参数 2. 模板特化 3. 类模板特化 3.1.全特化 3.2 部分特化 3.3 参数更进一步限制 3.4 类模板应用 1. 非类型模板参数 模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型…...
Python基本概念与实践
Python语言,总给我一种“嗯?还能这么玩儿?”的感觉 Python像一个二三十岁的年轻人,自由、年轻、又灵活 欢迎一起进入Python的世界~ 本人工作中经常使用Python,针对一些常用的语法概念进行持续记录。 一、类与常见数据结…...
SQL Prompt 插件
SQL Prompt 插件 注:SQL Prompt插件提供智能代码补全、SQL格式化、代码自动提示和快捷输入等功能,非常方便,可以自行去尝试体会。 1、问题 SSMS(SQL Server Management Studio)是SQL Server自带的管理工具,…...
1.6 从 GPT-1 到 GPT-3.5:一路的风云变幻
从 GPT-1 到 GPT-3.5:一路的风云变幻 人工智能的进步一直是科技领域的一个重要话题,而在自然语言处理(NLP)领域,GPT(Generative Pre-trained Transformer)系列模型的发布,标志着一个又一个技术突破。从2018年发布的 GPT-1 到2022年推出的 GPT-3.5,OpenAI 的每一次更新…...
centos 7 Mysql服务
将此服务器配置为 MySQL 服务器,创建数据库为 hubeidatabase,将登录的root密码设置为Qwer1234。在库中创建表为 mytable,在表中创建 2 个用户,分别为(xiaoming,2010-4-1,女,male&…...
参数校验 Spring Validation框架
后端参数校验 解决:校验前端传入的参数是否符合预期 1、引入依赖 使用Spring Validation框架 <!-- validation参数校验框架--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validatio…...
sunrays-framework 微调
文章目录 1.common-log4j2-starter 动态获取并打印日志存储的根目录的绝对路径以及应用的访问地址1.目录2.log4j2.xml 配置LOG_HOME3.LogHomePrinter.java 配置监听器4.spring.factories 注册监听器5.测试1.common-log4j2-starter-demo 配置2.启动测试 2.common-minio-starter …...
Java正则转带中划线或下划线属性名为驼峰命名
Java正则转带中划线或下划线属性名为驼峰命名。 利用Java正则分组匹配的方式,将属性名中 -(_) 后接的字母,匹配上了去掉当前 -(_),将后接的字母转为大写,再追加拼接起来,就完成了驼峰命名。 String lineToHump(Strin…...
WebSocket实现分布式的不同方案对比
引言 随着实时通信需求的日益增长,WebSocket作为一种基于TCP的全双工通信协议,在实时聊天、在线游戏、数据推送等场景中得到了广泛应用。然而,在分布式环境下,如何实现WebSocket的连接管理和消息推送成为了一个挑战。本文将对比几…...
Linux下的dev,sys和proc(TODO)
(TODO) 还有一个sysfs 在 Linux 系统中,/dev、/sys 和 /proc 是三个特殊的虚拟文件系统目录,它们各自有特定的用途,主要用于与设备和内核交互。以下是它们的详细区别和功能说明: 1. /dev(Devi…...
JavaScript系列(32)-- WebAssembly集成详解
JavaScript WebAssembly集成详解 🚀 今天,让我们深入了解JavaScript与WebAssembly的集成,这是一项能够显著提升Web应用性能的关键技术。 WebAssembly基础概念 🌟 💡 小知识:WebAssembly(简称W…...
通过外部链接启动 Flutter App(详细介绍及示例)
通过外部链接启动 Flutter App(firebase_dynamic_links 和 app_links) 详细介绍 通过外部链接启动flutter App 的使用及示例 在我们的APP中,经常有点击链接启动并进入APP的需求(如果未安装跳转到应用商店)。Android通…...
计算机视觉模型的未来:视觉语言模型
一、视觉语言模型 人工智能已经从识别数据中的简单模式跃升为理解复杂的多模态数据。该领域的发展之一是视觉语言模型 (VLM) 的兴起。这类模型将视觉和文本之间联系起来,改变了我们理解视觉数据并与之交互的方式。随着 VLM 的不断发展,它们正在为计算机视觉设定一个新的水平…...
CTK插件框架学习-源码下载编译(01)
1、编译环境 window11、vs17、Qt5.14.0、cmake3.27.4 2、下载链接 cmake:Index of /files/v3.20 qt:Index of / vs22以前的版本需要登录下载:Visual Studio 较旧的下载 - 2019、2017、2015 和以前的版本 vs22下载:下载 Visu…...
Python 字符串分割时 spilt 和 re 效率对比
假设 有一些文件名是 数字_文档名 的格式,如何用python将数字提取出来? 可以使用 Python 的正则表达式模块 re 提取文件名中的数字部分。以下是实现代码: 示例代码: import re# 示例文件名列表 file_names ["1_file1.txt…...
AUTOSAR通信篇 - PDU和收发数据
点击订阅专栏不迷路 文章目录 一、概述二、OSI模型与AUTOSAR层级关系三、I-PDU、N-PDU、L-PDU及其关系3.1. L-PDU3.2. N-PDU3.3. I-PDU 四、数据流4.1. 普通数据流4.2. 诊断数据流4.3. 动态PDU数据流4.4. 安全通信数据流4.5. XCP数据流 返回总目录 一、概述 在学习Autosar通信…...
wps数据分析000002
目录 一、快速定位技巧 二、快速选中技巧 全选 选中部分区域 选中部分区域(升级版) 三、快速移动技巧 四、快速录入技巧 五、总结 一、快速定位技巧 ctrl→(上下左右)快速定位光标对准单元格的上下部分双击名称单元格中…...
【C++基础】enum,union,uint8_t,static
enum 所以有时候使用 Enum 的目的,不是为了自定义一种数据类型,而是为了声明一组常量。 from: https://github.com/wangdoc/clang-tutorial/blob/main/docs/enum.md union C 语言提供了 Union 结构,用来自定义可以灵活变更的数据结构。它内部…...
node.js的进程保活
nodejs的进程保活其实用PM2应该更好用些,不过由于原理其实并不复杂,我们可以自己手写一个服务来干这个工作。 假设我们有一个服务,可以这样来定义下它的相关信息: const svcs[ {"sid":"apl","name"…...
css中的阴影详解
在 CSS 中,阴影效果通常使用 box-shadow 和 text-shadow 来实现,它们分别适用于元素的框和文本。阴影是提升页面设计感和层次感的重要工具。下面,我会详细讲解这两个属性,并结合代码示例说明。 目录 1. box-shadow示例 2. text-sh…...
AI刷题-饭馆菜品选择问题、构造回文字符串问题
目录 一、饭馆菜品选择问题 问题描述 测试样例 解题思路: 问题理解 数据结构选择 算法步骤 最终代码: 运行结果: 二、构造回文字符串问题 问题描述 测试样例 解题思路: 解题思路 具体步骤 最终代码:…...