开源物联网平台SiteWhere:微服务架构下的设备管理与数据流实战

news2026/5/12 19:30:46
1. 项目概述一个开源的物联网应用平台如果你正在寻找一个能帮你快速搭建、管理和扩展物联网应用的核心平台而不是从零开始造轮子那么SiteWhere这个开源项目绝对值得你花时间深入了解。它不是一个简单的设备连接网关而是一个功能完备的物联网应用平台旨在处理物联网项目中那些最繁琐、最核心的通用部分。简单来说SiteWhere 扮演着物联网应用“中台”的角色。想象一下你有一个智能工厂项目里面有几百台设备从传感器、PLC到机械臂它们使用不同的协议如 MQTT、HTTP、CoAP上报数据。你的核心业务逻辑是分析这些数据实现预测性维护或优化生产流程。但在这之前你不得不先解决一堆基础问题设备如何安全接入并注册海量的时序数据怎么存储和查询如何定义设备类型和资产模型事件如何路由和处理SiteWhere 就是来解决这些问题的。它提供了一套开箱即用的服务让你能专注于上层业务应用开发而不是重复实现设备管理、数据摄取和事件处理这些底层基础设施。我最初接触它是在一个智慧农业项目中当时我们需要接入多种环境传感器和灌溉控制器。自己搭建一套稳定的设备接入和数据管道耗时耗力且后期维护成本高。采用 SiteWhere 后我们只用了两周就完成了所有设备的模型定义、接入调试和基础数据看板团队得以将全部精力投入到作物生长模型算法开发上。这个经历让我深刻体会到一个设计良好的物联网平台对于加速项目落地有多么关键。2. 核心架构与设计理念拆解2.1 微服务架构与可扩展性SiteWhere 最核心的设计选择是采用了微服务架构。这不是为了追赶技术潮流而是由物联网应用的本质需求决定的。物联网系统通常需要处理高并发连接、海量数据流并且组件可能需要独立伸缩。一个单体应用很难满足这些弹性需求。SiteWhere 将核心功能拆分为一系列独立的服务例如设备管理服务负责设备注册、生命周期管理、状态跟踪。事件处理服务接收、验证、丰富并持久化从设备发来的测量数据、警报和位置信息。资产管理服务管理设备之外的物理或逻辑资产如“厂房A”、“车辆123”并将设备与之关联。调度服务处理批量操作和定时任务。用户管理服务处理租户、用户认证与授权。这些服务通过 REST API 和 Apache Kafka 等消息中间件进行通信。这种架构带来了几个实实在在的好处独立部署与伸缩如果数据涌入量剧增你可以单独扩容事件处理服务而无需重启整个平台。技术栈灵活性理论上不同的微服务可以采用最适合其任务的技术栈尽管官方发行版保持一致。高可用性单个服务的故障不会导致整个平台瘫痪。易于集成外部系统可以通过清晰的 API 边界与特定服务交互耦合度低。注意微服务也带来了复杂性特别是在部署和监控上。对于小规模项目或原型验证你可能觉得“杀鸡用牛刀”。但 SiteWhere 提供了 Docker Compose 和 Kubernetes (Helm Charts) 的部署脚本大大降低了运维门槛。我的建议是如果你的项目有长期演进和规模增长的预期从开始就拥抱这种架构是明智的。2.2 多租户与数据隔离对于方案提供商或大型企业而言物联网平台往往需要服务多个不同的客户或部门这就是多租户场景。SiteWhere 从底层就支持多租户。每个租户拥有完全独立的数据空间包括其设备模型、设备实例、事件数据、用户权限等。平台管理员可以创建租户而租户管理员在其空间内拥有完全自主权。这种设计意味着数据安全租户A绝对无法访问租户B的设备数据从存储层就实现了隔离。资源定制可以为不同租户配置不同的资源配额如设备数量、数据存储时长。品牌独立每个租户可以使用自己的品牌标识。在实际项目中我们曾用它为一个集团的不同子公司部署服务。每个子公司作为一个独立租户集团总部则拥有一个超级租户视图用于跨子公司汇总分析这需要基于API进行二次开发。这种模式清晰且安全。2.3 设备建模与资产层次结构物联网项目混乱的根源之一往往是设备模型不统一。SiteWhere 引入了强类型的设备模型概念。在注册一个具体的温度传感器之前你必须先定义一个“温度传感器类型”。这个类型规定了元数据名称、描述、图片。命令设备能响应的指令如下发一个“设置阈值”命令。每个命令包含其名称、参数和描述。状态设备可能处于的状态枚举。规格描述设备能力的键值对。有了设备类型才能创建设备实例。每个设备实例拥有唯一的硬件ID并归属于某个设备类型。这种“先定义后使用”的模式强制了数据规范性为后续的数据处理和解析打下了坚实基础。更进一步SiteWhere 的资产管理模块允许你建立现实世界的物理层次结构。例如你可以定义资产类型“楼宇”、“楼层”、“房间”然后创建资产实例“研发大楼”、“三楼”、“301实验室”。最后将具体的设备如“温湿度传感器-001”分配给“301实验室”这个资产。这样你不仅能查询设备数据还能基于资产结构进行查询比如“获取研发大楼所有设备的平均温度”。这对于园区、工厂等场景的管理至关重要。3. 核心功能模块深度解析3.1 设备集成连接万物的入口设备集成是物联网平台的第一道关卡。SiteWhere 通过设备通信模型抽象了各种接入协议。其核心概念是“设备事件”即设备上报的任何数据测量值、警报、位置、状态变更都封装为一个标准的事件对象。平台通过Inbound Processing Pipelines入站处理管道来接收这些事件。一个管道包含多个处理阶段如解码将原始协议数据如MQTT payload、HTTP body解码为SiteWhere内部事件对象。验证检查事件结构、设备令牌有效性等。丰富为事件添加额外上下文信息如根据设备ID查找其所属的资产信息并附加到事件上。路由决定将事件持久化到哪个存储库或转发到哪个外部系统如Kafka主题。SiteWhere 官方提供了多种开箱即用的连接器MQTT最常用的物联网协议支持认证和SSL/TLS。HTTP REST设备通过HTTP POST发送JSON数据。Apache Kafka直接消费来自Kafka主题的设备消息适用于已有数据管道的场景。Azure Event Hub/AWS Kinesis云服务集成。CoAP适用于受限网络的协议。实操心得在集成自定义协议的设备时你需要实现一个自定义的解码器。最常用的方式是继承DeviceEventDecoder类。这里有个关键点解码器的逻辑应该尽量简单只做协议转换业务逻辑如单位换算、复杂校验尽量放到后面的“丰富”阶段或业务系统中处理。这样解码器更稳定也易于测试。我们曾把一个老旧Modbus TCP设备的数据通过一个边缘网关转换成MQTT消息然后由SiteWhere的MQTT接入点配合自定义解码器成功接入整个过程非常清晰。3.2 事件处理与数据持久化设备事件被接收并处理后需要被可靠地存储。SiteWhere 将事件数据分为几类并支持为它们配置不同的存储后端设备事件最核心的数据包括测量数据、警报、位置更新。设备状态设备的最新状态快照。设备命令下发给设备的历史指令及响应。其数据持久化层设计得很灵活支持MongoDB默认选择用于存储设备模型、资产、事件等文档型数据。其灵活的Schema非常适合物联网设备模型快速迭代的特点。InfluxDB专门用于存储时间序列数据测量数据。如果你有大量的传感器读数需要高效存储和查询如每秒一次的温度数据强烈建议将测量数据路由到InfluxDB。SiteWhere 内置了相应的集成。Cassandra作为高可扩展、分布式的替代方案用于存储设备事件。这种混合持久化策略是SiteWhere的一大亮点。你可以用MongoDB存设备元数据和低频事件用InfluxDB存高频时序数据各取所长。在配置时需要在application.yml中明确指定各个存储库的实现类。3.3 命令下发与设备控制物联网不仅是数据上传遥测还包括反向控制遥控。SiteWhere 提供了完整的命令下发框架。命令定义在设备类型中预定义好命令的格式名称、参数。命令执行通过REST API向特定设备实例发送命令。命令会进入一个调度队列。命令派发由Outbound Connectors出站连接器负责将命令转换为设备能理解的协议并发送出去。和入站一样支持MQTT、HTTP等协议。状态跟踪命令发送后平台会跟踪其状态发送中、已送达、执行成功、执行失败。设备也可以通过“命令响应”事件来更新命令的执行结果。这个过程的难点在于协议适配。例如一个通过MQTT上行的设备下发命令时可能需要发送到特定的Topic且Payload格式需符合设备固件的要求。你需要在出站连接器的配置中详细定义这些映射规则。我们曾遇到一个设备它要求下发的JSON中某个字段必须是整数但API传入的是字符串导致设备不响应。最后在出站连接器的编码阶段添加了一个类型转换才解决。所以命令下发的联调务必准备好设备端的协议文档并善用平台的日志调试功能。3.4 用户界面与系统管理SiteWhere 提供了一个基于Web的管理控制台Administration Console。对于不熟悉API的运营人员或项目经理来说这个控制台非常有用。通过它你可以可视化地管理租户、用户、设备类型、设备实例和资产。查看设备的实时事件流和状态。手动向设备发送命令。配置数据连接器和批处理操作。不过需要客观看待这个控制台。对于复杂的、生产级的物联网应用这个管理台更偏向于“管理”而非“业务操作”。大多数情况下你会基于SiteWhere的REST API或客户端SDK开发定制化的业务应用系统如数据大屏、告警中心、移动运维App。SiteWhere 提供了Java、Node.js等语言的客户端库让二次开发变得顺畅。4. 从零开始部署与基础配置实战4.1 环境准备与依赖选择部署SiteWhere前你需要规划好基础设施。对于生产环境我强烈推荐使用Kubernetes部署它能完美匹配SiteWhere的微服务架构实现高可用和弹性伸缩。对于开发测试或小规模场景使用Docker Compose是最快的方式。这里以Docker Compose部署为例讲解核心步骤。你需要准备一台Linux服务器建议4核8G内存以上。安装好Docker和Docker Compose。从SiteWhere GitHub仓库获取最新的docker-compose.yml配置文件。关键依赖服务包括Traefik作为反向代理和入口网关处理外部HTTP/HTTPS请求。Keycloak提供身份认证和授权服务OAuth2/OpenID Connect。MongoDB存储核心数据。InfluxDB存储时序数据可选但建议。Apache Kafka Zookeeper用于微服务间异步通信。SiteWhere Microservices多个SiteWhere自身的服务容器。4.2 使用Docker Compose快速启动假设你已经克隆了仓库并进入docker-compose目录。基础启动运行docker-compose up -d。这会拉取所有镜像并启动服务。第一次启动可能需要几分钟因为需要初始化数据库。访问控制台服务启动后通常可以通过http://你的服务器IP:8080访问SiteWhere管理控制台。默认的超级管理员用户名/密码在配置文件中指定通常是sitewhere/sitewhere务必在首次登录后修改。检查服务状态使用docker-compose logs -f 服务名来查看特定服务如sitewhere-instance-management的日志排查启动问题。一个最常见的启动问题是端口冲突。确保宿主机的8080、9090、9092等端口未被占用。另一个问题是资源不足尤其是Kafka和MongoDB在内存不足时启动会失败。建议为Docker分配至少4GB内存。4.3 初始租户与设备模型创建登录控制台后第一步不是急着添加设备而是建立模型。创建租户如果你需要多租户首先在“系统管理”中创建新租户并为其配置数据存储选择MongoDB数据集。切换到租户上下文使用租户管理员账户登录或在本租户内创建用户。创建设备类型进入“设备类型”页面点击“创建”。填写名称如“TemperatureSensorV2”、描述。在“命令”选项卡添加一个命令例如“SET_REPORT_INTERVAL”并添加一个整数类型的参数“intervalSeconds”。这定义了你能向此类设备下发什么指令。在“规格”选项卡可以添加一些自定义属性如“manufacturer”、“firmwareVersion”。创建设备实例进入“设备”页面点击“创建”。输入唯一的硬件ID如“SN-TEMP-001”这是设备物理上的唯一标识通常由设备固件决定。选择刚才创建的设备类型“TemperatureSensorV2”。指定一个规格可选比如“indoor”。保存后系统会为这个设备生成一个唯一的访问令牌。这个令牌是设备连接平台时进行身份验证的凭证必须妥善保管并在设备端代码中配置。至此你的平台已经准备好接收来自硬件ID为“SN-TEMP-001”的设备数据了。接下来就是配置设备端使其能按照SiteWhere要求的协议格式上报数据。5. 设备接入与数据流实战示例5.1 模拟一个MQTT设备接入假设我们有一个温度传感器它通过MQTT协议上报JSON格式的数据。我们将使用Python脚本模拟这个设备。首先设备需要知道如何连接MQTT Broker地址即SiteWhere的MQTT微服务地址通常是tcp://服务器IP:1883。如果启用了SSL则是ssl://...:8883。客户端ID任意唯一字符串。用户名/密码在SiteWhere中MQTT认证使用设备的硬件ID作为用户名设备的访问令牌作为密码。发布主题SiteWhere有特定的主题规范。对于发送事件主题格式通常为SiteWhere/input/protobuf如果发送Protocol Buffers格式或SiteWhere/input/json如果发送JSON格式。我们使用JSON格式。一个符合SiteWhere JSON事件格式的测量数据上报示例{ hardwareId: SN-TEMP-001, type: DeviceMeasurement, request: { eventDate: 2023-10-27T10:00:00.000Z, measurements: [ { name: temperature, value: 23.5 }, { name: humidity, value: 65.2 } ] } }Python模拟脚本 (device_simulator.py) 核心部分import paho.mqtt.client as mqtt import json import time from datetime import datetime, timezone # 设备凭证 HARDWARE_ID SN-TEMP-001 ACCESS_TOKEN 你的设备访问令牌 # 从SiteWhere控制台获取 MQTT_BROKER 你的服务器IP MQTT_PORT 1883 TOPIC SiteWhere/input/json def on_connect(client, userdata, flags, rc): if rc 0: print(设备连接成功) else: print(f连接失败代码: {rc}) client mqtt.Client(client_idHARDWARE_ID) client.username_pw_set(HARDWARE_ID, ACCESS_TOKEN) # 关键硬件ID为用户名令牌为密码 client.on_connect on_connect client.connect(MQTT_BROKER, MQTT_PORT, 60) client.loop_start() try: while True: # 构造事件数据 event_data { hardwareId: HARDWARE_ID, type: DeviceMeasurement, request: { eventDate: datetime.now(timezone.utc).isoformat().replace(00:00, Z), measurements: [ {name: temperature, value: round(20 5 * (time.time() % 10) / 10, 1)}, # 模拟温度波动 {name: humidity, value: round(50 10 * (time.time() % 7) / 7, 1)} # 模拟湿度波动 ] } } payload json.dumps(event_data) client.publish(TOPIC, payload) print(f已发送: {payload}) time.sleep(10) # 每10秒发送一次 except KeyboardInterrupt: print(模拟器停止) finally: client.loop_stop() client.disconnect()运行这个脚本如果一切配置正确你将在SiteWhere管理控制台的“设备详情”页看到设备“SN-TEMP-001”的状态变为“在线”并且在“事件”流中实时看到上报的温度和湿度数据。5.2 通过REST API查询与处理数据设备数据进入平台后你的业务系统需要通过API与之交互。SiteWhere提供了全面的REST API。示例1查询指定设备的最新事件# 获取设备详情需要设备令牌或用户JWT Token curl -X GET \ http://服务器IP:8080/sitewhere/api/devices/SN-TEMP-001 \ -H Authorization: Bearer 你的JWT令牌 # 查询设备最近的测量数据假设测量数据存在InfluxDB # 通常你需要使用SiteWhere的“测量”查询接口它内部会从InfluxDB获取数据 curl -X GET \ http://服务器IP:8080/sitewhere/api/devices/SN-TEMP-001/measurements?startDate2023-10-27T00:00:00ZendDate2023-10-27T23:59:59Z \ -H Authorization: Bearer 你的JWT令牌示例2向设备下发命令假设我们要让传感器调整上报间隔。首先确保在设备类型“TemperatureSensorV2”中定义了“SET_REPORT_INTERVAL”命令。curl -X POST \ http://服务器IP:8080/sitewhere/api/devices/SN-TEMP-001/commands \ -H Content-Type: application/json \ -H Authorization: Bearer 你的JWT令牌 \ -d { command: SET_REPORT_INTERVAL, parameters: { intervalSeconds: 30 } }这个命令会进入SiteWhere的调度队列然后通过你为设备配置的出站连接器例如MQTT出站发送到设备。设备端需要订阅相应的命令主题并处理。6. 生产环境进阶考量与故障排查6.1 性能调优与高可用部署当设备量达到数千甚至上万时默认配置可能需要调整。微服务资源限制在Kubernetes中为sitewhere-event-sources、sitewhere-event-management这类高负载服务分配更多的CPU和内存限制limits与请求requests。Kafka分区增加Kafka主题的分区数以提高事件处理的并行度。SiteWhere内部的一些主题如device-command的分区数可以通过配置调整。MongoDB索引为设备ID、事件时间戳、租户ID等常用查询字段建立复合索引可以极大提升查询性能。使用MongoDB的慢查询日志来分析。InfluxDB配置根据数据保留策略RP和分片持续时间合理配置InfluxDB。高频数据如秒级建议使用更短的分片持续时间如7天以提高查询效率。缓存策略SiteWhere内部会缓存设备规格等信息。可以调整缓存大小和过期时间减少对数据库的频繁访问。对于高可用Kubernetes是首选。确保每个SiteWhere微服务至少有两个副本replicas并使用Readiness和Liveness探针。数据库层MongoDB, InfluxDB也需要部署为副本集或集群模式。负载均衡器如Traefik或Nginx Ingress负责将流量分发到不同的API网关实例。6.2 安全加固实践安全是物联网项目的生命线。传输加密MQTT务必启用SSL/TLS端口8883。在Docker Compose中配置Mosquitto使用有效的证书。HTTP通过Traefik或Nginx配置HTTPS将HTTP重定向到HTTPS。认证与授权坚持使用Keycloak进行统一的OAuth2认证。为不同类型的客户端设备、用户、管理后台创建不同的Client配置。对于设备使用硬件ID访问令牌的机制是安全的。确保访问令牌有足够的复杂度并考虑实现令牌轮换机制虽然SiteWhere原生不支持自动轮换但可通过自定义逻辑实现。遵循最小权限原则在Keycloak中精细配置角色和权限。网络隔离将SiteWhere的微服务部署在内部网络仅将API网关、MQTT Broker等入口服务暴露在DMZ区。使用网络策略在K8s中限制服务间的非必要通信。6.3 常见问题与排查指南在运维过程中你可能会遇到以下典型问题问题现象可能原因排查步骤设备显示“离线”1. 设备未成功连接MQTT/HTTP。2. 设备凭证硬件ID/令牌错误。3. 网络防火墙阻止连接。1. 检查设备端日志确认连接和认证过程。2. 在SiteWhere控制台核对设备令牌。3. 使用telnet或nc测试Broker端口连通性。4. 查看sitewhere-event-sources服务日志看是否有认证失败记录。设备数据上报成功但控制台看不到1. 事件数据格式不符合规范。2. 入站处理管道解码失败。3. 数据被路由到错误的存储库。1. 使用MQTT客户端工具如MQTT.fx订阅SiteWhere/input/json查看原始payload是否正确。2. 检查sitewhere-event-sources日志寻找解码错误。3. 确认设备类型和规格是否存在。命令下发失败1. 设备类型未定义该命令。2. 出站连接器配置错误。3. 设备未订阅命令主题。1. 在控制台检查命令定义。2. 查看sitewhere-command-delivery服务日志。3. 检查出站连接器如MQTT的配置特别是目标Topic和Payload转换规则。4. 确认设备端是否在线并正确订阅了命令Topic通常是SiteWhere/command/SN-TEMP-001。API调用返回403 Forbidden1. JWT令牌过期。2. 令牌缺少访问该API所需的权限Scope。1. 刷新令牌。2. 在Keycloak中检查该用户/客户端关联的角色和权限映射。服务启动失败报数据库连接错误1. MongoDB/InfluxDB服务未就绪。2. 连接字符串配置错误。3. 网络策略阻止服务间通信。1. 使用docker-compose logs mongodb查看数据库日志。2. 检查对应微服务如sitewhere-instance-management的配置文件中的数据库连接URL。3. 在K8s环境中检查Service名称和端口是否正确。一个真实的踩坑记录我们曾遇到设备数据时有时无的问题。日志显示事件被接收了但InfluxDB里没有。最后发现是InfluxDB的写入用户权限不足。SiteWhere在向InfluxDB写入时使用的是配置文件中指定的用户名和密码。我们检查了sitewhere.influxdb相关的配置发现密码中有特殊字符在YAML配置中未正确转义。修正密码格式后问题解决。教训是对于配置文件中的密码、令牌等敏感信息要特别注意YAML的字符串转义规则最好使用环境变量或密钥管理服务来注入。7. 生态集成与二次开发SiteWhere 不是一个封闭系统它的强大之处在于易于集成和扩展。与流处理平台集成你可以将SiteWhere处理后的设备事件发布到Apache Kafka的特定主题然后由Flink、Spark Streaming或KSQL进行实时流分析实现复杂的风控或预警逻辑。与云服务集成通过其扩展机制可以将事件转发到AWS IoT Core、Azure IoT Hub或Google Cloud IoT Core实现混合云架构。自定义微服务如果你需要实现SiteWhere没有提供的特定业务逻辑如一个复杂的设备固件升级服务你可以基于Spring Boot开发一个独立的微服务通过消费SiteWhere发出的事件或调用其API无缝融入整个平台生态。二次开发最常见的是定制事件解码器和出站命令编码器。SiteWhere提供了清晰的SPI服务提供者接口。你需要将打好的Jar包放入容器的特定目录并在配置中指定你的实现类。记得在开发时充分利用SiteWhere丰富的单元测试框架来验证你的逻辑。最后我想分享一点个人体会。SiteWhere 的学习曲线初期可能有些陡峭尤其是要理解其微服务架构和各组件关系。但一旦你掌握了它的核心概念租户、设备类型、资产、事件管道你会发现它提供了一套极其规范且强大的范式来管理物联网的复杂性。它可能不是最简单、最轻量的选择但对于需要严肃对待设备管理、数据规范性和系统扩展性的企业级物联网项目而言投入时间学习和使用SiteWhere长远来看会节省大量的开发和维护成本。开始的最佳方式就是按照本文的步骤用Docker Compose快速搭一个环境亲手模拟一两个设备接入和命令下发很多概念会在实践中变得清晰起来。

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