基于RK3399 Android11适配OV13850 MIPI摄像头
目录
- 1、原理图分析
- 2、编写和配置设备树
- 3、调试方法
- 4、遇到的问题与解决
- 5、补丁
1、原理图分析

从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤MCLK使用的是GPIO3_B7 ⑥需要保证红色框框的供电电源正常。
结合RK提供的文档,如下摄像头数据采集拓扑图所示,我们就可以开始编写配置设备树了,其实官方提供了很多类似的设备树配置给我们参考的。

2、编写和配置设备树
①配置OV13850设备树节点Ⅰ

②配置OV13850设备树节点Ⅱ 提示:下图复用功能是<. RK_PB7 3 &pcfg_pull_one>;

③配置dphy

④配置isp

3、调试方法
①移植成功后,使用dmesg指令查看对应驱动的log

②驱动加载成功后,会有生成以下的摄像头设备节点

③RKISP 驱动如果加载成功,会有 video 及 media 设备存在于/dev/目录下。系统中可能存在 多个/dev/video 设备,通过/sys 可以查询到 RKISP 注册的 video 节点

④查看拓扑结构
Ⅰ、通过media-ctl -p 查看rkisp1_selfpath 信息,可以知道打开哪些media设备

Ⅱ、再通过media-ctl -p /dev/media0 查看已打开的media设备的拓扑,下图是截取了一部分信息

⑤查看摄像头支持哪几种图像流格式,截图省略
指令:v4l2-ctl -d /dev/video0 --list-formats
⑥查看调试上层相关信息,截图省略
指令:dumpsys media.camera
⑦抓图
指令:v4l2-ctl -d /dev/video0 --set-fmt-video=width=800,height=600,pixelformat=NV12 --stream-mmap=3 --stream-to=/sdcard/out.yuv --stream-skip=9 --stream-count=1


查看YUV图片可以使用该网站:在线查看 YUV 文件的免费在线工具 - ImageToStl

4、遇到的问题与解决
①问题1:相机权限问题:解决问题的链接
②问题2:没有获取到对应IQ文件,后面查看编译生成的文件,并没有将IQ文件拷贝过去,报错如下图所示

