我正在尝试将最小的OPC UA客户端连接到kepware服务器。 我已经尝试过OPC Foundations的堆栈和Eclipse Milo的SDK。
似乎可以解析服务器URL,但是如果我尝试从服务器读取任何内容,它会说会话无效。
以下是OPC UA堆栈客户端的代码:
公共类SampleClient {
public static void main(String[] args) throws Exception {
String url = "(serverurl)";
System.out.print("SampleClient: Connecting to " + url + " .. ");
final Client myClient = Client.createClientApplication(null);
SessionChannel mySession = myClient.createSessionChannel(url);
// mySession.activate("username", "123");
mySession.activate();
EndpointDescription[] endpoints = myClient.discoverEndpoints(url);
EndpointDescription endpoint = endpoints[0];
ServiceChannel myChannel = myClient.createServiceChannel(endpoint);
// Create Test Request
ReadValueId[] nodesToRead = {new ReadValueId(Identifiers.RootFolder, Attributes.BrowseName, null, null)};
ReadRequest req = new ReadRequest(null, 100.0, TimestampsToReturn.Both, nodesToRead);
System.out.println("REQUEST: " + req);
ReadResponse res = myChannel.Read(req);
System.out.println("RESPONSE: " + res);
//close
mySession.close();
mySession.closeAsync();
}
}
这是Eclipse Milo SDK的代码
public class MinimalClient {
private OpcUaClient createClient() throws Exception {
EndpointDescription[] endpoints;
endpoints = UaTcpStackClient
.getEndpoints("(serverUrl)")
.get();
EndpointDescription endpoint = endpoints[0];
OpcUaClientConfig config = OpcUaClientConfig.builder()
.setApplicationName(LocalizedText.english("MinimalClient"))
.setApplicationUri("urn:serverURN")
.setCertificate(null)
.setKeyPair(null)
.setEndpoint(endpoint)
.setMaxResponseMessageSize(uint(50000))
.setIdentityProvider(new AnonymousProvider())
.setRequestTimeout(uint(5000))
.build();
return new OpcUaClient(config);
}
public void readValue(OpcUaClient client, CompletableFuture<OpcUaClient> future) throws Exception {
// synchronous read request via VariableNode
VariableNode node = client.getAddressSpace().createVariableNode(Identifiers.Server_ServerStatus_StartTime);
DataValue value = node.readValue().get();
System.out.println(value);
}
private CompletableFuture<List<DataValue>> readServerStateAndTime(OpcUaClient client) {
List<NodeId> nodeIds = ImmutableList.of(
Identifiers.Server_ServerStatus_State,
Identifiers.Server_ServerStatus_CurrentTime);
System.out.println(client.readValues(10000.0, TimestampsToReturn.Both, nodeIds));
return client.readValues(10000.0, TimestampsToReturn.Both, nodeIds);
}
public static void main(String[] args) throws Exception {
CompletableFuture<OpcUaClient> future = new CompletableFuture<>();
MinimalClient c = new MinimalClient();
OpcUaClient client = c.createClient();
client.connect();
client.getAddressSpace();
c.readValue(client, future);
}
}
OPC UA堆栈错误:
Exception in thread "main" ServiceFault: Bad_SessionIdInvalid (0x80250000) "The session id is not valid."
Eclipse Milo错误:
Exception in thread "main" java.util.concurrent.ExecutionException: UaException: status=Bad_SessionClosed, message=The session was closed by the client.
我不确定出了什么问题。我们的Kepserver不使用任何认证等.AncurityPolicy是None。