Нет MessageMappingProcessor в Ditto
Я получил ошибку незнакомца, хотя я следую рекомендациям в том же примере.
Осьминог может публиковать сообщения в MQTT. Я вижу, как они используют MQTT-клиент.
WebApp показывает установленное соединение и отправляет отправку событий. Я могу изменить значения через "my.test.octopus"
панель. Но когда я запрашиваю его с помощью API, я могу получить только свои значения из веб-приложения, но никогда не получаю значения от осьминога.
Я проверил журналы подключения, кажется, проблема с отображением... Я использовал следующее для создания отображения при создании подключения:
"incomingScript": "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);
}"
Спасибо за помощь
Обновить
Ошибка проявляется в следующей строке журнала:
Смотрите следующую инструкцию журнала:
"The message mapper configuration failed due to: unterminated regular expression literal (incomingScript#1) - in line/column #1/472," -- ""incomingScript": "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); }"
1 ответ
Ваш сценарий сопоставления, кажется, работает правильно. Я создал для него модульный тест, используя тестирование отображения полезной нагрузки из тех же примеров.
Этот тест выглядит следующим образом:
@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();
}