开源AI智能眼镜开发实战:OpenVision项目架构与集成指南

news2026/5/13 8:18:39
1. 项目概述当智能眼镜遇见开源AI大脑如果你和我一样对Meta Ray-Ban智能眼镜的硬件设计爱不释手却又对Meta AI的封闭生态和功能限制感到束手束脚那么OpenVision这个项目可能就是你在寻找的“终极解药”。简单来说这是一个完全开源的iOS应用它像一座桥梁将你佩戴的Ray-Ban智能眼镜与强大的、可自定义的AI助手连接起来。它的核心口号“Your glasses. Your AI. Your rules.”精准地概括了其精髓硬件是你的AI服务的选择权在你手里运行规则也由你定义。想象一下这样的场景你在异国他乡的餐厅只需对着眼镜轻声说一句“Ok Vision”然后看向菜单就能听到实时翻译在厨房手忙脚乱时问一句“下一步该放什么”AI能识别你手头的食材并给出指导或者在商店里拿起一件商品直接询问“这个性价比如何”AI能结合网络信息给出购买建议。OpenVision将这些场景从概念变为现实而且它不绑定任何单一的AI服务。你可以选择连接功能强大的OpenClaw后端享受其56种工具带来的自动化能力如发送邮件、控制智能家居也可以切换到谷歌Gemini Live模式体验近乎无延迟的实时音视频对话。这一切都运行在你自己的iPhone和眼镜上数据流经你信任的服务真正实现了“智能穿戴自主可控”。2. 核心架构与设计哲学解析2.1 为何选择“双后端”架构OpenVision最核心的设计决策是同时支持OpenClaw和Gemini Live两套AI后端。这绝非简单的功能堆砌而是基于对不同使用场景和用户需求的深刻理解。OpenClaw模式的核心优势在于“工具化”和“隐私优先”。它通过WebSocket与一个自托管的OpenClaw服务器通信。OpenClaw本身是一个AI Agent框架集成了大量的“工具”Tools比如查询天气、发送邮件、搜索网页、控制HomeKit设备等。当你说“Ok Vision给张三发邮件说会议改到明天下午三点”OpenClaw能理解意图调用邮件工具并执行。这个模式的隐私性更好因为唤醒词Wake Word机制意味着只有在你说出“Ok Vision”时麦克风才会开始录音并上传处理其余时间处于待机状态。其工作流是唤醒→录音本地或云端语音识别转文本→文本发送至OpenClaw→OpenClaw调用工具并生成文本回复→文本在iPhone上通过Apple的TTS转为语音播放。延迟通常在1-2秒适合执行明确的任务和指令。Gemini Live模式则提供了截然不同的体验主打“自然对话”和“低延迟”。它直接使用谷歌Gemini API的实时音视频流能力。一旦激活眼镜的摄像头会以约1帧/秒的速度持续向Gemini发送视频流麦克风音频也实时传输。这意味着AI能真正“看到”你持续看到的画面并实时“听到”你的声音无需反复唤醒。它的响应速度极快延迟可低至300-500毫秒对话体验更接近人与人交流。但代价是它始终在“监听”虽然是在云端激活后且功能更侧重于基于视觉和对话的问答缺乏OpenClaw那种执行复杂任务的能力。设计心得这种“鱼与熊掌兼得”的设计让用户可以根据场景无缝切换。需要查资料、发消息、做计划时用OpenClaw需要持续讨论眼前事物、进行外语对话练习时用Gemini Live。项目没有强行二选一而是把选择权交给了用户这是开源精神与实用主义的完美结合。2.2 与Meta眼镜深度集成的技术实现让第三方应用流畅控制Ray-Ban智能眼镜是项目的一大技术挑战。OpenVision通过Meta官方提供的Device Access Toolkit (DAT) SDK实现了这一点。这个过程并非简单的蓝牙连接而是一套完整的授权与数据流管道。首先开发者需要在Meta开发者平台创建应用启用“Wearables”能力获取App ID和Client Token。用户在OpenVision App内点击“注册眼镜”时应用会通过一个自定义的URL Scheme如openvision://跳转到Meta AI官方App。用户在Meta AI App内完成授权后再跳转回OpenVision。此时OpenVision就获得了通过DAT SDK与眼镜通信的权限。DAT SDK提供了几个关键能力1.设备发现与连接管理2.相机控制包括拍照和获取低帧率的视频流3.传感器数据访问虽然OpenVision目前主要用相机4.音频路由确保AI回复的语音能从眼镜的扬声器清晰播出。OpenVision中的GlassesManager单例封装了所有这些SDK调用处理了连接状态监听、错误重试等繁琐细节为上层的AI服务提供了一个稳定、简单的“眼镜硬件抽象层”。实操要点在集成DAT SDK时务必注意权限的生命周期。用户可能在系统设置中撤销权限因此应用需要健壮地处理unauthorized错误并引导用户重新前往Meta AI应用进行授权。此外蓝牙连接的不稳定性要求实现自动重连逻辑OpenVision在这方面做得不错但开发者在自己定制时仍需考虑网络切换时的处理。3. 从零开始环境搭建与首次运行全记录3.1 开发环境与硬件准备清单在写第一行代码之前请确保你的“武器库”齐全。这是一个针对真实硬件的项目模拟器无能为力。软件方面macOS版本建议在Ventura (13) 或更高这是运行新版Xcode的前提。Xcode 15这是强制要求因为项目使用了Swift 5.9的并发特性以及较新的iOS SDK。直接从Mac App Store安装最新稳定版即可。Git用于克隆代码库。通常Xcode命令行工具会附带。硬件方面iPhone必须是一台真实的、搭载iOS 16或更高版本的iPhone。iPad不行因为应用是针对iPhone和眼镜交互设计的。确保iPhone蓝牙功能正常。Meta Ray-Ban Smart Glasses任何一代Meta与Ray-Ban合作的智能眼镜型号应该都可以但建议使用最新款以保证最好的兼容性和性能。确保眼镜已充电并与你的iPhone完成初次Meta AI应用的配对。Meta开发者账号你需要去Meta开发者网站注册一个免费账号。这不是用来发布Facebook应用的而是为了获取接入眼镜SDK所需的凭证App ID和Client Token。AI服务准备二选一或全都要OpenClaw后端你需要一个运行起来的OpenClaw服务器。这意味着你需要另一台机器可以是本地Mac也可以是云服务器按照OpenClaw的指南部署好其服务。这涉及到Python环境、依赖包安装以及可能的模型下载是相对进阶的一步。Gemini API密钥如果你只想先体验Gemini Live这一步更简单。访问Google AI Studio创建一个API密钥即可。注意某些地区可能受限且API有免费额度限制。3.2 项目配置的“魔鬼细节”克隆项目后你会发现配置是关键一步很多初次运行失败都源于此。git clone https://github.com/rayl15/OpenVision.git cd OpenVision/meta-vision进入目录后你需要复制两个配置文件模板cp Config.xcconfig.example Config.xcconfig cp OpenVision/Config/Config.swift.example OpenVision/Config/Config.swift第一个文件Config.xcconfig是项目构建配置的核心。用文本编辑器打开它你需要修改以下几项# 你的Apple开发者团队ID在Apple Developer网站或Xcode的账户设置里可以找到 DEVELOPMENT_TEAM ABC123DEF456 # 应用的Bundle Identifier必须是唯一的通常用反域名格式 PRODUCT_BUNDLE_IDENTIFIER com.yourname.openvision # 从Meta开发者控制台获取的App ID是一串数字 META_APP_ID 123456789012345 # 客户端令牌这是最容易出错的地方格式必须严格为 AR|APP_ID|TOKEN # 其中APP_ID就是上面的META_APP_IDTOKEN是Meta平台生成的一长串字符 CLIENT_TOKEN AR|123456789012345|eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9... # 自定义URL Scheme用于从Meta AI应用跳转回来可以保持默认 APP_LINK_URL_SCHEME openvision踩坑实录CLIENT_TOKEN的格式错误是导致“Configuration Invalid”的头号杀手。务必确保它是AR|开头中间是App ID然后是竖线和Token中间不能有多余的空格。Token本身可能非常长包含特殊字符直接完整复制粘贴即可不要手动修改。第二个文件Config.swift是应用运行时的配置。它主要包含一些功能开关和默认值初期可以保持默认待深度定制时再修改。3.3 构建、运行与眼镜配对的完整流程打开项目在Xcode中打开OpenVision.xcodeproj。选择设备在Xcode顶部工具栏的Scheme选择区确保选择的是你的真实iPhone设备而不是任何iOS Simulator。首次构建按下Cmd R进行构建并运行。这会将应用安装到你的iPhone上。注册眼镜最关键一步应用首次启动后点击右下角的齿轮图标进入设置找到“Glasses”选项点击“Register”。此时应用会尝试跳转到Meta AI App。情景A成功跳转至Meta AI按照屏幕提示授权即可。授权成功后会自动跳回OpenVision。情景B跳转失败或Meta AI未安装。请确保已安装Meta AI App并且已登录与你开发者账号对应的Meta账户有时需要是管理员账户。情景CMeta AI App内提示“开发者模式未开启”。你需要进入Meta AI App的设置找到“开发者”或“Developer Options”之类的菜单开启开发者模式。这是允许第三方应用连接眼镜的必要条件。配置AI后端注册成功后回到OpenVision的设置页面。如果你想用Gemini Live进入“AI Backend”选择Gemini然后在“Gemini Settings”中粘贴你的API密钥。如果你想用OpenClaw确保你的OpenClaw服务器正在运行通常是一个本地HTTP/WebSocket服务。在“OpenClaw Settings”中输入网关URL例如wss://192.168.1.100:18789注意是wss安全协议和认证令牌如果设置了的话。完成以上步骤你应该就能对着眼镜说“Ok Vision”开始体验了。首次使用语音功能时iOS会请求麦克风权限务必点击“允许”。4. 核心功能模块深度剖析与实战4.1 语音交互链路的拆解从唤醒词到AI回复OpenVision的语音交互链路设计精巧兼顾了响应速度和功耗。我们以OpenClaw模式为例拆解一次完整的交互唤醒与音频采集VoiceCommandService持续运行一个低功耗的音频缓冲区。当你说出“Ok Vision”可自定义时一个本地的、轻量级的唤醒词检测算法可能是简单的能量检测或更复杂的模型会触发事件。随后服务会调用iOS系统的SFSpeechRecognizer开始高精度的语音识别。为了更好的体验这里会播放一个轻微的提示音可关闭。语音转文本STT音频数据被发送到Apple的语音识别服务器在线或进行本地识别取决于系统设置和语言支持。识别出的文本会被传递回应用。这里有一个细节OpenVision支持“插话”Barge-in即当AI正在说话时你再次说“Ok Vision”可以立即打断它并开始新的指令这由VoiceCommandService管理音频会话的优先级来实现。文本处理与AI通信识别出的文本被发送到OpenClawService。这个服务维护着一个到OpenClaw网关的WebSocket长连接并实现了自动重连、心跳保活等机制。它将用户指令、以及可能的上下文如之前对话的历史封装成OpenClaw协议要求的JSON格式通过WebSocket发送出去。AI执行与工具调用OpenClaw服务器收到指令后由其大语言模型LLM解析意图决定是否需要调用工具如查天气、发邮件。调用工具执行后LLM生成一段自然语言回复。文本转语音TTS与播放OpenClaw的文本回复通过WebSocket传回OpenClawService再交给TTSService。这里OpenVision使用了iOS系统的AVSpeechSynthesizer进行TTS。合成后的音频数据通过AudioPlaybackService路由到已连接的Meta眼镜扬声器进行播放。至此一个循环结束。性能优化点为了降低延迟OpenVision在语音识别结束用户停止说话时可能不等最终优化结果就将中间识别文本先发送给AI实现“流式”响应。同时WebSocket的长连接避免了每次请求的HTTP握手开销。对于Gemini Live模式整个链路更直接音频流经AudioCaptureService直接发送至Gemini返回的音频流经AudioPlaybackService直接播放形成了一个真正的全双工实时流。4.2 视觉能力集成静态拍照与动态视频流视觉是智能眼镜的“灵魂之窗”。OpenVision通过两种模式利用眼镜的摄像头。静态拍照分析当你说出“Take a photo”或“What do you see?”时GlassesManager会调用DAT SDK的拍照接口。眼镜摄像头会捕捉当前视角的高分辨率图片。这张图片会被保存在iPhone的本地临时存储中然后以Base64编码的形式作为附件添加到发送给AIOpenClaw或Gemini的请求中。对于OpenClaw这可能是一个“分析图片”的工具调用对于Gemini则是带图片附件的多模态请求。AI会描述图片内容、回答相关问题。这种方式隐私性相对较好图片只在需要时拍摄并发送。Gemini Live视频流这是更具沉浸感的功能。当激活Gemini Live模式后GlassesManager会启动视频流会话。DAT SDK提供的是低帧率约1fps的视频流这平衡了实时性和数据量/功耗。每一帧视频都会被捕获、压缩可能是JPEG然后通过GeminiLiveService建立的另一个WebSocket连接近乎实时地传输到Gemini服务器。于是Gemini的模型就能“持续看到”你所见的世界实现真正的实时视觉问答。例如你拿着一个零件问“这个该怎么安装”AI可以看着你移动零件的视频流来指导你。隐私与功耗权衡持续视频流意味着更高的数据上传和电量消耗。OpenVision的设计是只有明确进入Gemini Live模式时才开启视频流并且提供了便捷的“Stop video”语音命令来立即关闭。开发者如果进行二次开发可以考虑增加视频流分辨率/帧率的选择或者本地预处理视频帧如只上传检测到变化的部分以进一步优化。4.3 设置与数据管理的工程实践作为一个生产级应用OpenVision在配置管理和数据持久化上也做了扎实的工作。SettingsManager是一个使用Swift的MainActor标记的单例管理器负责所有用户设置的读写。它并没有使用复杂的数据库而是将设置模型一个Swift结构体编码为JSON保存在iPhone的UserDefaults或应用沙盒的文档目录中。它的亮点在于使用了“防抖”Debounce机制。当用户在设置界面频繁切换开关或输入文本时不会每次改动都立即触发磁盘写入而是会延迟一小段时间如500毫秒待用户停止操作后再一次性保存这提升了性能并减少不必要的I/O。ConversationManager则管理所有的对话历史。每次与AI的交互无论是语音还是视觉都会被记录为一个对话条目包含时间戳、用户消息、AI回复、使用的后端模式等信息。这些历史数据不仅用于在App内回看更重要的是在后续对话中可以选择性地将部分历史作为上下文发送给AI使得AI能记住之前的对话例如“记住这个人是John”实现有限的“记忆”功能。历史数据同样以JSON格式存储可以考虑为其增加加密功能以进一步提升隐私性。5. 进阶开发指南与定制化思路5.1 项目结构导航与核心代码解读打开项目其清晰的模块化结构让人眼前一亮这非常有利于二次开发和维护。OpenVision/ ├── App/ # 应用入口处理生命周期和深链 ├── Config/ # 所有配置文件 ├── Models/ # 数据模型如Setting、Conversation ├── Services/ # 核心服务层每个文件职责单一 │ ├── AIBackend/ # 后端枚举、连接状态机 │ ├── OpenClaw/ # OpenClaw WebSocket客户端实现 │ ├── GeminiLive/ # Gemini音视频WebSocket客户端 │ ├── Voice/ # 唤醒词、语音识别 │ ├── Audio/ # 麦克风采集、扬声器播放 │ └── TTS/ # 文本转语音 ├── Managers/ # 单例管理器协调各服务 ├── Views/ # SwiftUI视图层 │ ├── VoiceAgent/ # 主对话界面 │ ├── Settings/ # 设置相关页面 │ ├── History/ # 历史记录视图 │ └── Components/ # 可复用UI组件 └── Utilities/ # 扩展和工具函数关键服务解析OpenClawService.swift这是与OpenClaw交互的核心。它使用URLSessionWebSocketTask建立连接实现了connect(),disconnect(),sendMessage(_:),reconnect()等方法。其自动重连逻辑值得学习连接断开后它会尝试重连每次重连的延迟时间按指数增长如1s, 2s, 4s, 8s...并加入随机“抖动”Jitter以避免多个客户端同时重连冲击服务器最多重试12次。GeminiLiveService.swift处理与Google Gemini实时音频流的通信。它更复杂需要管理两个WebSocket连接一个用于音频上行一个用于音频下行并处理PCM音频数据的编码解码、分包发送等。它直接集成了Gemini流式API的协议。VoiceCommandService.swift整合了唤醒词检测和Apple语音识别。唤醒词检测部分项目可能使用了一个简单的本地音频能量检测你也可以替换为更精确的第三方离线唤醒词引擎如Porcupine。5.2 如何添加一个新的AI后端或工具OpenVision的架构很好地支持了扩展。假设你想接入另一个AI服务比如Claude API或本地运行的Ollama。创建新的服务类在Services/目录下仿照OpenClawService或GeminiLiveService创建一个新的YourAIService类。这个类需要实现一些共同的接口或协议比如AIBackendProtocol如果项目抽象了的话或者至少提供sendText(_:completion:)、startAudioStream()、stopAudioStream()等方法。扩展后端枚举在Models/AIBackend.swift中为AIBackend枚举添加一个新case例如case yourAI。更新设置和管理器在SettingsView中为新的后端添加配置界面输入API密钥、服务器地址等。在SettingsManager中增加对应的配置存储字段。在AIBackendManager或负责路由的后端选择器中添加对新case的处理逻辑实例化你的YourAIService。集成到主界面确保VoiceAgentView能够根据当前选择的后端调用正确服务的方法。添加自定义工具针对OpenClawOpenClaw的强大之处在于其工具系统。如果你想让它能控制你家的特定品牌智能灯你需要在OpenClaw服务器端编写一个新的Tool。这个Tool会描述自己的能力名称、描述、参数并实现一个执行函数该函数能通过HTTP/MQTT等方式控制你的灯。在OpenClaw的配置中注册这个Tool。重启OpenClaw服务后OpenVision App无需任何修改因为工具列表和能力描述是通过WebSocket动态获取的。当你对眼镜说“Ok Vision打开客厅的灯”时OpenClaw的LLM会自动识别意图调用你新写的工具。5.3 性能调优与电量管理实战建议在真机上长期运行此类应用电量和性能是需要密切关注的问题。音频会话管理正确配置AVAudioSession是保证语音功能正常且省电的基础。在录音时应设置为.playAndRecord模式并设置合适的分类如.ambient或.playAndRecord和选项如.allowBluetooth、.defaultToSpeaker。在不录音时应及时将会话设置为非活动状态。后台运行策略iOS对后台音频处理有严格限制。OpenVision作为语音交互应用可能需要申请“音频”后台模式在Info.plist中声明。但即使如此也应在应用进入后台时暂停非必要的服务如Gemini Live视频流仅保留唤醒词检测如果支持离线唤醒。唤醒词检测应使用AVAudioEngine的Tap功能并尽可能降低采样率和缓冲区大小。网络连接优化指数退避重连OpenClawService已实现这是必须的。网络状态监听使用Network.framework的NWPathMonitor监听网络变化。当Wi-Fi断开或切换到蜂窝网络时可以主动暂停或降级服务如从视频流切换到纯音频并在网络恢复后自动重连。数据压缩对于Gemini Live视频流发送前对图像进行高效的JPEG压缩。对于音频可以使用Opus等低比特率编码如果API支持。内存与CPU持续的视频帧处理可能带来内存压力。确保及时释放不再使用的CGImage或CVPixelBuffer对象。在非主线程进行图像编码/解码等耗时操作避免阻塞UI。6. 常见问题排查与故障解决手册在实际开发和体验中你几乎一定会遇到下面这些问题。这里是我踩过坑后总结的排查清单。6.1 连接类问题问题现象可能原因排查步骤与解决方案眼镜注册失败无法跳转Meta AI1. Meta AI App未安装或未登录。2. Meta开发者账户与应用配置不匹配。3. iOS系统限制如隐私设置。1. 安装并登录Meta AI App确保与开发者账户关联。2. 检查Config.xcconfig中的META_APP_ID和CLIENT_TOKEN是否与Meta开发者控制台完全一致。特别注意CLIENT_TOKEN格式。3. 前往iPhone“设置”-“隐私与安全性”-“开发者”检查是否有相关权限被禁用。OpenClaw连接失败或频繁断开1. 服务器地址/端口错误。2. 防火墙/网络阻止WebSocket连接。3. OpenClaw服务未运行或崩溃。4. 认证令牌错误。1. 确认OpenClaw服务器IP和端口默认18789正确。手机与服务器需在同一网络或服务器有公网IP。2. 在电脑上用curl或WebSocket测试工具连接wss://your-server:18789确认可达。3. 检查OpenClaw服务器日志确保服务已启动且无报错。4. 如果OpenClaw配置了认证请在App设置中输入正确的令牌。Gemini Live连接失败1. API密钥无效或过期。2. 所在地区不支持Gemini API。3. 网络问题如需要特定网络环境。1. 前往Google AI Studio重新生成API密钥并替换。确保密钥有调用Gemini API的权限。2. 尝试使用网络工具或更换网络环境。3. 检查Xcode控制台输出Gemini API通常会返回具体的错误信息如API_KEY_INVALID或LOCATION_NOT_SUPPORTED。6.2 功能类问题问题现象可能原因排查步骤与解决方案唤醒词“Ok Vision”无反应1. 麦克风权限未授予。2. 唤醒词功能被关闭。3. 环境噪音过大或发音不清晰。4. 后台音频会话被中断。1. 检查iPhone“设置”-“隐私与安全性”-“麦克风”确保OpenVision有权限。2. 进入App设置确认“Wake Word Enabled”开关已打开。3. 在相对安静的环境下清晰地说出“Ok Vision”。可尝试在设置中调整唤醒词灵敏度如果项目后续支持。4. 确保App在前台运行且未被其他音频应用如音乐播放器抢占音频会话。AI有回复但眼镜没有声音1. 眼镜蓝牙音频未连接。2. 系统音频输出未选择眼镜。3. TTS服务或音频播放路由错误。1. 进入iPhone“设置”-“蓝牙”确认Ray-Ban眼镜已连接且显示为音频设备。2. 从iPhone屏幕右上角下拉控制中心长按音频输出模块选择你的Ray-Ban眼镜作为输出设备。3. 在OpenVision App的设置中检查是否有音频输出设备的选择选项。拍照或视频流功能失效1. 相机权限未授予。2. 眼镜与手机蓝牙连接不稳定。3. DAT SDK初始化或会话管理错误。1. 授予OpenVision相机权限首次使用时会请求。2. 尝试将眼镜放回充电盒再取出或重启眼镜重新建立蓝牙连接。3. 查看Xcode控制台日志搜索DAT SDK相关的错误码。常见错误是授权过期需要重新在Meta AI App中授权。6.3 开发与构建问题问题现象可能原因排查步骤与解决方案Xcode构建失败证书错误1.DEVELOPMENT_TEAM未设置或错误。2. 没有有效的Apple开发者证书或描述文件。3. Bundle Identifier冲突。1. 确认Config.xcconfig中的DEVELOPMENT_TEAM是你的10字符团队ID。2. 在Xcode的“Signing Capabilities”中选择你的个人团队进行自动签名。确保iPhone已在Xcode的“Devices and Simulators”中被信任。3. 修改PRODUCT_BUNDLE_IDENTIFIER为一个唯一的标识符。运行崩溃报Threading或Actor错误1. Swift并发代码async/await,MainActor使用不当。2. 在非主线程更新了UI。1. OpenVision大量使用MainActor来确保UI操作在主线程。检查崩溃堆栈看是否在非隔离的代码中访问了被MainActor标记的属性和方法。使用await MainActor.run { ... }来包装UI更新代码。2. 使用Thread Sanitizer工具进行调试检查数据竞争。最后一点心得调试这类涉及硬件、蓝牙、网络和多线程的应用日志是你的最佳伙伴。充分利用Xcode的控制台输出并在代码的关键节点如连接建立/断开、收到消息、错误发生处添加详细的print或os.log语句。对于网络问题可以在Mac上使用Charles等抓包工具代理iPhone的网络流量直观地查看WebSocket握手、数据收发是否正常这能解决一大半的疑难杂症。OpenVision项目开启了一个充满可能性的世界它把顶级硬件和前沿AI的选择权交还给了开发者。无论你是想打造一个专属的个人助理还是探索下一代人机交互这个代码库都是一个绝佳的起点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2597601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

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

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…