in plc4j/tools/plc4x-server/src/main/java/org/apache/plc4x/java/tools/plc4xserver/protocol/Plc4xServerAdapter.java [57:174]
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof Plc4xMessage) {
final Plc4xMessage plc4xMessage = (Plc4xMessage) msg;
switch (plc4xMessage.getRequestType()) {
case CONNECT_REQUEST: {
Plc4xConnectRequest request = (Plc4xConnectRequest) plc4xMessage;
try (final PlcConnection ignored = connectionManager.getConnection(request.getConnectionString())) {
//connection.ping().get();
final int connectionId = connectionIdGenerator.getAndIncrement();
connectionUrls.put(connectionId, request.getConnectionString());
Plc4xConnectResponse response = new Plc4xConnectResponse(
request.getRequestId(), connectionId, Plc4xResponseCode.OK);
ctx.writeAndFlush(response);
} catch (Exception e) {
Plc4xConnectResponse response = new Plc4xConnectResponse(
request.getRequestId(), 0, Plc4xResponseCode.INVALID_ADDRESS);
ctx.writeAndFlush(response);
}
break;
}
case READ_REQUEST: {
final Plc4xReadRequest request = (Plc4xReadRequest) plc4xMessage;
String connectionUrl = connectionUrls.get(request.getConnectionId());
try (final PlcConnection connection = connectionManager.getConnection(connectionUrl)) {
// Build a read request for all tags in the request.
final PlcReadRequest.Builder builder = connection.readRequestBuilder();
for (Plc4xTagRequest requestTag : request.getTags()) {
builder.addTagAddress(requestTag.getTag().getName(), requestTag.getTag().getTagQuery());
}
final PlcReadRequest rr = builder.build();
// Execute the query.
// (It has to be synchronously when working with the connection cache)
final PlcReadResponse apiReadResponse = rr.execute().get();
// Create the response.
List<Plc4xTagValueResponse> tags = new ArrayList<>(apiReadResponse.getTagNames().size());
for (Plc4xTagRequest plc4xRequestTag : request.getTags()) {
final PlcResponseCode responseCode = apiReadResponse.getResponseCode(plc4xRequestTag.getTag().getName());
Plc4xResponseCode resCode;
Plc4xValueType valueType;
PlcValue value;
if(responseCode == PlcResponseCode.OK) {
resCode = Plc4xResponseCode.OK;
value = apiReadResponse.getPlcValue(plc4xRequestTag.getTag().getName());
final String valueTypeName = value.getClass().getSimpleName();
// Cut off the "Plc" prefix to get the name of the PlcValueType.
valueType = Plc4xValueType.valueOf(valueTypeName.substring(3));
} else {
resCode = Plc4xResponseCode.INVALID_ADDRESS;
value = null;
valueType = Plc4xValueType.NULL;
}
tags.add(new Plc4xTagValueResponse(
plc4xRequestTag.getTag(), resCode, valueType, value));
}
Plc4xReadResponse response = new Plc4xReadResponse(
request.getRequestId(), request.getConnectionId(), Plc4xResponseCode.OK, tags);
// Send the response.
ctx.writeAndFlush(response);
} catch (Exception e) {
logger.error("Error executing request", e);
Plc4xReadResponse response = new Plc4xReadResponse(
request.getRequestId(), request.getConnectionId(),
Plc4xResponseCode.INVALID_ADDRESS, Collections.emptyList());
ctx.writeAndFlush(response);
}
break;
}
case WRITE_REQUEST:
final Plc4xWriteRequest plc4xWriteRequest = (Plc4xWriteRequest) plc4xMessage;
String connectionUrl = connectionUrls.get(plc4xWriteRequest.getConnectionId());
try (final PlcConnection connection = connectionManager.getConnection(connectionUrl)) {
// Build a write request for all tags in the request.
final PlcWriteRequest.Builder builder = connection.writeRequestBuilder();
for (Plc4xTagValueRequest plc4xRequestTag : plc4xWriteRequest.getTags()) {
builder.addTagAddress(plc4xRequestTag.getTag().getName(),
plc4xRequestTag.getTag().getTagQuery(), plc4xRequestTag.getValue().getObject());
}
final PlcWriteRequest apiWriteRequest = builder.build();
// Execute the query
// (It has to be synchronously when working with the connection cache)
final PlcWriteResponse apiWriteResponse = apiWriteRequest.execute().get();
// Create the response.
List<Plc4xTagResponse> plc4xTags =
new ArrayList<>(apiWriteResponse.getTagNames().size());
for (Plc4xTagValueRequest plc4xRequestTag : plc4xWriteRequest.getTags()) {
final PlcResponseCode apiResponseCode =
apiWriteResponse.getResponseCode(plc4xRequestTag.getTag().getName());
Plc4xResponseCode resCode;
if(apiResponseCode == PlcResponseCode.OK) {
resCode = Plc4xResponseCode.OK;
} else {
resCode = Plc4xResponseCode.INVALID_ADDRESS;
}
plc4xTags.add(new Plc4xTagResponse(plc4xRequestTag.getTag(), resCode));
}
Plc4xWriteResponse plc4xWriteResponse = new Plc4xWriteResponse(
plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
Plc4xResponseCode.OK, plc4xTags);
// Send the response.
ctx.writeAndFlush(plc4xWriteResponse);
} catch (Exception e) {
logger.error("Error executing request", e);
Plc4xWriteResponse response = new Plc4xWriteResponse(
plc4xWriteRequest.getRequestId(), plc4xWriteRequest.getConnectionId(),
Plc4xResponseCode.INVALID_ADDRESS, Collections.emptyList());
ctx.writeAndFlush(response);
}
break;
}
}
}