Skip to content

Commit a1d280d

Browse files
committed
S7 working with new sdk
1 parent d2e56d9 commit a1d280d

File tree

7 files changed

+88
-121
lines changed

7 files changed

+88
-121
lines changed

gradle/libs.versions.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ javax-annotation-api = { module = "javax.annotation:javax.annotation-api", versi
9595
jaxb-impl = { module = "com.sun.xml.bind:jaxb-impl", version.ref = "jaxb" }
9696
jctools = { module = "org.jctools:jctools-core", version.ref = "jctools" }
9797
jose4j = { module = "org.bitbucket.b_c:jose4j", version.ref = "jose4j" }
98-
jsonSchemaInferrer = { module = "com.github.saasquatch:json-schema-inferrer", version.ref = "jsonSchemaInferrer" }
9998
jsonSchemaValidator = { module = "com.networknt:json-schema-validator", version.ref = "jsonSchemaValidator" }
10099
julToSlf4j = { module = "org.slf4j:jul-to-slf4j", version.ref = "slf4j" }
101100
junit = { module = "junit:junit", version.ref = "junit" }

hivemq-edge/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ repositories {
115115
}
116116
filter {
117117
includeGroup("com.github.simon622.mqtt-sn")
118-
includeGroup("com.github.saasquatch")
119118
}
120119
}
121120
}

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/S7ProtocolAdapterInformation.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
import com.hivemq.adapter.sdk.api.ProtocolAdapterCategory;
2020
import com.hivemq.adapter.sdk.api.ProtocolAdapterInformation;
2121
import com.hivemq.adapter.sdk.api.ProtocolAdapterTag;
22-
import com.hivemq.adapter.sdk.api.config.ProtocolAdapterConfig;
2322
import com.hivemq.adapter.sdk.api.config.ProtocolSpecificAdapterConfig;
2423
import com.hivemq.adapter.sdk.api.tag.Tag;
2524
import com.hivemq.edge.adapters.s7.config.S7AdapterConfig;

