如何通过Apache Camel OPCUA Milo Client获取标签名与对应值?
Apache Camel OPCUA Milo Client 同时输出标签名与值的实现方案
可以实现同时输出标签名和对应值,以下是两种可行的方法:
方法一:利用组件内置消息头直接打印
Apache Camel OPCUA Milo组件会将OPC节点的关键信息自动存入Exchange的消息头中,你可以直接在log组件的日志格式里引用这些头字段来同时输出标签名和值:
常用的相关消息头包括:
CamelOpcUaNodeId:节点的完整ID(即你配置的ns=2;s=Channel2 SIMUL.SIM_1.BNAp1.18VGG1_1XA)CamelOpcUaDisplayName:节点的显示名称(若服务器返回对应字段则可用)
示例路由配置
Java DSL 写法
from("milo-client:opc.tcp://127.0.0.1:49310?keyStoreUrl=file:C:\\Temp\\application\\certificate\\clientkeystore.jks&keyPassword=123456&keyStorePassword=123456&applicationUri=urn:8409:test:camelopcua&applicationName=camelopcua&node=RAW(ns=2;s=Channel2 SIMUL.SIM_1.BNAp1.18VGG1_1XA)&samplingInterval=2000") .log("标签ID: ${header.CamelOpcUaNodeId}, 当前值: ${body}");
YAML 配置写法
routes: - from: uri: "milo-client:opc.tcp://127.0.0.1:49310?keyStoreUrl=file:C:\\Temp\\application\\certificate\\clientkeystore.jks&keyPassword=123456&keyStorePassword=123456&applicationUri=urn:8409:test:camelopcua&applicationName=camelopcua&node=RAW(ns=2;s=Channel2 SIMUL.SIM_1.BNAp1.18VGG1_1XA)&samplingInterval=2000" steps: - log: message: "标签ID: ${header.CamelOpcUaNodeId}, 当前值: ${body}"
方法二:自定义处理器组合输出
如果需要更灵活的格式控制,可以添加自定义Processor来获取节点信息和值,再组装成你需要的内容:
示例Java处理器实现
from("milo-client:opc.tcp://127.0.0.1:49310?keyStoreUrl=file:C:\\Temp\\application\\certificate\\clientkeystore.jks&keyPassword=123456&keyStorePassword=123456&applicationUri=urn:8409:test:camelopcua&applicationName=camelopcua&node=RAW(ns=2;s=Channel2 SIMUL.SIM_1.BNAp1.18VGG1_1XA)&samplingInterval=2000") .process(exchange -> { String nodeId = exchange.getIn().getHeader("CamelOpcUaNodeId", String.class); Object value = exchange.getIn().getBody(); String logContent = String.format("OPC标签[%s]的当前值为: %s", nodeId, value); exchange.getIn().setBody(logContent); }) .log("${body}");
补充说明
- 两种方法均基于Camel OPCUA Milo组件的内置特性,无需修改OPC服务器配置
- 若订阅多个节点(配置多个
node参数或批量订阅),每个消息的头信息会自动匹配对应节点的ID和属性 - 优先推荐方法一,配置简洁高效;若需复杂格式或额外业务处理,再选择方法二
内容的提问来源于stack exchange,提问作者Stefano
相关产品推荐
相关产品推荐

