开源物联网平台SiteWhere:架构解析与实战部署指南

news2026/5/12 8:05:11
1. 项目概述一个开源的物联网应用平台如果你正在寻找一个能够快速搭建、灵活扩展并且能统一管理成千上万台设备的物联网平台那么你很可能已经听说过或者正在评估 SiteWhere。作为一个在物联网领域摸爬滚打了多年的从业者我见过太多团队从零开始造轮子耗费数月甚至数年时间最终却陷入维护泥潭的案例。SiteWhere 的出现很大程度上就是为了解决这个痛点。它不是一个简单的设备连接网关而是一个企业级的开源物联网应用平台旨在为连接、处理、存储和分析物联网设备数据提供一套完整的解决方案。简单来说你可以把 SiteWhere 想象成一个物联网领域的“操作系统”或“中间件”。它的核心价值在于将物联网应用中那些通用、复杂且重复性高的部分——比如设备接入协议适配、设备生命周期管理、海量数据接收与路由、事件处理、数据持久化等——抽象成一个平台服务。这样一来应用开发者就不需要再关心 MQTT 服务器怎么搭、CoAP 协议如何解析、设备上线离线状态如何同步这些底层细节而是可以专注于上层业务逻辑的开发比如开发一个可视化的设备监控面板或者实现一个智能的告警规则引擎。这个项目适合几类人一是正在规划或启动物联网项目的技术负责人或架构师需要一个可靠的基础平台二是开发团队希望快速构建物联网应用原型或产品避免重复劳动三是学生或研究者想要一个真实的、功能完整的物联网平台来学习和实验。接下来我会结合我自己的部署、定制和运维经验带你深入拆解 SiteWhere 的架构、核心功能以及在实际操作中会遇到的那些“坑”。2. 核心架构与设计哲学解析SiteWhere 的设计并非一蹴而就它经历了多个版本的迭代其架构清晰地反映了应对物联网复杂性的思考。理解其设计哲学是后续能否用好它的关键。2.1 微服务架构与可扩展性SiteWhere 最显著的特点是其基于Spring Boot的微服务架构。整个平台被拆分为多个独立的服务例如设备管理服务、事件处理服务、数据持久化服务、用户管理服务等。每个服务都可以独立部署、伸缩和升级。这种设计带来的直接好处是弹性伸缩。想象一下你的项目初期可能只有几百个设备数据吞吐量不大你可以将所有服务部署在一台服务器上。随着业务增长设备量暴增到十万级数据写入和查询压力主要出现在事件处理和数据持久化环节。这时你可以单独为这两个服务增加实例横向扩展而不必重启或影响设备接入等其它服务。这种架构也提升了系统的容错能力。即使某个服务比如数据分析服务暂时不可用设备数据接收和存储的核心链路依然可以正常工作数据不会丢失只是暂缓分析等服务恢复后可以继续处理。在实际生产环境中我们通常会将服务部署在 Kubernetes 这样的容器编排平台上充分利用其服务发现、负载均衡和自愈能力来管理 SiteWhere 的各个微服务实例。2.2 多租户与数据隔离对于面向企业或提供物联网平台即服务PaaS的场景数据隔离至关重要。SiteWhere 内置了多租户支持。这意味着在一个 SiteWhere 实例中你可以创建多个独立的“租户”每个租户拥有完全隔离的设备资产、用户权限、数据存储空间。租户 A 的设备数据租户 B 的管理员是完全不可见、不可访问的。这个特性是通过在数据模型层面引入“租户ID”来实现的。无论是设备型号、设备实例、事件数据还是用户角色都会关联一个特定的租户标识。底层的数据库查询和 API 访问控制都会严格基于这个标识进行过滤。在部署时你需要为系统配置一个默认的“超级租户”用于管理其他租户这个设计思路非常清晰符合企业级应用的安全规范。2.3 设备建模与元数据驱动物联网设备的种类五花八门从简单的温湿度传感器到复杂的工业机床其功能、数据格式千差万别。SiteWhere 采用了一种元数据驱动的设备建模方式来优雅地应对这种多样性。其核心模型分为三层设备规格定义一类设备的抽象模板比如“智能电表规格”。它会规定这类设备支持哪些命令如下发断电指令以及能产生哪些类型的测量数据如电压、电流、功率。设备类型是设备规格的具体化关联一个物理设备型号。例如“XYZ公司-型号A智能电表类型”。它会指定具体的通信协议如MQTT、数据编解码方式如Protobuf并继承自某个设备规格。设备实例代表一个真实的、具有唯一标识符如IMEI号的物理设备。它归属于某个设备类型并拥有自己的配置属性如安装位置GPS坐标和当前状态。这种分层模型的好处是极大的灵活性。当你有1000个同型号的电表需要接入时你只需要创建一个设备类型然后批量创建设备实例即可。所有这1000个设备共享相同的协议、命令和数据点定义。如果你想为这类设备增加一个新的功能如远程升级固件命令你只需要在对应的设备规格或类型上添加所有设备实例即刻生效。3. 核心功能模块深度拆解了解了宏观架构我们深入到各个核心功能模块看看 SiteWhere 具体是如何工作的。3.1 设备集成与协议支持设备接入是物联网平台的第一道门槛。SiteWhere 提供了多种开箱即用的集成方式MQTT这是最主要的接入协议尤其适用于低功耗、带宽受限的物联网场景。SiteWhere 内置了 MQTT Broker默认使用 HiveMQ 的嵌入式版本设备可以直接发布遥测数据或事件到指定主题平台订阅并处理。你需要为设备类型配置对应的主题模式例如SiteWhere/${tenant}/${device_token}/json。RESTful API对于能力较强的设备如网关、边缘服务器或需要从第三方系统同步设备数据的情况可以通过调用 SiteWhere 的 REST API 来发送设备事件、更新设备状态。这种方式控制力强但需要设备端具备 HTTP 客户端能力。Apache Kafka在高吞吐量、流式数据处理场景下SiteWhere 可以将接收到的事件直接发布到 Kafka 主题中供下游的流处理应用如 Flink、Spark Streaming消费。同时它也支持从 Kafka 消费外部系统产生的设备事件实现了与大数据生态的无缝集成。自定义代理对于私有协议或特殊硬件SiteWhere 允许你开发“设备通信代理”。这是一个独立的微服务负责将特定协议的设备数据“翻译”成 SiteWhere 能理解的事件模型然后通过内部 gRPC 接口注入系统。这是实现协议扩展的核心方式。实操心得在协议选型上对于大部分直接连接的传感器首选 MQTT它轻量、异步适合物联网。对于网关设备它可以通过 MQTT 汇聚下属传感器数据也可以使用 REST API 批量上报。Kafka 集成通常用于将平台数据导出到企业数据湖或实时分析系统而不是用于直接接入海量终端设备因为那会给 Kafka 集群带来巨大压力。3.2 事件处理流水线设备数据进入平台后并非简单地存入数据库而是要经过一个可配置的事件处理流水线。这是 SiteWhere 数据处理能力的核心。一个典型的事件比如一个温度测量数据会依次流经以下处理器解码器将设备发送的原始载荷可能是二进制、JSON、自定义格式解码成 SiteWhere 内部的标准事件对象。验证器检查事件的合法性如数据格式、值域范围、设备是否激活等。事件处理器这是业务逻辑注入的主要环节。你可以在这里添加自定义处理器例如告警处理器判断温度是否超过阈值如果超过则生成一个告警事件。富化处理器根据设备ID从外部系统如CRM查询该设备的客户信息并附加到事件上。转发处理器将事件实时推送到外部 Webhook 或消息队列。持久化处理器最终将事件以及可能新生成的告警事件保存到配置的存储层中。流水线的每个环节都是可插拔的。你可以通过编写 Java 代码实现自定义处理器并将其注册到系统中。这种设计使得数据处理逻辑高度灵活和可定制。3.3 数据存储与持久化策略SiteWhere 支持将数据持久化到多种存储后端默认配置通常使用组合方式以达到最佳效果MongoDB用于存储元数据和最新状态。所有设备规格、类型、实例信息以及设备的最后已知位置、最后测量值等最新状态都存放在 MongoDB 中。这是因为这类数据是文档型的结构灵活且读写频繁MongoDB 非常合适。InfluxDB用于存储时间序列数据。这是 SiteWhere 的默认选择。所有设备产生的测量数据如温度、湿度、GPS坐标都是典型的时间序列具有时间戳、数值和标签。InfluxDB 为此类数据的写入、压缩和按时间范围查询进行了深度优化性能远超通用关系型数据库。Apache Cassandra作为 InfluxDB 的替代或补充用于存储事件数据。Cassandra 擅长高吞吐量的写入和分布式存储适合存储原始的、未经聚合的设备事件用于长期归档或复杂的历史查询。在部署时你需要仔细规划存储。对于中小型项目使用 MongoDB InfluxDB 的组合是经典且高效的。如果数据量极大日事件量超过十亿并且对写入可用性要求极高可以考虑引入 Cassandra 集群来承载事件存储。注意事项务必为 InfluxDB 设计好数据保留策略。默认情况下数据可能永久保存这会导致磁盘空间快速耗尽。你需要根据业务需求在 InfluxDB 中配置 RPRetention Policy例如自动删除90天前的原始数据但保留1年期的按小时聚合的数据。4. 实战部署与配置指南理论讲得再多不如动手搭一遍。下面我将以一个基于 Docker Compose 的单机开发环境部署为例详解关键步骤和配置。4.1 环境准备与依赖服务启动首先你需要准备一台 Linux 服务器或本地开发机安装好 Docker 和 Docker Compose。SiteWhere 的 Docker 镜像极大地简化了部署。获取配置文件从 SiteWhere 的 GitHub 仓库下载docker-compose.yml和相关环境配置文件。这是官方推荐的入门方式。修改关键配置不要直接运行先检查docker-compose.yml。你需要关注几个点服务版本确保拉取的镜像版本是稳定的 release 版本而非latest可能不稳定。资源限制为关键服务如sitewhere-application、mongodb、influxdb适当增加内存限制如-m 1024m防止在数据处理高峰期 OOM。数据持久化将 MongoDB、InfluxDB 的数据卷映射到宿主机目录避免容器重启数据丢失。例如volumes: - ./data/mongo:/data/db - ./data/influx:/var/lib/influxdb网络配置确保所有服务在同一个自定义 Docker 网络中以便通过服务名互相访问。启动基础设施先启动底层依赖服务这有助于排查问题。docker-compose up -d mongodb influxdb等待几十秒使用docker-compose logs mongodb查看日志确认服务已正常启动并完成初始化。4.2 SiteWhere 微服务集群启动基础设施就绪后启动 SiteWhere 自身的微服务。启动应用服务docker-compose up -d sitewhere-application这是核心的 Web 应用包含了 API 网关、用户界面和核心业务逻辑。首次启动会较慢因为它需要初始化数据库 schema。通过docker-compose logs -f sitewhere-application跟踪日志直到看到类似 “Started Application in XX seconds” 的成功信息。访问管理界面在浏览器中打开http://你的服务器IP:8080/sitewhere/admin。默认用户名/密码通常是admin/password。首次登录后务必立即修改密码启动边缘服务可选如果你需要处理大量的设备连接可以单独启动边缘服务。docker-compose up -d sitewhere-edge边缘服务专门负责协议适配和设备通信可以与应用服务分离部署分担压力。4.3 基础配置与租户创建登录管理后台后需要进行一系列初始化配置。配置数据存储在“系统配置”中检查并配置 MongoDB 和 InfluxDB 的连接信息。Docker Compose 模式下通常主机名就是服务名如mongodbinfluxdb端口是默认的。创建第一个租户这是关键一步。系统有一个“超级租户”用于管理。你需要创建一个新的租户来开展你的业务。进入“租户管理”点击“创建租户”。填写租户ID如customer-a、名称、认证方式等。最关键的是配置租户引擎。你需要为这个租户选择并配置一个“微服务配置模板”。这个模板定义了该租户下的服务如何组合。对于初学者选择默认的“单节点完整配置”模板即可它会在当前 Docker 环境中为该租户启动一整套独立的微服务管理界面、设备服务、事件服务等。等待租户引擎启动创建租户并配置引擎后系统会开始启动该租户的微服务集群。这个过程可能需要1-2分钟。你可以在“实例监控”中查看各服务的状态全部变绿才算成功。5. 从零开始接入一个设备现在平台已经运行起来了。我们模拟接入一个虚拟的温湿度传感器。5.1 创建设备模型切换租户在管理界面右上角切换到刚刚创建的业务租户如customer-a。创建设备规格在“设备规格”中创建名为“环境监测器规格”。添加两个命令“重启”和“上报间隔设置”。添加两个测量数据“温度”单位摄氏度数据类型浮点数和“湿度”单位百分比数据类型浮点数。创建设备类型在“设备类型”中创建名为“虚拟温湿度传感器类型”。选择刚才创建的“环境监测器规格”作为其规格。在“通信”选项卡中选择“MQTT”作为主要通信协议。你需要配置一个主题表达式例如SiteWhere/${tenant}/${device_token}/json。这告诉平台设备应该向这个主题模式发布数据。创建设备实例在“设备实例”中点击“创建设备”。选择“虚拟温湿度传感器类型”。填写一个唯一的设备令牌如sensor-001。这个令牌将用于生成完整的 MQTT 主题和 API 认证。你可以添加一些自定义属性比如installation-site: Room-101。创建成功后系统会为这个设备实例生成一个唯一的硬件ID和认证令牌。这些信息在设备端连接时需要用到。5.2 模拟设备发送数据我们使用一个简单的 Python 脚本需要安装paho-mqtt库来模拟设备。import paho.mqtt.client as mqtt import json import time import random # 配置参数 broker 你的服务器IP port 1883 tenant_id customer-a device_token sensor-001 topic fSiteWhere/{tenant_id}/{device_token}/json # 创建客户端 client mqtt.Client() client.connect(broker, port, 60) try: while True: # 构造符合SiteWhere事件格式的JSON数据 payload { hardwareId: device_token, type: DeviceMeasurement, request: { measurements: { temperature: {value: round(random.uniform(20.0, 25.0), 2), unit: Celsius}, humidity: {value: round(random.uniform(40.0, 60.0), 2), unit: Percent} } }, originator: device_token } # 发布消息 client.publish(topic, json.dumps(payload)) print(fPublished: {payload}) time.sleep(10) # 每10秒发送一次 except KeyboardInterrupt: print(Simulation stopped.) finally: client.disconnect()运行这个脚本。回到 SiteWhere 管理界面进入“设备实例”找到sensor-001点击详情。你应该能在“测量数据”或“事件”标签页中看到实时上报的温度和湿度数据流。同时在“设备详情”的“状态”部分会显示该设备的“最后联系时间”和“最后测量值”。5.3 数据可视化与告警设置数据进来后我们可以快速创建一个仪表盘。创建仪表盘在“仪表盘”模块新建一个仪表盘命名为“机房环境监控”。添加部件添加一个“测量值历史图表”部件。在配置中选择设备sensor-001测量指标选择“温度”和“湿度”时间范围选择“最近1小时”。保存后你就能看到一个实时更新的曲线图。设置告警在“设备类型”中编辑“虚拟温湿度传感器类型”。找到“事件处理”配置可以添加一个“表达式告警处理器”。设置一个规则例如当measurements.temperature.value 24.5时触发一个严重级别的告警消息内容为“温度过高”。这样当模拟数据超过24.5度时在“告警”模块就能看到触发的告警信息。6. 生产环境进阶考量与运维要点将 SiteWhere 用于开发测试和用于生产环境是两回事。以下是一些关键的进阶考量。6.1 高可用与集群部署单机 Docker Compose 只适用于演示和开发。生产环境需要高可用集群。微服务集群化每个 SiteWhere 微服务应用服务、设备服务、事件服务等都需要部署多个实例。这通常通过 Kubernetes 的 Deployment 来实现并配以 Service 做负载均衡。有状态服务集群MongoDB必须部署为副本集Replica Set至少一主两从确保数据冗余和自动故障转移。InfluxDB生产环境应使用 InfluxDB Enterprise 版本支持集群化提供数据分片和复制。Apache Kafka如果使用 Kafka 作为事件管道也需要部署为多节点集群。外部化配置将所有配置数据库连接串、Kafka地址、JVM参数从 Docker 镜像中抽离使用 Kubernetes ConfigMap 或专业的配置中心如 Spring Cloud Config管理。服务发现在集群中微服务之间需要通过服务发现来互相定位。Kubernetes 内置的 DNS 服务发现可以很好地满足这一点SiteWhere 的微服务配置需要相应调整。6.2 安全加固安全无小事尤其是物联网平台直接暴露在公网。网络隔离将 SiteWhere 的服务部署在内网通过 API 网关如 Kong, Nginx对外暴露有限的、经过认证的 API 接口。设备接入层MQTT Broker也应置于 DMZ 区域与核心业务服务隔离。认证与授权设备认证强制使用设备令牌进行 MQTT 连接认证。可以考虑使用更安全的双向 TLS 认证。用户认证集成企业现有的单点登录系统如 Keycloak 或 Okta替代默认的简单认证。API安全对所有 REST API 调用使用 HTTPS 和 JWT 令牌。审计日志开启 SiteWhere 的审计日志功能记录所有关键操作如设备创建、数据删除、用户登录失败并接入集中的日志管理系统。6.3 性能调优与监控随着设备量增长性能瓶颈会逐渐显现。数据库优化MongoDB为频繁查询的字段如device_token,hardware_id建立索引。监控慢查询日志。InfluxDB根据数据保留策略和查询模式合理设计 Tag标签。Tag 用于高效过滤Field 存储实际值。避免将高基数字段如设备ID作为 Tag这会导致“序列爆炸”严重影响性能。JVM调优为 SiteWhere 的 Java 微服务设置合理的堆内存-Xms和-Xmx并启用 GC 日志便于排查内存问题。全面监控基础设施监控使用 Prometheus 收集服务器、Docker/K8s、MongoDB、InfluxDB 的指标用 Grafana 展示。应用监控SiteWhere 基于 Spring Boot可以轻松集成 Spring Boot Actuator暴露健康检查、度量指标等端点供 Prometheus 抓取。业务监控在关键的业务流水线中埋点监控事件处理延迟、设备在线率、命令下发成功率等核心业务指标。7. 常见问题与故障排查实录在实际使用中你一定会遇到各种问题。这里记录几个典型场景和排查思路。7.1 设备连接成功但数据不显示这是最常见的问题之一。检查设备令牌和租户ID确保 MQTT 主题中的${tenant}和${device_token}完全正确包括大小写。这是最容易出错的地方。检查数据格式使用 MQTT 客户端工具如 MQTT.fx订阅#主题查看设备发出的原始消息。确保其 JSON 格式严格符合 SiteWhere 的事件模型。一个常见的错误是字段名拼写错误比如hardwareId写成了hardwareID。检查设备状态在管理界面查看该设备实例的状态是否为“已激活”。未激活的设备其数据会被事件流水线的验证器拦截。查看微服务日志重点查看sitewhere-event-management和sitewhere-event-sources这两个服务的 Docker 日志。错误信息通常会在这里打印出来例如解码失败、数据验证不通过等。docker-compose logs -f sitewhere-event-management7.2 租户引擎启动失败在创建租户后其对应的微服务集群长时间处于“未启动”或“错误”状态。检查资源首先用docker-compose ps和docker-compose logs [租户服务名]查看具体是哪个服务启动失败。最常见的原因是内存不足。增加 Docker 容器的内存限制或者检查宿主机是否有足够资源。检查依赖服务连接租户的微服务需要连接 MongoDB 和 InfluxDB。确认这些基础设施服务运行正常并且网络可达。在租户微服务的日志中通常会打印连接数据库的错误信息。检查配置模板确认创建租户时选择的“微服务配置模板”是正确且完整的。有时自定义的模板可能存在配置错误。7.3 数据查询或仪表盘加载缓慢当历史数据积累到一定量后查询可能会变慢。确认存储层性能首先检查 InfluxDB 和 MongoDB 所在服务器的 CPU、内存、磁盘 IO 使用率。磁盘 IO 瓶颈是导致查询慢的首要原因特别是对于 InfluxDB。优化 InfluxDB 查询避免使用SELECT *明确指定需要的字段。在 WHERE 子句中尽量使用 Tag 进行过滤而不是对 Field 值进行条件判断。为查询添加时间范围限制不要查询全部历史数据。检查是否“序列爆炸”在 InfluxDB 中执行SHOW SERIES CARDINALITY命令如果返回的数字异常巨大比如上千万说明可能存在序列爆炸问题。需要回顾数据模型设计减少高基数 Tag 的使用。考虑数据降采样对于长期的历史趋势图不需要原始秒级数据。可以使用 InfluxDB 的连续查询功能自动将原始数据聚合为每分钟或每小时的均值存储到新的表中。仪表盘查询降采样后的数据速度会快很多。7.4 自定义处理器不生效你编写了一个自定义事件处理器打包成 Jar 放入了指定目录但系统没有调用它。类路径检查确保你的 Jar 包被放入了正确的类路径下。对于 Docker 部署你需要将 Jar 包挂载到容器的/sitewhere/platform/extensions目录中并在服务的环境变量或配置文件中指定该路径。Spring Bean 扫描你的处理器类必须被 Spring 的 ApplicationContext 扫描到。确保它位于com.sitewhere或其子包下或者你明确配置了组件扫描路径。配置文件注册在 SiteWhere 的租户引擎配置中你需要在事件处理流水线的定义里引用你自定义处理器的 Bean ID。仅仅把 Jar 包放进去是不够的必须在配置中声明使用它。查看日志重启相关微服务查看启动日志中是否有关于加载你的处理器类的信息或者是否有相关的错误或警告。SiteWhere 作为一个功能完备的开源物联网平台为开发者提供了一个强大的起点。它的价值不在于替代所有的定制开发而在于提供了一个经过验证的、可扩展的架构基础让你能避开许多深坑快速构建出稳定可靠的物联网应用核心。真正挑战往往不在于平台本身的使用而在于如何根据你的具体业务场景对其进行恰当的定制、扩展和运维。从一个小型的单机 PoC 开始逐步理解其各个组件再到规划一个高可用的生产集群这个过程本身就是对物联网系统架构一次极好的学习和实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2605782.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…