JSON¶
JavaScript Object Notation (JSON - https://json.org) is een formaat om JavaScript-objecten als tekst (string) weer te geven. Dit tekstformaat gebruik je voor het uitwisselen van objecten tussen programma’s en voor het opslaan van objecten in bestanden en databases. JSON is eerste instantie ontworpen voor JavaScript, maar dit formaat kun je in bijna elke programmeertaal gebruiken.
JavaScript¶
In JavaScript kun je eenvoudig een object omzetten in JSON, of omgekeerd:
json = obj.stringify();
obj = JSON.parse(json);
Alle objecten waar obj
naar verwijst worden het JSON-resuultaat opgenomen.
Dit betekent dat een object dat (mogelijk indirect) naar zichzelf verwijst problemen oplevert.
Anders gezegd: obj
mag geen cykels bevatten.
Zie Mozilla-JSON voor een verdere uitleg van deze functies en het gebruik daarvan.
Arduino¶
Voor het gebruik van JSON in de Arduino-omgeving is een uitgebreide library beschikbaar: zie https://arduinojson.org. Deze kun je direct in de Arduino-IDE installeren, via Schets->Bibliotheek gebruiken->Bibliotheken beheren…
Notitie
Let op dat je versie 5 installeert. Als je niets opgeeft, krijg je versie 6: deze is nog niet stabiel.
In de RFM-gateway moeten we de volgende omzetting uitvoeren:
- van binair Cayenne LPP-formaat naar JSON, voor sensorgegevens;
- van JSON naar Cayenne LPP-formaat, voor actuatorgegevens.
JSON-LPP formaat¶
Zie ook: IoT-LPP formaat
Voor de IoT-knopen gebruiken wij een JSON-vorm die aansluit bij het Cayenne low-power payload (LPP)-formaat. We gebruiken deze vorm voor alle IoT-knopen, ongeacht het onderliggende radio-protocol. In enkele gevallen (RFM69, LoRa) gebruiken we het binaire LPP-formaat, om ervoor te zorgen dat pakketten niet te groot worden. (Het JSON-formaat is door het gebruik van tekst relatief omvangrijk. Voor normale internetverbindingen is dat geen probleem, maar voor sommige IoT-radio-protocollen wel.)
Het LPP-formaat beschrijft de sensor- en actuatorgegevens aan de hand van kanalen (channels). Een kanaal bevat de gegevens van een enkele sensor of actuator. Vaak zijn dit enkelvoudige gegevens, bijvoorbeeld voor een temperatuursensor. Soms zijn dit samengestelde gegevens, zoals in het geval van GPS. We identificeren een kanaal met een uniek getal. Het type van de sensor geven we aan met een standaard-identifier, bijvoorbeeld “temperatuur” of “barometer”. De waarde van de sensor bestaat een één of meer gehele getallen; in de tabel XXX staat welke eenheid hiervoor gebruikt wordt. (Door afspraken te maken voor deze eenheden, hoeven we deze niet mee te sturen met de sensorgegevens.)
Naast het LPP-formaat voor de sensorgegevens, gebruiken we de volgende verplichte velden:
nodeid: | identificatie van de node (4 hexadecimale cijfers, als string in JSON) |
---|---|
counter: | volgnummer van het bericht (16 bits getal). |
Voorbeelden:
{"nodeid": "ae02",
"counter": 43,
"0": {"temperatuur": 321},
"2": {"barometer": 10212}
}
In het geval van RFM69 zet de gateway het binaire LPP-formaat om in dit JSON-formaat (voor uplink-berichten), en omgekeerd. Voor LoRa gebeurt deze omzetting in de server en/of in NodeRed.
Links