AWS IoT-Core 如何在 JSON 值中正确发布实际的新行,而不是 \r\n 或 \n
AWS IoT-Core how to properly publish a actual new line in a JSON value, not \r\n or \n
我有一个 lambda (nodeJs),它读取 S3 存储桶中的文件 (.ref) 并将其内容发布到 AWS IoT-Core 代理中的主题中。
该文件包含如下内容(50 行):
model:type
aa;tp1
bb;tpz
cc;tpf
dd;tp1
代码必须删除第一行并检索剩余的 50 行。这是代码
async function gerRef (BUCKET_NAME) {
const refFile = version + '/file.ref'
const ref = await getObject(FIRMWARE_BUCKET_NAME, refFile)
//Get the file content
const refString = ref.toString('utf8')
//Slip by each line
let arrRef = refString.split('\n')
//Remove the file header
arrRef.shift()
//join the lines
let refString = arrRef.join('\n')
return refString
}
然后我得到这个结果并像这样在 AWS IoT-Core Broker 中发布:
const publishMqtt = (params) =>
new Promise((resolve, reject) =>
iotdata.publish(params, (err, res) => resolve(res)))
...
let refData = await gerRef (bucket1)
let JsonPayload = {
"attr1":"val1",
"machineConfig":`${refData}` //Maybe here is the issue
}
let params = {
topic: 'test/1',
payload: JSON.stringify(JsonPayload) //Maybe here is the issue
qos: '0'
};
await publishMqtt(params)
...
然后在代理中发布。
问题是发布的内容没有真正的 new line
。当我在经纪人中看到时,我得到以下 JSON:
{
"attr1":"val1",
"machineConfig":"aa;tp1\nbb;tpz\ncc;tpf\ndd;tp1"
}
接收此消息的机器正在等待真正的新行,如下所示:
{
"attr1":"val1",
"machineConfig":"aa;tp1
bb;tpz
cc;tpf
dd;tp1"
}
如果我只是将整个 JSON 复制并粘贴到 AWS IoT-Core 界面中,它会抱怨 JSON 解析但会作为字符串发布并且机器会接受数据 - 因为新线在那里:
简而言之,这里的重点是:
- 我们可以使用 JSON.stringify(JsonPayload) - 代理将接受
- 我不知道如何字符串化并保留实际的新行
我尝试了这些解决方案,但 none 成功了:s1, s2, s3
想知道如何实现吗?
机器所期待的是错误的。在 JSON 中,值 中的任何换行数据都必须 进行转义,而字符串中的 \n
是正确的方法。这就是收货人的期望失误了。
“真正的”换行符会导致无效的 JSON 文档,大多数解析器会断然拒绝它。
在接收端JSON解串器可以处理\n
编码字符串。如果你的接收器需要换行,它就坏了,需要修理。如果您无法修复它,那么您将致力于发送损坏的、格式错误的 JSON-ish 数据,这些数据实际上不是 JSON,您的经纪人完全有理由将其丢弃。
我有一个 lambda (nodeJs),它读取 S3 存储桶中的文件 (.ref) 并将其内容发布到 AWS IoT-Core 代理中的主题中。 该文件包含如下内容(50 行):
model:type
aa;tp1
bb;tpz
cc;tpf
dd;tp1
代码必须删除第一行并检索剩余的 50 行。这是代码
async function gerRef (BUCKET_NAME) {
const refFile = version + '/file.ref'
const ref = await getObject(FIRMWARE_BUCKET_NAME, refFile)
//Get the file content
const refString = ref.toString('utf8')
//Slip by each line
let arrRef = refString.split('\n')
//Remove the file header
arrRef.shift()
//join the lines
let refString = arrRef.join('\n')
return refString
}
然后我得到这个结果并像这样在 AWS IoT-Core Broker 中发布:
const publishMqtt = (params) =>
new Promise((resolve, reject) =>
iotdata.publish(params, (err, res) => resolve(res)))
...
let refData = await gerRef (bucket1)
let JsonPayload = {
"attr1":"val1",
"machineConfig":`${refData}` //Maybe here is the issue
}
let params = {
topic: 'test/1',
payload: JSON.stringify(JsonPayload) //Maybe here is the issue
qos: '0'
};
await publishMqtt(params)
...
然后在代理中发布。
问题是发布的内容没有真正的 new line
。当我在经纪人中看到时,我得到以下 JSON:
{
"attr1":"val1",
"machineConfig":"aa;tp1\nbb;tpz\ncc;tpf\ndd;tp1"
}
接收此消息的机器正在等待真正的新行,如下所示:
{
"attr1":"val1",
"machineConfig":"aa;tp1
bb;tpz
cc;tpf
dd;tp1"
}
如果我只是将整个 JSON 复制并粘贴到 AWS IoT-Core 界面中,它会抱怨 JSON 解析但会作为字符串发布并且机器会接受数据 - 因为新线在那里:
简而言之,这里的重点是:
- 我们可以使用 JSON.stringify(JsonPayload) - 代理将接受
- 我不知道如何字符串化并保留实际的新行
我尝试了这些解决方案,但 none 成功了:s1, s2, s3
想知道如何实现吗?
机器所期待的是错误的。在 JSON 中,值 中的任何换行数据都必须 进行转义,而字符串中的 \n
是正确的方法。这就是收货人的期望失误了。
“真正的”换行符会导致无效的 JSON 文档,大多数解析器会断然拒绝它。
在接收端JSON解串器可以处理\n
编码字符串。如果你的接收器需要换行,它就坏了,需要修理。如果您无法修复它,那么您将致力于发送损坏的、格式错误的 JSON-ish 数据,这些数据实际上不是 JSON,您的经纪人完全有理由将其丢弃。