Geen schokkend nieuws maar gisteren wél uit een impasse betreft connectivity geraakt.
Software is al even af (nog niet mee gevaren overigens) en haalde de NMEA0183 data (voorlopig) binnen via de TCP/IP server in de plotter. Enige "to do" was deze zelfde data niet met 1 Hz maar >10 Hz in "Polarplot" te krijgen via het websocket protocol naar de webserver (óók in de plotter). Zoals de hieronder weergegeven "Tier 2".
Als taal/IDE had ik voor Free Pascal/Lazarus gekozen vanwege het beetje ervaring wat ik daarmee had. Als ik ook nog een moderne taal (Python zou voor de hand liggen) zou moeten leren zou het lastig zijn om te concentreren op de inhoud, was mijn gedachte.
Die laatste stap heeft voor nogal wat ergernis, verspilde tijd en gedoe gezorgd. Free Pascal zou vrijwel compatibel moeten zijn met Delphi, waarbij ik de daarvoor bestaande libraries zou kunnen gebruiken. De angel zit in het woordje "vrijwel". Juist op dit webconnectivity gebied loopt deze taal behoorlijk achter; enige bruikbare zijn tyische open-source dingen die in Delphi "vrijwel" werken, maar voor Free Pascal een soort status "voor eigen risico" hebben. Anyway veel conflicten tussen tientallen compiler opties (zo'n command-line ding wat door Lazarus aangeroepen wordt), versie conflicten tussen voorgecompileerde bibliotheken en andere bibliotheken waar de websockets weer op gebouwd zijn. Uiteindelijk zelfs maar een source gekocht en een week later weer vloekend gedelete.
Via een HTML pagina met wat Javascript werkt de websocket verbinding gewoon notabene - voor m'n gevoel was ik er bijna, maar $@#^%# als die laatste stap dan niet lukt...
Een simpele search naar websockets voor Javascript of Python levert wél honderden hits op. Niet toevallig natuurlijk. Hmmm, maar helemaal opnieuw beginnen of in z'n geheel proberen over te zetten? Neeeh!
Probleem is opgelost door een kleine Javascript console applicatie te schrijven, een soort helper-taak die met NODE.JS gestart wordt. Deze taak heeft een soort proxy functie, maar ook weer niet helemaal. Taak:
- Is een TCP server waar Polarplot client van is;
- Is een websocket client van de webserver in GoFree;
- Stuurt eenmalig een "subscribe request" naar de webserver voor de data die ik nodig heb;
- Webserver pushed deze data real-time naar de helper-taak;
- Helper taak parsed de ontvangen JSON strings en pushed de metingen naar de TCP client (Polarplot).
Op deze manier heb ik Polarplot nauwelijks hoeven aanpassen (er komt nu geen NMEA0183 binnen maar een eigen variant) en krijg toch voor mekaar wat ik wil.
Nog niet aan boord getest, wel met on-line websocket "echo" servers waar naartoe ik de te ontvangen JSON strings stuur: deze komen dan weer terug op dezelfde manier zoals GoFree dat zal doen...
Voor wie een Navico/B&G/Simrad + GoFree heeft en hier iets mee wil doen: script is beschikbaar per PB.