Кажется, ваш скрипт сопоставления работает правильно. Я создал для него модульный тест, используя тестирование отображения полезной нагрузки из тех же примеров .
Этот тест выглядит следующим образом:
@Test
public void incomingBytePayloadMapping() throws IOException {
final Resource incomingMappingFunction = new Resource("incomingScript.js");
final PayloadMappingFunction underTest = PayloadMappingFunction.fromJavaScript(incomingMappingFunction.getContent());
final Map<String, String> headers = new HashMap<>();
headers.put("content-type", ContentTypes.APPLICATION_OCTET_STREAM.toString());
headers.put("device_id", "the-thing-id");
final byte[] bytePayload = "{\"thingId\":\"my.test.thing\",\"temp\":25.6,\"alt\":11}".getBytes();
final ExternalMessage message = ExternalMessageFactory.newExternalMessageBuilder(headers)
.withBytes(bytePayload)
.build();
final Resource expectedAdaptableJsonResource = new Resource("expectedAdaptable.json");
final JsonObject expectedAdaptableJson = JsonFactory.newObject(expectedAdaptableJsonResource.getContent());
final Adaptable expectedAdaptable = ProtocolFactory
.jsonifiableAdaptableFromJson(expectedAdaptableJson)
.setDittoHeaders(DittoHeaders.of(headers));
PayloadMappingTestCase.assertThat(message)
.mappedByJavascriptPayloadMappingFunction(underTest)
.isEqualTo(expectedAdaptable)
.verify();
}
incomingScript.js
function mapToDittoProtocolMsg(
headers,
textPayload,
bytePayload,
contentType) {
const jsonString = String.fromCharCode.apply(null, new Uint8Array(bytePayload));
const jsonData = JSON.parse(jsonString);
const thingId = jsonData.thingId;
const value = {
temp_sensor: {
properties: {
value: jsonData.temp
}
},
altitude: {
properties: {
value: jsonData.alt
}
}
};
return Ditto.buildDittoProtocolMsg('my.test', thingId, 'things', 'twin', 'commands', 'modify', '/features', headers,
value);
}
expectedAdaptable.json
{
"topic": "my.test/my.test.thing/things/twin/commands/modify",
"headers": {},
"path": "/features",
"value": {
"temp_sensor": {
"properties": {
"value": 25.6
}
},
"altitude": {
"properties": {
"value": 11
}
}
}
}
Пока что это похоже на работу, но в этом тесте я предполагаю следующий входящий bytePayload:
final byte[] bytePayload = "{\"thingId\":\"my.test.thing\",\"temp\":25.6,\"alt\":11}".getBytes();
Не могли бы вы как-нибудь проверить, что байт полезной нагрузки, которую посылает ваш осьминог, выглядит правильно? Осьминог действительно отправляет полезную нагрузку байта или текстовую полезную нагрузку (application / json)?
обновление
Согласно комментарию Боб Су осьминог отправляет текстовую полезную нагрузку.
Чтобы отобразить эту полезную нагрузку, вы фактически должны использовать текстовую полезную нагрузку вместо байтной полезной нагрузки. Далее вы увидите обновленный входящий скрипт.
incomingScript.js
function mapToDittoProtocolMsg(
headers,
textPayload,
bytePayload,
contentType) {
var jsonData = JSON.parse(textPayload);
const thingId = jsonData.thingId;
const value = {
temp_sensor: {
properties: {
value: jsonData.temp
}
},
altitude: {
properties: {
value: jsonData.alt
}
}
};
return Ditto.buildDittoProtocolMsg('my.test', thingId, 'things', 'twin', 'commands', 'modify', '/features', headers,
value);
}
Тест может быть адаптирован к:
@Test
public void incomingTextPayloadMapping() throws IOException {
final Resource incomingMappingFunction = new Resource("incomingScript.js");
final PayloadMappingFunction underTest = PayloadMappingFunction.fromJavaScript(incomingMappingFunction.getContent());
final Map<String, String> headers = new HashMap<>();
headers.put("content-type", ContentTypes.APPLICATION_JSON.toString());
headers.put("device_id", "the-thing-id");
final ExternalMessage message = ExternalMessageFactory.newExternalMessageBuilder(headers)
.withText("{\"thingId\":\"my.test.thing\",\"temp\":25.6,\"alt\":11}")
.build();
final Resource expectedAdaptableJsonResource = new Resource("expectedAdaptable.json");
final JsonObject expectedAdaptableJson = JsonFactory.newObject(expectedAdaptableJsonResource.getContent());
final Adaptable expectedAdaptable = ProtocolFactory
.jsonifiableAdaptableFromJson(expectedAdaptableJson)
.setDittoHeaders(DittoHeaders.of(headers));
PayloadMappingTestCase.assertThat(message)
.mappedByJavascriptPayloadMappingFunction(underTest)
.isEqualTo(expectedAdaptable)
.verify();
}