Как я могу разобрать JSON из буфера nrf24? - PullRequest
0 голосов
/ 05 февраля 2019

Я отправляю действительный объект JSON, созданный с помощью ArduinoJSON, в RaspberryPi, выполняющий node.js с библиотекой https://github.com/natevw/node-nrf по радиоканалу nrf24.Сервер node.js получает данные вроде бы без проблем.Но по какой-то причине я не могу JSON.parse () объект (или буфер?) Без получения SyntaxError: Unexpected token in JSON at position ...

По какой-то причине библиотека node-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);
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Скорее всего, у вас есть NUL-символы в конце строки.JSON.parse откажется анализировать его.

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

Uncaught SyntaxError: Неожиданный токен & # 0;в JSON в позиции 26

Если вы удалите символы NUL, синтаксический анализ завершится успешно:

let obj = '[{"key":"a1","value":150}]\x00\x00\x00\x00\x00\x00';
obj = obj.replace(/\0/g, "");
JSON.parse(obj);
0 голосов
/ 05 февраля 2019

Разобрать «данные буфера» в «строку», например:

rx.on('data', d => {
    try {
        let obj = d.toString();
        console.log(obj);
        obj = JSON.parse(obj);
        console.log(obj);
    } catch (err) {
        console.error(err)
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...