modules/hivemq-edge-module-s7/src/main/java/com/hivemq/edge/adapters/s7/config/S7AdapterConfig.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public class S7AdapterConfig implements ProtocolSpecificAdapterConfig {
3939
public static final String PROPERTY_REMOTE_RACK = "remoteRack";
4040
public static final String PROPERTY_REMOTE_SLOT = "remoteSlot";
4141
public static final String PROPERTY_PDU_LENGTH = "pduLength";
42-
public static final String PROPERTY_S_7_TO_MQTT_MAPPINGS = "s7ToMqttMappings";
42+
public static final String PROPERTY_S_7_TO_MQTT = "s7ToMqtt";
4343

4444
public enum ControllerType {
4545
S7_200,
@@ -89,7 +89,7 @@ public enum ControllerType {
8989
description = "")
9090
private final Integer pduLength;
9191

92-
@JsonProperty(value = PROPERTY_S_7_TO_MQTT_MAPPINGS, required = true)
92+
@JsonProperty(value = PROPERTY_S_7_TO_MQTT, required = true)
9393
@ModuleConfigField(title = "S7 To MQTT Config",
9494
description = "The configuration for a data stream from S7 to MQTT",
9595
required = true)
@@ -104,7 +104,7 @@ public S7AdapterConfig(
104104
@JsonProperty(value = PROPERTY_REMOTE_RACK) final @Nullable Integer remoteRack,
105105
@JsonProperty(value = PROPERTY_REMOTE_SLOT) final @Nullable Integer remoteSlot,
106106
@JsonProperty(value = PROPERTY_PDU_LENGTH) final @Nullable Integer pduLength,
107-
@JsonProperty(value = PROPERTY_S_7_TO_MQTT_MAPPINGS, required = true) final @NotNull S7ToMqttConfig s7ToMqttConfig) {
107+
@JsonProperty(value = PROPERTY_S_7_TO_MQTT, required = true) final @NotNull S7ToMqttConfig s7ToMqttConfig) {
108108
this.host = host;
109109
this.controllerType = controllerType;
110110
this.port = port;

modules/hivemq-edge-module-s7/src/test/java/com/hivemq/edge/adapters/s7/config/S7AdapterConfigTest.java

Lines changed: 50 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,27 @@
11
package com.hivemq.edge.adapters.s7.config;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4-
import com.hivemq.adapter.sdk.api.config.MqttUserProperty;
54
import com.hivemq.adapter.sdk.api.factories.ProtocolAdapterFactoryInput;
65
import com.hivemq.adapter.sdk.api.tag.Tag;
76
import com.hivemq.configuration.entity.HiveMQConfigEntity;
87
import com.hivemq.configuration.entity.adapter.ProtocolAdapterEntity;
98
import com.hivemq.configuration.reader.ConfigFileReaderWriter;
109
import com.hivemq.configuration.reader.ConfigurationFile;
1110
import com.hivemq.edge.adapters.s7.S7ProtocolAdapterFactory;
12-
import com.hivemq.protocols.AdapterConfigAndTags;
11+
import com.hivemq.protocols.ProtocolAdapterConfig;
12+
import com.hivemq.protocols.ProtocolAdapterConfigConverter;
13+
import com.hivemq.protocols.ProtocolAdapterFactoryManager;
1314
import org.jetbrains.annotations.NotNull;
1415
import org.junit.jupiter.api.Test;
1516

1617
import java.io.File;
18+
import java.net.URISyntaxException;
1719
import java.net.URL;
1820
import java.nio.file.Path;
1921
import java.util.List;
2022
import java.util.Map;
23+
import java.util.Optional;
2124

22-
import static com.hivemq.adapter.sdk.api.config.MessageHandlingOptions.MQTTMessagePerSubscription;
23-
import static com.hivemq.adapter.sdk.api.config.MessageHandlingOptions.MQTTMessagePerTag;
24-
import static com.hivemq.edge.adapters.s7.S7ProtocolAdapterInformation.PROTOCOL_ID;
2525
import static com.hivemq.protocols.ProtocolAdapterUtils.createProtocolAdapterMapper;
2626
import static org.assertj.core.api.Assertions.assertThat;
2727
import static org.mockito.Mockito.mock;
@@ -34,51 +34,21 @@ class S7AdapterConfigTest {
3434
@Test
3535
public void convertConfigObject_fullConfig_valid() throws Exception {
3636
final URL resource = getClass().getResource("/s7-adapter-full-config.xml");
37-
final File path = Path.of(resource.toURI()).toFile();
38-
39-
final HiveMQConfigEntity configEntity = loadConfig(path);
40-
final ProtocolAdapterEntity adapter = configEntity.getProtocolAdapterConfig().get(0);
41-
42-
final ProtocolAdapterFactoryInput mockInput = mock(ProtocolAdapterFactoryInput.class);
43-
when(mockInput.isWritingEnabled()).thenReturn(false);
44-
final S7ProtocolAdapterFactory s7ProtocolAdapterFactory = new S7ProtocolAdapterFactory(mockInput);
4537

46-
final AdapterConfigAndTags adapterConfigAndTags =
47-
AdapterConfigAndTags.fromAdapterConfigMap((Map<String, Object>) adapters.get(PROTOCOL_ID),
48-
false,
49-
mapper,
50-
s7ProtocolAdapterFactory);
38+
final ProtocolAdapterConfig protocolAdapterConfig = getProtocolAdapterConfig(resource);
5139

52-
final S7AdapterConfig config = (S7AdapterConfig) adapterConfigAndTags.getAdapterConfig();
40+
final S7AdapterConfig config = (S7AdapterConfig) protocolAdapterConfig.getAdapterConfig();
41+
assertThat(protocolAdapterConfig.missingTags())
42+
.isEmpty();
5343

54-
assertThat(config.getId()).isEqualTo("my-s7-protocol-adapter");
5544
assertThat(config.getPort()).isEqualTo(1234);
5645
assertThat(config.getHost()).isEqualTo("my.s7-server.com");
5746
assertThat(config.getControllerType()).isEqualTo(S7AdapterConfig.ControllerType.S7_400);
58-
assertThat(config.getPollingIntervalMillis()).isEqualTo(10);
59-
assertThat(config.getMaxPollingErrorsBeforeRemoval()).isEqualTo(9);
60-
assertThat(config.getPublishChangedDataOnly()).isFalse();
61-
assertThat(config.getS7ToMqttMappings()).satisfiesExactly(mapping -> {
62-
assertThat(mapping.getMqttTopic()).isEqualTo("my/topic");
63-
assertThat(mapping.getMqttQos()).isEqualTo(1);
64-
assertThat(mapping.getMessageHandlingOptions()).isEqualTo(MQTTMessagePerSubscription);
65-
assertThat(mapping.getIncludeTimestamp()).isTrue();
66-
assertThat(mapping.getIncludeTagNames()).isTrue();
67-
assertThat(mapping.getTagName()).isEqualTo("tag-name");
68-
69-
}, mapping -> {
70-
assertThat(mapping.getMqttTopic()).isEqualTo("my/topic/2");
71-
assertThat(mapping.getMqttQos()).isEqualTo(1);
72-
assertThat(mapping.getMessageHandlingOptions()).isEqualTo(MQTTMessagePerSubscription);
73-
assertThat(mapping.getIncludeTimestamp()).isTrue();
74-
assertThat(mapping.getIncludeTagNames()).isTrue();
75-
assertThat(mapping.getTagName()).isEqualTo("tag-name");
76-
});
47+
assertThat(config.getS7ToMqttConfig().getPollingIntervalMillis()).isEqualTo(10);
48+
assertThat(config.getS7ToMqttConfig().getMaxPollingErrorsBeforeRemoval()).isEqualTo(9);
49+
assertThat(config.getS7ToMqttConfig().getPublishChangedDataOnly()).isFalse();
7750

78-
79-
assertThat(adapterConfigAndTags.missingTags()).isEmpty();
80-
81-
assertThat(adapterConfigAndTags.getTags())
51+
assertThat(protocolAdapterConfig.getTags())
8252
.allSatisfy(t -> {
8353
assertThat(t)
8454
.isInstanceOf(S7Tag.class)
@@ -90,44 +60,21 @@ public void convertConfigObject_fullConfig_valid() throws Exception {
9060
@Test
9161
public void convertConfigObject_defaults_valid() throws Exception {
9262
final URL resource = getClass().getResource("/s7-adapter-minimal-config.xml");
93-
final File path = Path.of(resource.toURI()).toFile();
94-
95-
final HiveMQConfigEntity configEntity = loadConfig(path);
96-
final Map<String, Object> adapters = configEntity.getProtocolAdapterConfig();
97-
98-
final ProtocolAdapterFactoryInput mockInput = mock(ProtocolAdapterFactoryInput.class);
99-
when(mockInput.isWritingEnabled()).thenReturn(false);
100-
final S7ProtocolAdapterFactory s7ProtocolAdapterFactory = new S7ProtocolAdapterFactory(mockInput);
101-
102-
final AdapterConfigAndTags adapterConfigAndTags =
103-
AdapterConfigAndTags.fromAdapterConfigMap((Map<String, Object>) adapters.get(PROTOCOL_ID),
104-
false,
105-
mapper,
106-
s7ProtocolAdapterFactory);
63+
final ProtocolAdapterConfig protocolAdapterConfig = getProtocolAdapterConfig(resource);
10764

108-
final S7AdapterConfig config = (S7AdapterConfig) adapterConfigAndTags.getAdapterConfig();
65+
final S7AdapterConfig config = (S7AdapterConfig) protocolAdapterConfig.getAdapterConfig();
66+
assertThat(protocolAdapterConfig.missingTags())
67+
.isEmpty();
10968

11069
assertThat(config).isNotNull();
111-
assertThat(config.getId()).isEqualTo("my-s7-protocol-adapter");
11270
assertThat(config.getPort()).isEqualTo(1234);
11371
assertThat(config.getHost()).isEqualTo("my.s7-server.com");
11472
assertThat(config.getControllerType()).isEqualTo(S7AdapterConfig.ControllerType.S7_400);
115-
assertThat(config.getPollingIntervalMillis()).isEqualTo(1000);
116-
assertThat(config.getMaxPollingErrorsBeforeRemoval()).isEqualTo(10);
117-
assertThat(config.getPublishChangedDataOnly()).isTrue();
118-
assertThat(config.getS7ToMqttMappings()).satisfiesExactly(mapping -> {
119-
assertThat(mapping.getMqttTopic()).isEqualTo("my/topic");
120-
assertThat(mapping.getMqttQos()).isEqualTo(0);
121-
assertThat(mapping.getMessageHandlingOptions()).isEqualTo(MQTTMessagePerTag);
122-
assertThat(mapping.getIncludeTimestamp()).isTrue();
123-
assertThat(mapping.getIncludeTagNames()).isFalse();
124-
assertThat(mapping.getTagName()).isEqualTo("tag-name");
125-
});
126-
73+
assertThat(config.getS7ToMqttConfig().getPollingIntervalMillis()).isEqualTo(1000);
74+
assertThat(config.getS7ToMqttConfig().getMaxPollingErrorsBeforeRemoval()).isEqualTo(10);
75+
assertThat(config.getS7ToMqttConfig().getPublishChangedDataOnly()).isTrue();
12776

128-
assertThat(adapterConfigAndTags.missingTags()).isEmpty();
129-
130-
assertThat(adapterConfigAndTags.getTags())
77+
assertThat(protocolAdapterConfig.getTags())
13178
.allSatisfy(t -> {
13279
assertThat(t)
13380
.isInstanceOf(S7Tag.class)
@@ -138,26 +85,21 @@ public void convertConfigObject_defaults_valid() throws Exception {
13885

13986
@Test
14087
public void unconvertConfigObject_full_valid() {
141-
final S7ToMqttConfig pollingContext = new S7ToMqttConfig("my/destination",
88+
final S7ToMqttConfig pollingContext = new S7ToMqttConfig(
89+
3000,
14290
1,
143-
MQTTMessagePerSubscription,
144-
false,
145-
true,
146-
"tag-name",
147-
List.of(new MqttUserProperty("my-name", "my-value"))
91+
false
14892
);
14993

150-
final S7AdapterConfig s7AdapterConfig = new S7AdapterConfig("my-s7-adapter",
94+
final S7AdapterConfig s7AdapterConfig = new S7AdapterConfig(
95+
"my-s7-adapter",
15196
14,
15297
"my.host.com",
15398
S7AdapterConfig.ControllerType.S7_1500,
15499
1,
155100
2,
156101
3,
157-
4,
158-
5,
159-
false,
160-
List.of(pollingContext));
102+
pollingContext);
161103

162104
final ProtocolAdapterFactoryInput mockInput = mock(ProtocolAdapterFactoryInput.class);
163105
when(mockInput.isWritingEnabled()).thenReturn(false);
@@ -191,6 +133,29 @@ public void unconvertConfigObject_full_valid() {
191133
});
192134
}
193135

136+
private @NotNull ProtocolAdapterConfig getProtocolAdapterConfig(final @NotNull URL resource) throws
137+
URISyntaxException {
138+
final File path = Path.of(resource.toURI()).toFile();
139+
140+
final HiveMQConfigEntity configEntity = loadConfig(path);
141+
final ProtocolAdapterEntity adapterEntity = configEntity.getProtocolAdapterConfig().get(0);
142+
143+
final ProtocolAdapterConfigConverter converter = createConverter();
144+
145+
return converter.fromEntity(adapterEntity);
146+
}
147+
148+
private @NotNull ProtocolAdapterConfigConverter createConverter() {
149+
final ProtocolAdapterFactoryInput mockInput = mock(ProtocolAdapterFactoryInput.class);
150+
when(mockInput.isWritingEnabled()).thenReturn(true);
151+
152+
S7ProtocolAdapterFactory protocolAdapterFactory = new S7ProtocolAdapterFactory(mockInput);
153+
ProtocolAdapterFactoryManager manager = mock(ProtocolAdapterFactoryManager.class);
154+
when(manager.get("s7-new")).thenReturn(Optional.of(protocolAdapterFactory));
155+
ProtocolAdapterConfigConverter converter = new ProtocolAdapterConfigConverter(manager, mapper);
156+
return converter;
157+
}
158+
194159
private @NotNull HiveMQConfigEntity loadConfig(final @NotNull File configFile) {
195160
final ConfigFileReaderWriter readerWriter = new ConfigFileReaderWriter(new ConfigurationFile(configFile),
196161
mock(),

modules/hivemq-edge-module-s7/src/test/resources/s7-adapter-full-config.xml

Lines changed: 29 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,23 @@
1717
-->
1818
<hivemq>
1919
<protocol-adapters>
20-
<s7-new>
20+
<protocol-adapter>
21+
<protocolId>s7-new</protocolId>
22+
<adapterId>my-s7-protocol-adapter</adapterId>
2123
<config>
22-
<id>my-s7-protocol-adapter</id>
23-
<host>my.s7-server.com</host>
24-
<port>1234</port>
25-
<controllerType>S7_400</controllerType>
26-
<remoteRack>1</remoteRack>
27-
<remoteSlot>3</remoteSlot>2>
28-
<pollingIntervalMillis>10</pollingIntervalMillis>
29-
<maxPollingErrorsBeforeRemoval>9</maxPollingErrorsBeforeRemoval>
30-
<publishChangedDataOnly>false</publishChangedDataOnly>
31-
<s7ToMqttMappings>
32-
<s7ToMqttMapping>
33-
<mqttTopic>my/topic</mqttTopic>
34-
<mqttQos>1</mqttQos>
24+
<controllerType>S7_400</controllerType>
25+
<remoteRack>1</remoteRack>
26+
<remoteSlot>3</remoteSlot>
27+
<s7ToMqtt>
28+
<pollingIntervalMillis>10</pollingIntervalMillis>
29+
<maxPollingErrorsBeforeRemoval>9</maxPollingErrorsBeforeRemoval>
30+
<publishChangedDataOnly>false</publishChangedDataOnly>
31+
</s7ToMqtt>
32+
</config>
33+
<northboundMappings>
34+
<northboundMapping>
35+
<topic>my/topic</topic>
36+
<maxQos>1</maxQos>
3537
<includeTagNames>true</includeTagNames>
3638
<includeTimestamp>true</includeTimestamp>
3739
<messageHandlingOptions>MQTTMessagePerSubscription</messageHandlingOptions>
@@ -46,10 +48,10 @@
4648
<value>value2</value>
4749
</mqttUserProperty>
4850
</mqttUserProperties>
49-
</s7ToMqttMapping>
50-
<s7ToMqttMapping>
51-
<mqttTopic>my/topic/2</mqttTopic>
52-
<mqttQos>1</mqttQos>
51+
</northboundMapping>
52+
<northboundMapping>
53+
<topic>my/topic/2</topic>
54+
<maxQos>1</maxQos>
5355
<includeTagNames>true</includeTagNames>
5456
<includeTimestamp>true</includeTimestamp>
5557
<messageHandlingOptions>MQTTMessagePerSubscription</messageHandlingOptions>
@@ -64,19 +66,16 @@
6466
<value>value2</value>
6567
</mqttUserProperty>
6668
</mqttUserProperties>
67-
</s7ToMqttMapping>
68-
</s7ToMqttMappings>
69-
</config>
69+
</northboundMapping>
70+
</northboundMappings>
7071
<tags>
71-
<tag>
72-
<name>tag-name</name>
73-
<description>description</description>
74-
<definition>
75-
<address>%IB1</address>
76-
<dataType>INT32</dataType>
77-
</definition>
78-
</tag>
72+
<name>tag-name</name>
73+
<description>description</description>
74+
<definition>
75+
<address>%IB1</address>
76+
<dataType>INT32</dataType>
77+
</definition>
7978
</tags>
80-
</s7-new>
79+
</protocol-adapter>
8180
</protocol-adapters>
8281
</hivemq>

modules/hivemq-edge-module-s7/src/test/resources/s7-adapter-minimal-config.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@
3030
</s7ToMqttMapping>
3131
</s7ToMqttMappings>
3232
</config>
33+
<northboundMappings>
34+
<northboundMapping>
35+
<topic>my/topic</topic>
36+
<tagName>tag-name</tagName>
37+
</northboundMapping>
38+
</northboundMappings>
3339
<tags>
3440
<tag>
3541
<name>tag-name</name>

0 commit comments

Comments
 (0)