解决方法:找到对应IQ目录上的.mk文件,在.mk文件中的PRODUCT_COPY_FILES节点下添加
$(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \
这条语句,这条语句作用是拷贝所有的IQ文件到/vendor/etc/camera/rkisp1/目录下。
③问题3:屏幕显示UI为0度横屏,而默认\hardware\rockchip\camera\etc\camera\camera3_profiles_rk3399.xml文件中配置的是传感器成像方向是90度,导致相机成像出现拉伸现象。
解决方法:如下图所示。

④问题4:图像上下或者左右相反,可以通过修改OV13850寄存器完成上下或左右的翻转。
解决方法:如下图介绍。


5、补丁
commit ea5601611a8fdff4b5efaf6db0f947bab7d0447d
Author: dengjiawen <1411471554@qq.com>
Date: Thu Feb 22 10:52:28 2024 +0800适配MIPI摄像头OV13850diff --git a/frameworks/base/data/etc/privapp-permissions-platform.xml b/frameworks/base/data/etc/privapp-permissions-platform.xml
index 3b6abd50ee..0912e0ec6f 100644
--- a/frameworks/base/data/etc/privapp-permissions-platform.xml
+++ b/frameworks/base/data/etc/privapp-permissions-platform.xml
@@ -469,4 +469,8 @@ applications that come with the platform<privapp-permissions package="com.android.bips"><permission name="android.permission.SUBSTITUTE_SHARE_TARGET_APP_NAME_AND_ICON"/></privapp-permissions>
+
+ <privapp-permissions package="com.android.camera2">
+ <permission name="android.permission.SYSTEM_CAMERA"/>
+ </privapp-permissions></permissions>
diff --git a/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml b/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
index 84dd8b5ed5..61ac244250 100755
--- a/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
+++ b/hardware/rockchip/camera/etc/camera/camera3_profiles_rk3399.xml
@@ -251,7 +251,7 @@<!-- ******************PSL specific section end **************************************************************--></Profiles>
- <Profiles cameraId="0" name="ov13850" moduleId="m00">
+ <Profiles cameraId="0" name="ov13850" moduleId="m01"><Supported_hardware><hwType value="SUPPORTED_HW_RKISP1"/></Supported_hardware>
@@ -291,7 +291,7 @@<lens.info.hyperfocalDistance value="0.0"/> <!-- HAL may override this value from CMC for RAW sensors --><lens.info.minimumFocusDistance value="0.1"/> <!-- HAL may override this value from CMC for RAW sensors --><!-- Lens -->
- <lens.facing value="BACK"/>
+ <lens.facing value="FRONT"/><!-- Request --><request.maxNumOutputStreams value="1,2,1"/><request.pipelineMaxDepth value="4"/>
@@ -463,7 +463,7 @@<sensor.baseGainFactor value="0,1"/> <!-- HAL may override this value from CMC for RAW sensors --><sensor.blackLevelPattern value="0,0,0,0"/><sensor.maxAnalogSensitivity value="2400"/> <!-- HAL may override this value from CMC for RAW sensors -->
- <sensor.orientation value="90"/>
+ <sensor.orientation value="0"/> <!-- 摄像头默认成像方向改为0, 这样和默认横屏0°才一致,成像才不会拉伸 --><sensor.profileHueSatMapDimensions value="0,0,0"/><sensor.availableTestPatternModes value="OFF,COLOR_BARS"/><!-- Info -->
diff --git a/hardware/rockchip/camera/etc/camera_etc.mk b/hardware/rockchip/camera/etc/camera_etc.mk
index ee01d12646..30328325bd 100755
--- a/hardware/rockchip/camera/etc/camera_etc.mk
+++ b/hardware/rockchip/camera/etc/camera_etc.mk
@@ -9,11 +9,13 @@ ifeq ($(filter box atv vr stbvr, $(strip $(TARGET_BOARD_PLATFORM_PRODUCT))), )ifeq (1,$(strip $(shell expr $(PLATFORM_SDK_VERSION) \>= 26)))PRODUCT_COPY_FILES += \$(CUR_PATH)/camera/camera3_profiles_$(TARGET_BOARD_PLATFORM).xml:$(TARGET_COPY_OUT_VENDOR)/etc/camera/camera3_profiles.xml \
+ $(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \#$(call find-copy-subdir-files,*,$(CUR_PATH)/firmware,$(TARGET_COPY_OUT_VENDOR)/firmware) \#$(call find-copy-subdir-files,*,$(CUR_PATH)/camera,$(TARGET_COPY_OUT_VENDOR)/etc/camera) elsePRODUCT_COPY_FILES += \$(CUR_PATH)/camera/camera3_profiles_$(TARGET_BOARD_PLATFORM).xml:$(TARGET_COPY_OUT_SYSTEM)/etc/camera/camera3_profiles.xml \
+ $(call find-copy-subdir-files,*,$(CUR_PATH)/camera/rkisp1/,$(TARGET_COPY_OUT_VENDOR)/etc/camera/rkisp1/) \$(call find-copy-subdir-files,*,$(CUR_PATH)/firmware,$(TARGET_COPY_OUT_SYSTEM)/etc/firmware) \$(call find-copy-subdir-files,*,$(CUR_PATH)/camera,$(TARGET_COPY_OUT_SYSTEM)/etc/camera) \$(call find-copy-subdir-files,*,$(CUR_PATH)/tools,$(TARGET_COPY_OUT_SYSTEM)/bin)
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
index 450c677864..9062188ed2 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-android.dtsi
@@ -335,7 +335,7 @@cif_clkout: cif-clkout {rockchip,pins =/*cif_clkout*/
- <2 RK_PB3 3 &pcfg_pull_none>;
+ <3 RK_PB7 3 &pcfg_pull_none>;};isp_dvp_d0d7: isp-dvp-d0d7 {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
index dd7d5f8952..d697023024 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-excavator-sapphire.dtsi
@@ -303,26 +303,6 @@};};-&i2c4 {
- status = "disabled";
- i2c-scl-rising-time-ns = <600>;
- i2c-scl-falling-time-ns = <20>;
-
- mpu6500@68 {
- status = "disabled";
- compatible = "invensense,mpu6500";
- reg = <0x68>;
- irq-gpio = <&gpio1 22 IRQ_TYPE_EDGE_RISING>;
- mpu-int_config = <0x10>;
- mpu-level_shifter = <0>;
- mpu-orientation = <0 1 0 1 0 0 0 0 1>;
- orientation-x= <1>;
- orientation-y= <0>;
- orientation-z= <0>;
- mpu-debug = <1>;
- };
-};
-&i2c7 {status = "okay";rtc@51 {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
index 83b7560801..da84220e47 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire-excavator-edp.dtsi
@@ -50,7 +50,7 @@vcc_lcd: vcc-lcd {compatible = "regulator-fixed";regulator-name = "vcc_lcd";
- gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>;
+ //gpio = <&gpio2 26 GPIO_ACTIVE_HIGH>;startup-delay-us = <20000>;enable-active-high;regulator-min-microvolt = <3300000>;
@@ -423,15 +423,15 @@&isp1_mmu {
- status = "disabled";
+ status = "okay"; // isp 驱动使用了 iommu,所以 isp iommu 也需要打开};
@@ -451,16 +451,45 @@&mipi_dphy_tx1rx1 {
- status = "disabled";
+ status = "okay";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ mipi_in_ucam0: endpoint@1 {
+ reg = <1>;
+ remote-endpoint = <&ucam_out0>; // sensor 端的 port 名
+ data-lanes = <1 2 3 4>;
+ };
+ };
+
+ port@1 {
+ reg = <1>;
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ dphy_tx1rx1_out: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&isp1_mipi_in>;
+ };
+ };
+ };};&vopb {
@@ -484,19 +513,31 @@&rkisp1_1 {
- status = "disabled";
+ status = "okay";
+
+ port {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ isp1_mipi_in: endpoint@0 {
+ reg = <0>;
+ remote-endpoint = <&dphy_tx1rx1_out>; // mipi dphy 端的 port 名
+ };
+ };};&pinctrl {
diff --git a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
index 5b36e3c56d..ee56830ab5 100644
--- a/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
+++ b/kernel/arch/arm64/boot/dts/rockchip/rk3399-sapphire.dtsi
@@ -555,7 +555,7 @@};&i2c4 {
- status = "disabled";
+ status = "okay";i2c-scl-rising-time-ns = <475>;i2c-scl-falling-time-ns = <26>;@@ -568,6 +568,33 @@vbus-5v-gpios = <&gpio1 3 GPIO_ACTIVE_HIGH>;status = "disabled";};
+
+ ov13850: ov13850@10 {
+ compatible = "ovti,ov13850";
+ status = "okay";
+ reg = <0x10>;
+ clocks = <&cru SCLK_CIF_OUT>;
+ clock-names = "xvclk";
+
+ /* conflict with csi-ctl-gpios */
+ reset-gpios = <&gpio2 RK_PD2 GPIO_ACTIVE_HIGH>;
+ pwdn-gpios = <&gpio1 RK_PC7 GPIO_ACTIVE_HIGH>;
+ pinctrl-names = "rockchip,camera_default";
+ pinctrl-0 = <&cif_clkout>; // pinctl 设置
+
+ rockchip,camera-module-index = <1>; // 模组编号,该编号不要重复,因为xml文件中的moduleId="m01",所有设置1
+ rockchip,camera-module-facing = "front"; // 模组朝向,有"back"和"front"
+ rockchip,camera-module-name = "CMK-CT0116"; // 模组名
+ rockchip,camera-module-lens-name = "Largan-50013A1"; // lens 名
+ // 模组名和 lens 名被用来和 IQ xml 文件做匹配,使用的是hardware\rockchip\camera\etc\camera\rkisp1\ov13850_CMK-CT0116_Largan-50013A1.xml文件
+ //lens-focus = <&vm149c>; // vcm 驱动设置,支持 AF 时需要有这个设置
+ port {
+ ucam_out0: endpoint {
+ remote-endpoint = <&mipi_in_ucam0>; // mipi dphy 端的 port 名
+ data-lanes = <1 2 3 4>; // mipi lane 数
+ };
+ };
+ };};
相关文章:
基于RK3399 Android11适配OV13850 MIPI摄像头
目录 1、原理图分析2、编写和配置设备树3、调试方法4、遇到的问题与解决5、补丁 1、原理图分析 从上图可看出,我们需要关心的,①MIPI数据和时钟接口使用的是MIPI_TX1/RX1 ②I2C使用的是I2C4总线 ③RST复位引脚使用的是GPIO2_D2 ④PWDN使用的是GPIO1_C7 ⑤…...
学生个性化成长平台搭建随笔记
1.Vue的自定义指令 在 Vue.js 中,我们可以通过 Vue.directive() 方法来定义自定义指令。具体来说,我们需要传递两个参数: 指令名称:表示我们要定义的指令名称,可以是一个字符串值,例如:has-rol…...
XTuner InternLM-Chat 个人小助手认知微调实践
要解决的问题: 如何让模型知道自己做什么,是什么样身份。是谁创建了他!!! 概述 目标:通过微调,帮助模型认清了解对自己身份弟位 方式:使用XTuner进行微调 微调前(回答…...
编程笔记 Golang基础 025 列表
编程笔记 Golang基础 025 列表 一、列表的功能二、示例程序三、注意事项 在 Go 语言中,列表是一种数据结构,用于存储有序的元素集合,允许高效地进行插入和删除操作。Go 标准库中的 container/list 包提供了一个内置的双链表实现,它…...
Rollup + Ts
Rollup Ts RollupTs demo 一、文件配置 | - src | | - utils | | | - .ts | | - .babelrc | | - main.js | | - style.css | - package.json | - rollup.config.js | - tsconfig.json二、插件下载 rollup // rollup 基本的包 typescript // ts 包 rollup/plug…...
5个精美的wordpress中文企业主题模板
元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板,适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题,适合用于搭建教育培训公司官方…...
【数据分享】2011-2023年我国地级市逐月二手房房价数据(Excel/Shp格式)
房价是一个城市发展程度的重要体现,一个城市的房价越高通常代表这个城市越发达,对于人口的吸引力越大!因此,房价数据是我们在各项城市研究中都非常常用的数据! 本次我们为大家带来的是2011-2023年我国地级市的逐月二手…...
鸿蒙会成为安卓的终结者吗?
随着近期鸿蒙OS系统推送测试版的时间确定,关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统,鸿蒙给人的第一印象是具有颠覆性。 早在几年前,业内就开始流传鸿蒙可能会代替Android的传言。毕竟,Android作为开源系统&…...
Sora横空出世!AI将如何撬动未来?
近日,OpenAI 发布首个视频生成“Sora”模型,该模型通过接收文字指令,即可生成60秒的短视频。 而在2022年末,同样是OpenAI发布的AI语言模型ChatGPT,简化了文本撰写、创意构思以及代码校验等任务。用户仅需输入一个指令&…...
Selenium浏览器自动化测试框架详解
selenium简介 介绍 Selenium [1] 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google C…...
XGB-11:随机森林
XGBoost通常用于训练梯度提升决策树和其他梯度提升模型。随机森林使用与梯度提升决策树相同的模型表示和推断,但使用不同的训练算法。可以使用XGBoost来训练独立的随机森林,或者将随机森林作为梯度提升的基模型。这里我们专注于训练独立的随机森林。 XG…...
超平面介绍
超平面公式 (1) 超平面是指n维线性空间中维度为n-1的子空间。它可以把线性空间分割成不相交的两部分。比如二维空间中,一条直线是一维的,它把平面分成了两部分;三维空间中,一个平面是二维的,它把空间分成了两部分。(2…...
【苍穹外卖】一些开发总结
1、DTO、VO的区别 DTO:如果前端返回的实体类和对应的实体类比较较大差别 使用DTO来封装数据 后面在使用 BeanUtils.copyProperties() 将熟悉复制到对应的实体类中 VO:主要用于展示数据,例如在控制器层和视图层之间。它通常包含一些与显示相关的属性,如标题、描述等。 2…...
Python 3 中,`asynchat`异步通信
在 Python 3 中,asynchat 是基于 asyncore 的一个高层抽象模块,用于处理异步通信协议。它提供了一种简单的方式来创建自定义的异步通信协议,并处理通信中的错误和异常。 asynchat 模块主要作用是将网络数据流分割成消息或者数据包࿰…...
RAW 编程接口 TCP 简介
一、LWIP 中 中 RAW API 编程接口中与 TCP 相关的函数 二、LWIP TCP RAW API 函数 三、LwIP_Periodic_Handle函数 LwIP_Periodic_Handle 函数是一个必须被无限循环调用的 LwIP支持函数,一般在 main函数的无限循环中调用,主要功能是为 LwIP各个模块提供…...
Oracle EBS FA折旧回滚的分录追溯
FA模块向子分类账和总账追溯分为两部分:事务表和折旧,但是FA相关表做其实关联计划外折旧的分录会被遗漏的原因: 如果已经当月折旧,运行完成折旧后,又进行了计划外折旧,因为计划折旧时又要区分【是否进行当月…...
sql注入 [极客大挑战 2019]FinalSQL1
打开题目 点击1到5号的结果 1号 2号 3号 4号 5号 这里直接令传入的id6 传入id1^1^1 逻辑符号|会被检测到,而&感觉成了注释符,&之后的内容都被替换掉了。 传入id1|1 直接盲注比较慢,还需要利用二分法来编写脚本 这里利用到大佬的脚…...
持续集成,持续交付和持续部署的概念,以及GitLab CI / CD的介绍
引言:上一期我们部署好了gitlab极狐网页版,今天我们介绍一下GitLabCI / CD 目录 一、为什么要 CI / CD 方法 1、持续集成 2、持续交付 3、持续部署 二、GitLab CI / CD简介 三、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 …...
[Java 项目亮点] 三层限流设计
思路来源:bilibili 河北王校长 文章目录 面试官可能会问你能详细介绍一下Nginx的http_limit_req_module模块吗?你能解释一下如何在Nginx中配置http_limit_req_module模块吗?你知道如何调整Nginx的http_limit_req_module模块以适应不同的业务需…...
GPT-SoVITS 快速声音克隆使用案例:webui、api接口
参考: https://github.com/RVC-Boss/GPT-SoVITS 环境: Python 3.10 PyTorch 2.1.2, CUDA 12.0 安装包: 1、使用: 1)下载项目 git clone https://github.com/RVC-Boss/GPT-SoVITS.git2)下载预训练模型 https://huggingface.co/lj1995/GPT-SoVITS 下载模型文件放到GPT…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
