Browse Source
Fixed RPC string params in protobuf payload type. Reverted changes from the previous fix (#4356 )
* Revert "added a fix for string value RPC params: removed redundant escaped characters"
This reverts commit 1891af54
* removed redundant escape characters for string RPC params in Proto payload
* cleanup code
pull/4372/head
ShvaykaD
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with
30 additions and
18 deletions
application/src/main/java/org/thingsboard/server/controller/RpcController.java
common/transport/mqtt/src/main/java/org/thingsboard/server/transport/mqtt/adaptors/ProtoMqttAdaptor.java
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/JsonConverter.java
common/transport/transport-api/src/main/java/org/thingsboard/server/common/transport/adaptor/ProtoConverter.java
@ -97,13 +97,9 @@ public class RpcController extends BaseController {
private DeferredResult < ResponseEntity > handleDeviceRPCRequest ( boolean oneWay , DeviceId deviceId , String requestBody ) throws ThingsboardException {
try {
JsonNode rpcRequestBody = jsonMapper . readTree ( requestBody ) ;
String requestData ;
if ( rpcRequestBody . get ( "params" ) . isTextual ( ) ) {
requestData = rpcRequestBody . get ( "params" ) . asText ( ) ;
} else {
requestData = jsonMapper . writeValueAsString ( rpcRequestBody . get ( "params" ) ) ;
}
RpcRequest cmd = new RpcRequest ( rpcRequestBody . get ( "method" ) . asText ( ) , requestData ) ;
RpcRequest cmd = new RpcRequest ( rpcRequestBody . get ( "method" ) . asText ( ) ,
jsonMapper . writeValueAsString ( rpcRequestBody . get ( "params" ) ) ) ;
if ( rpcRequestBody . has ( "timeout" ) ) {
cmd . setTimeout ( rpcRequestBody . get ( "timeout" ) . asLong ( ) ) ;
}
@ -146,7 +146,7 @@ public class ProtoMqttAdaptor implements MqttTransportAdaptor {
@Override
public Optional < MqttMessage > convertToPublish ( MqttDeviceAwareSessionContext ctx , TransportProtos . ToDeviceRpcRequestMsg rpcRequest ) {
return Optional . of ( createMqttPublishMsg ( ctx , MqttTopics . DEVICE_RPC_REQUESTS_TOPIC + rpcRequest . getRequestId ( ) , rpcRequest . toByteArray ( ) ) ) ;
return Optional . of ( createMqttPublishMsg ( ctx , MqttTopics . DEVICE_RPC_REQUESTS_TOPIC + rpcRequest . getRequestId ( ) , ProtoConverter . convertToRpcRequest ( rpcRequest ) ) ) ;
}
@Override
@ -22,7 +22,6 @@ import com.google.gson.JsonObject;
import com.google.gson.JsonParser ;
import com.google.gson.JsonPrimitive ;
import com.google.gson.JsonSyntaxException ;
import com.google.gson.stream.MalformedJsonException ;
import org.apache.commons.lang3.math.NumberUtils ;
import org.springframework.util.StringUtils ;
import org.thingsboard.server.common.data.DataConstants ;
@ -158,15 +157,7 @@ public class JsonConverter {
result . addProperty ( "id" , msg . getRequestId ( ) ) ;
}
result . addProperty ( "method" , msg . getMethodName ( ) ) ;
try {
result . add ( "params" , JSON_PARSER . parse ( msg . getParams ( ) ) ) ;
} catch ( JsonSyntaxException ex ) {
if ( ex . getCause ( ) instanceof MalformedJsonException ) {
result . addProperty ( "params" , msg . getParams ( ) ) ;
} else {
throw ex ;
}
}
result . add ( "params" , JSON_PARSER . parse ( msg . getParams ( ) ) ) ;
return result ;
}
@ -15,7 +15,9 @@
* /
package org.thingsboard.server.common.transport.adaptor ;
import com.google.gson.JsonElement ;
import com.google.gson.JsonParser ;
import com.google.gson.JsonPrimitive ;
import com.google.protobuf.InvalidProtocolBufferException ;
import lombok.extern.slf4j.Slf4j ;
import org.springframework.util.CollectionUtils ;
@ -167,4 +169,27 @@ public class ProtoConverter {
} ) ;
return kvList ;
}
public static byte [ ] convertToRpcRequest ( TransportProtos . ToDeviceRpcRequestMsg toDeviceRpcRequestMsg ) {
TransportProtos . ToDeviceRpcRequestMsg . Builder toDeviceRpcRequestMsgBuilder = toDeviceRpcRequestMsg . newBuilderForType ( ) ;
toDeviceRpcRequestMsgBuilder . mergeFrom ( toDeviceRpcRequestMsg ) ;
toDeviceRpcRequestMsgBuilder . setParams ( parseParams ( toDeviceRpcRequestMsg ) ) ;
TransportProtos . ToDeviceRpcRequestMsg result = toDeviceRpcRequestMsgBuilder . build ( ) ;
return result . toByteArray ( ) ;
}
private static String parseParams ( TransportProtos . ToDeviceRpcRequestMsg toDeviceRpcRequestMsg ) {
String params = toDeviceRpcRequestMsg . getParams ( ) ;
JsonElement jsonElementParams = JSON_PARSER . parse ( params ) ;
if ( ! jsonElementParams . isJsonPrimitive ( ) ) {
return params ;
} else {
JsonPrimitive primitiveParams = jsonElementParams . getAsJsonPrimitive ( ) ;
if ( jsonElementParams . getAsJsonPrimitive ( ) . isString ( ) ) {
return primitiveParams . getAsString ( ) ;
} else {
return params ;
}
}
}
}