如何可以解析JSON从nrf24缓冲区来吗?

问题描述 投票:0回答:2

我送与ArduinoJSON建造到运行与库https://github.com/natevw/node-nrf在nrf24无线链路node.js的一个树莓派一个有效的JSON对象。 Node.js的服务器接收数据看似没有问题。但由于某些原因,我不能JSON.parse()来的物体(或缓冲?)没有得到一个SyntaxError: Unexpected token in JSON at position ...

出于某种原因,节点NRF库接收数据倒退,所以我需要扭转与Array.prototype.reverse.call(d)字节的顺序,然后console.log(d.toString()),一切似乎罚款。在这种情况下,控制台得到Got data: [{"key":"a1","value":150}]。在这一点上,缓冲区的内容是这样的:Buffer 5b 7b 22 6b 65 79 22 3a 22 61 31 22 2c 22 76 61 6c 75 65 22 3a 31 35 30 7d 5d 00 00 00 00 00 00。这些是实际的32个字节,该nrf24缓冲区包含我想。

但是,当代码获取到JSON.parse()来调用,我得到SyntaxError: Unexpected token in JSON at position 26。这是我的目标数据实际上在缓冲区结束位置。

我也尝试了.toJSON()和JSON.stringify(),但实际上并不能得到适当的对象使用(即obj.key,obj.value)。这只是返回undefined性能。在我看来,当它到达物体的一端解析失败。我也试着与该消息的实际大小相匹配的缓冲区大小只是为了看看解析将成功无济于事!

我可能很缓冲区中的概念混淆了,流,管道和对象......我到底做错了什么?

我需要的想法(或修正!)

代码在node.js的接收端运行:

var nrf = NRF24.connect(spiDev, cePin, irqPin);
nrf.printDetails();
   nrf.channel(0x4c).transmitPower('PA_MIN').dataRate('1Mbps').crcBytes(2).autoRetransmit({count:15, delay:4000}).begin(function () {
    var rx = nrf.openPipe('rx', pipes[0]);
    rx.on('data', d => {
        let obj = Array.prototype.reverse.call(d);
        try {

        console.log("Got data: ", d.toString());

        console.log(obj);
        obj = JSON.parse(obj);
        console.log(obj);

        } catch (err) {
            console.error(err)
        }
     });

});

我不认为这个问题是在这里形成JSON消息。但是,以供参考,这是对的Arduino运行的代码:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <ArduinoJson.h>

const uint64_t addresses[5] = {0x65646f4e32LL,0x65646f4e31LL} ; 
RF24 radio(7,8);

char output[32];

void setup()
{
Serial.begin(115200);
radio.begin();
radio.setAutoAck(true);
radio.setDataRate(RF24_1MBPS);
radio.enableDynamicPayloads();
radio.setCRCLength(RF24_CRC_16);
radio.setChannel(0x4c);
radio.setPALevel(RF24_PA_MAX);
radio.openWritingPipe(addresses[0]);  
}

void loop()
{
const int capacity = JSON_ARRAY_SIZE(2) + 2*JSON_OBJECT_SIZE(2);
StaticJsonBuffer<capacity> jb;

JsonArray& arr = jb.createArray();
JsonObject& obj1 = jb.createObject();
obj1["key"] = "a1";
obj1["value"] = analogRead(A1);
arr.add(obj1);

arr.printTo(output);
bool ok = radio.write(&output, sizeof(output));

arr.printTo(Serial);
Serial.print(ok);

delay(1000);
}
node.js json arduino
2个回答
1
投票

很可能是因为NULL字符字符串的结尾。 JSON.parse将拒绝解析它。

let obj = '[{"key":"a1","value":150}]\x00\x00\x00\x00\x00\x00';
JSON.parse(obj);

未捕获的语法错误:在26位的JSON意外令牌

如果删除NULL字符,解析成功:

let obj = '[{"key":"a1","value":150}]\x00\x00\x00\x00\x00\x00';
obj = obj.replace(/\0/g, "");
JSON.parse(obj);

0
投票

解析“缓冲数据”到像“字符串”:

rx.on('data', d => {
    try {
        let obj = d.toString();
        console.log(obj);
        obj = JSON.parse(obj);
        console.log(obj);
    } catch (err) {
        console.error(err)
    }
});
© www.soinside.com 2019 - 2024. All rights reserved.