Mooi, het werkt!
Beetje technisch dit verhaal maar vind het handig dit even vast te leggen (en wie weet gaan er meer lezers met zo'n PiCAN board aan de slag - kost < eur 40).
Énige bash command line om de JSON TCP server uit het CANboat project te starten is:
$ ./listfile.exe PlusPlay.txt | pv -q -L 100k | grep "F10D\|F112\|F119\|F503\|F802\|FD02" | candump2analyzer| analyzer -json | n2kd
Omdat ik de Pi nu niet bij me heb simuleer ik met een eerder opgenomen logfile onder Win64 en Cygwin, een soort Linux interpreter (weet dat ook niet precies).
Op de Pi zélf kun je zo'n met
candump en timestamps opgenomen logfile real-time afspelen naar een virtuele (of echte) CAN bus dmv
canplayer. Je leest deze vcan0 dan weer uit met
candump om daar dan iets mee te gaan doen. Dát stuk krijg ik niet gecompileerd onder Cygwin; de CANboat tools wél.
Real-time afspelen lukt dus niet (nu). In plaats daarvan speel ik de (zonder timestamps) opgenomen logfile af met gelimiteerde snelheid, zodat de resulterende datastroom ongeveer net zo snel is als aan boord.
In de command line hierboven:
- listfile.exe is een klein C-programmatje wat niets anders doet dan de logfile (die maar 10 min lang is) eindeloos herhalen, zoals cat dat maar één keer doet
- PlusPlay.txt is de logfile, direct van de bus, zonder timestamps
- De eerste pijp naar pv (pipe viewer) limiteert de snelheid
- De tweede pijp naar grep (goede tip Erwin!) laat alleen de PGN's door die PolarPlot nodig heeft. Je ziet hier de hexadecimale weergave van die PGN's, zoals die ook op de bus staan
- candump2analyzer maakt de stream al iets leesbaarder. Je herkent o.a. de PGN's (nu decimaal), de source en destination device-ID's (255 is een broadcast, dus niet gericht naar één specifiek apparaat zoals bv de autopilot controller dat wél doet naar de AP computer).
- analyzer zet het netjes in een voor parsing geschikt JSON formaat om
- tenslotte verzorgt n2kd de TCP server
(die óók naar NMEA0183 vertaalt en uitzend op een andere poort, maar dat stuk is nog in ontwikkeling (alleen de basis-zinnen worden ondersteund. Je kunt op deze manier dus ook een hele snelle N2K naar NMEA0183 converter/server opzetten zodat je bv iSailor kunt voeden met snelle N2K data.)
In PolarPlot (Free Pascal) werkt het parsen van de JSON data uiterst eenvoudig. Hier bv de heading-data:
json := TTCPBlockSocket1.RecvTerminated(5000,#10);
J:=GetJSON(json);
PGN := J.FindPath('pgn').AsInteger;
if PGN = 127250 then
begin
HDG_rd := J.FindPath('fields.Heading').AsFloat;
end;
Ter illustratie hieronder hoe de data eruitziet door de verschillende pipes heen:
Ruwe data op bus of na afspelen van een logfile:can0 09F10D00 [8] FF FF FF 7F E9 03 FF FF
can0 09FD020A [8] 00 BD 00 1C 73 FA FF FF
can0 09F8027F [8] 00 FC F5 EE 02 00 FF FF
can0 09F11201 [8] FF BB 9D FF 7F FF 7F FD
can0 09F8027F [8] 00 FC F5 EE 02 00 FF FF
Ná candump2analyzer:2016-06-29-11:23:58.000,2,130306,0,255,8,ff,ff,ff,ff,ff,f8,ff,ff
2016-06-29-11:23:58.000,2,129026,127,255,8,00,fc,f5,ee,00,00,ff,ff
2016-06-29-11:23:58.000,2,127250,1,255,8,ff,25,9e,ff,7f,ff,7f,fd
2016-06-29-11:23:58.000,2,130306,0,255,8,ff,ff,ff,ff,ff,fb,ff,ff
2016-06-29-11:23:58.000,2,127250,1,255,8,ff,26,9e,ff,7f,ff,7f,fd
Ná analyzer in JSON formaat:{"timestamp":"2016-06-29-11:24:35.000","prio":2,"src":0,"dst":255,"pgn":127245,"description":"Rudder","fields":{"Position":5.7}}
{"timestamp":"2016-06-29-11:24:35.000","prio":2,"src":10,"dst":255,"pgn":130306,"description":"Wind Data","fields":{"SID":0,"Wind Speed":1.89,"Wind Angle":195.4,"Reference":"Apparent"}}
{"timestamp":"2016-06-29-11:24:35.000","prio":2,"src":127,"dst":255,"pgn":129026,"description":"COG & SOG, Rapid Update","fields":{"SID":0,"COG Reference":"True","COG":350.5,"SOG":0.00}}
{"timestamp":"2016-06-29-11:24:35.000","prio":2,"src":1,"dst":255,"pgn":127250,"description":"Vessel Heading","fields":{"Heading":231.5,"Reference":"Magnetic"}}
Nu PolarPlot nog wat verder poetsen en die onhandige toggles eruit halen...
Voor mensen die ook met de PiCAN2 interface werken is PolarPlot evt beschikbaar om mee (mee!) te testen. Het geheel is nu niet meer afhankelijk van welk merk N2K apparatuur je aan boord gebruikt. PolarPlot is een autonome CAN client geworden in zekere zin. Grafische uitvoer kan ook naar een scherm aan de Pi of een VNC sessie...