
本文详细讲解如何基于opcfoundation官方java opc ua库(legacy版本)构建并发送callrequest,实现向opc ua服务器调用自定义方法(如上传csv配置文件),包括参数封装、请求构造与关键注意事项。
本文详细讲解如何基于opcfoundation官方java opc ua库(legacy版本)构建并发送callrequest,实现向opc ua服务器调用自定义方法(如上传csv配置文件),包括参数封装、请求构造与关键注意事项。
在OPC UA架构中,Call服务用于同步调用服务器端注册的方法(Method),是实现设备配置下发、文件触发处理等场景的核心机制。针对您的需求——将CSV文件路径信息作为字符串数组参数传递给服务器方法(例如:["MachineConfig.xml", "params.csv"]),需严格遵循UA规范构造CallRequest,并正确序列化参数。
1. 核心类与依赖准备
使用OPC Foundation官方维护的UA-Java-Legacy库(注意:非新发布的ua-sdk)。Maven依赖示例:
<dependency><groupid>org.opcfoundation</groupid><artifactid>ua-stack</artifactid><version>1.04.332</version></dependency><dependency><groupid>org.opcfoundation</groupid><artifactid>ua-core</artifactid><version>1.04.332</version></dependency>
2. 构造CallRequest的关键步骤
参考SampleClient.java中的模式,核心流程如下:
定位目标Method节点:通过NodeId获取待调用方法的ObjectNode(如ns=2;i=5001),其BrowseName通常为"UploadConfig"类方法;
-
准备输入参数:将两个字符串封装为Variant[]数组,确保类型匹配(服务器方法签名要求):
Variant[] inputArgs = new Variant[] { new Variant("MachineConfig.xml"), // 第一个参数:目标机器配置文件名 new Variant("params.csv") // 第二个参数:源CSV文件名 }; -
构建CallRequest:
CallRequest request = new CallRequest(); request.setAuthenticationToken(session.getAuthenticationToken()); request.setRequestHeader(new RequestHeader( session.getAuthenticationToken(), null, new DateTime(), 0L, 0L, 0L )); // 关联方法节点ID、对象节点ID(即包含该方法的对象)、输入参数 CallMethodRequest callMethod = new CallMethodRequest(); callMethod.setMethodId(new NodeId(2, 5001)); // 方法节点ID callMethod.setObjectId(new NodeId(2, 5000)); // 所属对象节点ID(如设备对象) callMethod.setInputArguments(inputArgs); request.setMethodsToCall(new CallMethodRequest[]{callMethod});
3. 发送请求并处理响应
CallResponse response = (CallResponse) session.sendRequest(request);
if (response.getResults().length > 0) {
CallMethodResult result = response.getResults()[0];
StatusCode statusCode = result.getStatusCode();
if (statusCode.isGood()) {
System.out.println("Method call succeeded!");
// 检查输出参数(如有):result.getOutputArguments()
} else {
System.err.println("Call failed: " + statusCode.getDescription());
}
}
注意事项
- ✅ 参数顺序与类型必须严格匹配:服务器端方法签名(InputArguments属性)定义了参数数量、数据类型(如String)及顺序,任何不一致将导致BadArgumentsInvalid错误;
- ✅ NodeId命名空间需准确:NodeId中的命名空间索引(如ns=2)和标识符(i=5001)须与服务器地址空间完全一致,建议通过UaExpert等工具验证;
- ⚠️ Legacy库已停止维护:生产环境推荐迁移到Unified Automation Java SDK或开源项目open62541 Java bindings,以获得长期支持与新特性;
- ? 会话状态校验:确保session已成功激活且未超时,CallRequest必须携带有效的authenticationToken。
通过以上步骤,即可安全、可靠地将CSV文件路径作为参数传递至OPC UA服务器方法,实现配置文件的自动化加载与处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











