- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
尽管我遵循同上示例中的指南,但我遇到了陌生人错误。
Octopus 可以将消息发布到 MQTT。我可以看到他们使用 MQTT 客户端。WebApp 显示连接已建立并且发送发送事件有效。我可以通过“my.test.octopus”面板更改值。但是当我使用 API 查询它时,我只能从 webapp 获取值,而从未从 octopus 获取值。
我检查了连接日志,似乎是映射问题...我在创建连接时使用了以下内容来创建映射:
"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); }"
最佳答案
您的映射脚本似乎工作正常。我使用 payload mapping testing from ditto-examples 为其创建了一个单元测试.
此测试如下所示:
@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();
您能否以某种方式验证您的 Octopus 发送的字节有效负载是否正确? Octopus 真的发送字节有效负载还是文本有效负载(application/json)?
更新
根据Bob Su的评论 Octopus 正在发送文本有效负载。为了映射此有效负载,您实际上必须使用文本有效负载而不是字节有效负载。在下面您将看到更新后的传入脚本。
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();
}
关于javascript - Ditto 中没有可用的消息映射处理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55454096/
我正在尝试在Ubuntu 18计算机上安装Eclipse Ditto,安装了Maven和OpenJDK版本“1.8.0_222”,以及Docker版本18.09.7。 运行命令时: mvn clean
尽管我遵循同上示例中的指南,但我遇到了陌生人错误。 Octopus 可以将消息发布到 MQTT。我可以看到他们使用 MQTT 客户端。WebApp 显示连接已建立并且发送发送事件有效。我可以通过“my
在eclipse-ditto mappingcontext 我放置在 incomingScript 之后: function mapToDittoProtocolMsg(headers, textPa
我想知道 OSX 上 cp 和 ditto 命令之间的确切区别是什么? 这两个命令的主要区别是什么? 最佳答案 实际上手册页中的标题描述了差异: cp - 复制文件和目录 同上 - 复制目录层次结构,
我按照本文档中解释的说明将 Apache Kafka 连接到 Eclipse Ditto。 https://www.eclipse.org/ditto/connectivity-protocol-bi
我正在尝试构建我的项目,但它没有得到构建。 我收到以下错误: Command /usr/bin/ditto failed with exit code 1 我已经清理了我的项目,但问题仍然存在。 Xc
我正在尝试从 Ditto 创建传出连接至Azure IoT hub使用 MQTT。我们负责 Ditto,而其他人(对数字孪生实时数据感兴趣)负责 Azure IoT 中心。我在连接 Azure IoT
我正在尝试归档我的 iOS 项目,但在 ditto 命令上它失败了,据说是在它编译了每个文件之后。 整个日志文件大约有 200MB,包含敏感信息,所以我不会发布它。这是失败的输出行。 Ditto /U
我是一名优秀的程序员,十分优秀!