Commit 3b74a806bc6c23d7319e561d7409fca1325a85c6
Committed by
GitHub
1 parent
b34198f3
RPC functionality refactoring for SNMP (#4492)
* Refactor RPC functionality for SNMP * Refactor * SNMP response PDU mapping refactoring
Showing
4 changed files
with
53 additions
and
14 deletions
@@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.transport.snmp.SnmpMethod; | @@ -26,6 +26,7 @@ import org.thingsboard.server.common.data.transport.snmp.SnmpMethod; | ||
26 | import org.thingsboard.server.common.data.transport.snmp.config.impl.ClientAttributesQueryingSnmpCommunicationConfig; | 26 | import org.thingsboard.server.common.data.transport.snmp.config.impl.ClientAttributesQueryingSnmpCommunicationConfig; |
27 | import org.thingsboard.server.common.data.transport.snmp.config.impl.SharedAttributesSettingSnmpCommunicationConfig; | 27 | import org.thingsboard.server.common.data.transport.snmp.config.impl.SharedAttributesSettingSnmpCommunicationConfig; |
28 | import org.thingsboard.server.common.data.transport.snmp.config.impl.TelemetryQueryingSnmpCommunicationConfig; | 28 | import org.thingsboard.server.common.data.transport.snmp.config.impl.TelemetryQueryingSnmpCommunicationConfig; |
29 | +import org.thingsboard.server.common.data.transport.snmp.config.impl.ToDeviceRpcRequestSnmpCommunicationConfig; | ||
29 | 30 | ||
30 | import java.util.List; | 31 | import java.util.List; |
31 | 32 | ||
@@ -34,7 +35,8 @@ import java.util.List; | @@ -34,7 +35,8 @@ import java.util.List; | ||
34 | @JsonSubTypes({ | 35 | @JsonSubTypes({ |
35 | @Type(value = TelemetryQueryingSnmpCommunicationConfig.class, name = "TELEMETRY_QUERYING"), | 36 | @Type(value = TelemetryQueryingSnmpCommunicationConfig.class, name = "TELEMETRY_QUERYING"), |
36 | @Type(value = ClientAttributesQueryingSnmpCommunicationConfig.class, name = "CLIENT_ATTRIBUTES_QUERYING"), | 37 | @Type(value = ClientAttributesQueryingSnmpCommunicationConfig.class, name = "CLIENT_ATTRIBUTES_QUERYING"), |
37 | - @Type(value = SharedAttributesSettingSnmpCommunicationConfig.class, name = "SHARED_ATTRIBUTES_SETTING") | 38 | + @Type(value = SharedAttributesSettingSnmpCommunicationConfig.class, name = "SHARED_ATTRIBUTES_SETTING"), |
39 | + @Type(value = ToDeviceRpcRequestSnmpCommunicationConfig.class, name = "TO_DEVICE_RPC_REQUEST") | ||
38 | }) | 40 | }) |
39 | public interface SnmpCommunicationConfig { | 41 | public interface SnmpCommunicationConfig { |
40 | 42 |
1 | +/** | ||
2 | + * Copyright © 2016-2021 The Thingsboard Authors | ||
3 | + * | ||
4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
5 | + * you may not use this file except in compliance with the License. | ||
6 | + * You may obtain a copy of the License at | ||
7 | + * | ||
8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
9 | + * | ||
10 | + * Unless required by applicable law or agreed to in writing, software | ||
11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
13 | + * See the License for the specific language governing permissions and | ||
14 | + * limitations under the License. | ||
15 | + */ | ||
16 | +package org.thingsboard.server.common.data.transport.snmp.config.impl; | ||
17 | + | ||
18 | +import org.thingsboard.server.common.data.transport.snmp.SnmpCommunicationSpec; | ||
19 | +import org.thingsboard.server.common.data.transport.snmp.config.MultipleMappingsSnmpCommunicationConfig; | ||
20 | + | ||
21 | +public class ToDeviceRpcRequestSnmpCommunicationConfig extends MultipleMappingsSnmpCommunicationConfig { | ||
22 | + @Override | ||
23 | + public SnmpCommunicationSpec getSpec() { | ||
24 | + return SnmpCommunicationSpec.TO_DEVICE_RPC_REQUEST; | ||
25 | + } | ||
26 | +} |
@@ -151,7 +151,7 @@ public class PduService { | @@ -151,7 +151,7 @@ public class PduService { | ||
151 | .collect(Collectors.toMap(VariableBinding::getOid, VariableBinding::toValueString)); | 151 | .collect(Collectors.toMap(VariableBinding::getOid, VariableBinding::toValueString)); |
152 | } | 152 | } |
153 | 153 | ||
154 | - private void processValue(String key, DataType dataType, String value, JsonObject result) { | 154 | + public void processValue(String key, DataType dataType, String value, JsonObject result) { |
155 | switch (dataType) { | 155 | switch (dataType) { |
156 | case LONG: | 156 | case LONG: |
157 | result.addProperty(key, Long.parseLong(value)); | 157 | result.addProperty(key, Long.parseLong(value)); |
@@ -183,19 +183,28 @@ public class SnmpTransportService implements TbTransportService { | @@ -183,19 +183,28 @@ public class SnmpTransportService implements TbTransportService { | ||
183 | SnmpMethod snmpMethod = SnmpMethod.valueOf(toDeviceRpcRequestMsg.getMethodName()); | 183 | SnmpMethod snmpMethod = SnmpMethod.valueOf(toDeviceRpcRequestMsg.getMethodName()); |
184 | JsonObject params = JsonConverter.parse(toDeviceRpcRequestMsg.getParams()).getAsJsonObject(); | 184 | JsonObject params = JsonConverter.parse(toDeviceRpcRequestMsg.getParams()).getAsJsonObject(); |
185 | 185 | ||
186 | - String oid = Optional.ofNullable(params.get("oid")).map(JsonElement::getAsString).orElse(null); | 186 | + String key = Optional.ofNullable(params.get("key")).map(JsonElement::getAsString).orElse(null); |
187 | String value = Optional.ofNullable(params.get("value")).map(JsonElement::getAsString).orElse(null); | 187 | String value = Optional.ofNullable(params.get("value")).map(JsonElement::getAsString).orElse(null); |
188 | - DataType dataType = Optional.ofNullable(params.get("dataType")).map(e -> DataType.valueOf(e.getAsString())).orElse(DataType.STRING); | ||
189 | 188 | ||
190 | - if (oid == null || oid.isEmpty()) { | ||
191 | - throw new IllegalArgumentException("OID in to-device RPC request is not specified"); | ||
192 | - } | ||
193 | if (value == null && snmpMethod == SnmpMethod.SET) { | 189 | if (value == null && snmpMethod == SnmpMethod.SET) { |
194 | throw new IllegalArgumentException("Value must be specified for SNMP method 'SET'"); | 190 | throw new IllegalArgumentException("Value must be specified for SNMP method 'SET'"); |
195 | } | 191 | } |
196 | 192 | ||
193 | + SnmpCommunicationConfig communicationConfig = sessionContext.getProfileTransportConfiguration().getCommunicationConfigs().stream() | ||
194 | + .filter(config -> config.getSpec() == SnmpCommunicationSpec.TO_DEVICE_RPC_REQUEST) | ||
195 | + .findFirst() | ||
196 | + .orElseThrow(() -> new IllegalArgumentException("No communication config found with RPC spec")); | ||
197 | + SnmpMapping snmpMapping = communicationConfig.getAllMappings().stream() | ||
198 | + .filter(mapping -> mapping.getKey().equals(key)) | ||
199 | + .findFirst() | ||
200 | + .orElseThrow(() -> new IllegalArgumentException("No SNMP mapping found in the config for specified key")); | ||
201 | + | ||
202 | + String oid = snmpMapping.getOid(); | ||
203 | + DataType dataType = snmpMapping.getDataType(); | ||
204 | + | ||
197 | PDU request = pduService.createSingleVariablePdu(sessionContext, snmpMethod, oid, value, dataType); | 205 | PDU request = pduService.createSingleVariablePdu(sessionContext, snmpMethod, oid, value, dataType); |
198 | - sendRequest(sessionContext, request, new RequestInfo(toDeviceRpcRequestMsg.getRequestId(), SnmpCommunicationSpec.TO_DEVICE_RPC_REQUEST)); | 206 | + RequestInfo requestInfo = new RequestInfo(toDeviceRpcRequestMsg.getRequestId(), communicationConfig.getSpec(), communicationConfig.getAllMappings()); |
207 | + sendRequest(sessionContext, request, requestInfo); | ||
199 | } | 208 | } |
200 | 209 | ||
201 | 210 | ||
@@ -238,7 +247,12 @@ public class SnmpTransportService implements TbTransportService { | @@ -238,7 +247,12 @@ public class SnmpTransportService implements TbTransportService { | ||
238 | responseDataMappers.put(SnmpCommunicationSpec.TO_DEVICE_RPC_REQUEST, (pdu, requestInfo) -> { | 247 | responseDataMappers.put(SnmpCommunicationSpec.TO_DEVICE_RPC_REQUEST, (pdu, requestInfo) -> { |
239 | JsonObject responseData = new JsonObject(); | 248 | JsonObject responseData = new JsonObject(); |
240 | pduService.processPdu(pdu).forEach((oid, value) -> { | 249 | pduService.processPdu(pdu).forEach((oid, value) -> { |
241 | - responseData.addProperty(oid.toDottedString(), value); | 250 | + requestInfo.getResponseMappings().stream() |
251 | + .filter(snmpMapping -> snmpMapping.getOid().equals(oid.toDottedString())) | ||
252 | + .findFirst() | ||
253 | + .ifPresent(snmpMapping -> { | ||
254 | + pduService.processValue(snmpMapping.getKey(), snmpMapping.getDataType(), value, responseData); | ||
255 | + }); | ||
242 | }); | 256 | }); |
243 | return responseData; | 257 | return responseData; |
244 | }); | 258 | }); |
@@ -314,13 +328,10 @@ public class SnmpTransportService implements TbTransportService { | @@ -314,13 +328,10 @@ public class SnmpTransportService implements TbTransportService { | ||
314 | private SnmpCommunicationSpec communicationSpec; | 328 | private SnmpCommunicationSpec communicationSpec; |
315 | private List<SnmpMapping> responseMappings; | 329 | private List<SnmpMapping> responseMappings; |
316 | 330 | ||
317 | - public RequestInfo(Integer requestId, SnmpCommunicationSpec communicationSpec) { | 331 | + public RequestInfo(Integer requestId, SnmpCommunicationSpec communicationSpec, List<SnmpMapping> responseMappings) { |
318 | this.requestId = requestId; | 332 | this.requestId = requestId; |
319 | this.communicationSpec = communicationSpec; | 333 | this.communicationSpec = communicationSpec; |
320 | - } | ||
321 | - | ||
322 | - public RequestInfo(SnmpCommunicationSpec communicationSpec) { | ||
323 | - this.communicationSpec = communicationSpec; | 334 | + this.responseMappings = responseMappings; |
324 | } | 335 | } |
325 | 336 | ||
326 | public RequestInfo(SnmpCommunicationSpec communicationSpec, List<SnmpMapping> responseMappings) { | 337 | public RequestInfo(SnmpCommunicationSpec communicationSpec, List<SnmpMapping> responseMappings) { |