In questa paginetta descriviamo l'installazione di Signal K Server, un collettore di dati di navigazione (eg. NMEA 0183, NMEA 2000) su un portatile MacOS.
Dopo l'introduzione e l'installazione vedremo la configurazione di base, l'dttivazione come servizio ed infine l'integrazione con OpenCPN e qtVlm.
Signal K
e' il componente che raccoglie i dati di navigazione
dagli strumenti (eg. GPS, AIS),
e li presenta con un servizio web.
Dal punto di vista tecnico e' un servizio realizzato su
Node.js
che raccoglie i dati dalle
linee seriali dei vari dispositivi dell'imbarcazione,
qualunque sia il protocollo (eg. NMEA 0183, NMEA 2000),
e li presenta in
formato JSON.
macOS e' il sistema operativo dei sistemi Mac di Apple.
Ha un'ottima interfaccia grafica ma e' un sistema unix completo
ed utilizzeremo i comandi da terminale per i diversi passi
di installazione e configurazione.
🍺 Homebrew
o, piu' semplicemente brew, e' il piu' recente, il piu' completo e sopratutto piu'
il piu' semplice gestore di pacchetti per macOS che ci servira' per i primi passi dell'installazione...
I passi per l'installazione sono i seguenti:
Accedendo con un browser sull'URL http://localhost:3000
si puo' navigare sull'applicazione e sui plug installati:
Per interrompere il programma basta dare un [Control]-C e termina signal-k, ovviamente cercando di accedere da browser avremo un errore.
Abbiamo terminato con le installazioni ma
prima di vedere come raccogliere i dati reali con Signal K, che e' la parte piu' varia perche' dipende
dal tipo di strumenti disponibili, rivediamo in dettaglio i passi eseguiti.
Ecco il dettaglio dei comandi e l'output completo ottenuto (in neretto i comandi da digitare):
MyMac ~ % /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
==> Checking for `sudo` access (which may request your password)...
Password:
==> This script will install:
/opt/homebrew/bin/brew
/opt/homebrew/share/doc/homebrew
/opt/homebrew/share/man/man1/brew.1
/opt/homebrew/share/zsh/site-functions/_brew
/opt/homebrew/etc/bash_completion.d/brew
/opt/homebrew
Press RETURN/ENTER to continue or any other key to abort:
MyMac ~ % brew install npm
==> Downloading https://formulae.brew.sh/api/formula.jws.json
############################################################################################################################# 100.0%
==> Downloading https://formulae.brew.sh/api/cask.jws.json
############################################################################################################################# 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/node/manifests/23.1.0_1
############################################################################################################################# 100.0%
==> Fetching dependencies for node: c-ares
==> Downloading https://ghcr.io/v2/homebrew/core/c-ares/manifests/1.34.2
############################################################################################################################# 100.0%
==> Fetching c-ares
==> Downloading https://ghcr.io/v2/homebrew/core/c-ares/blobs/sha256:481d2f96a66a542f39bd37192f9fd301d025307d7e755834ccb14ea5f29202e
############################################################################################################################# 100.0%
==> Fetching node
==> Downloading https://ghcr.io/v2/homebrew/core/node/blobs/sha256:4933b550c70a22bdf1f3f22eb344db6da5c6881b0a0df8efd87135032700f347
############################################################################################################################# 100.0%
==> Installing dependencies for node: c-ares
==> Installing node dependency: c-ares
==> Downloading https://ghcr.io/v2/homebrew/core/c-ares/manifests/1.34.2
Already downloaded: /Users/xxx/Library/Caches/Homebrew/downloads/66d72418f3225dcbf26dbf8a82e1b18d47fb7581a210b0ef58b0fe9bd37a0eff--c-ares-1.34.2.bottle_manifest.json
==> Pouring c-ares--1.34.2.arm64_sonoma.bottle.tar.gz
🍺 /opt/homebrew/Cellar/c-ares/1.34.2: 176 files, 1MB
==> Installing node
==> Pouring node--23.1.0_1.arm64_sonoma.bottle.tar.gz
🍺 /opt/homebrew/Cellar/node/23.1.0_1: 2,676 files, 87.5MB
==> Running `brew cleanup node`...
Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP.
Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`).
MyMac ~ % npm install -g --unsafe-perm signalk-server
(node:18738) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().
Support for loading ES Module in require() is an experimental feature and might change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
npm warn deprecated rimraf@2.7.1: Rimraf versions prior to v4 are no longer supported
npm warn deprecated fstream@1.0.12: This package is no longer supported.
npm warn deprecated inflight@1.0.6: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
npm warn deprecated glob@7.2.3: Glob versions prior to v9 are no longer supported
⠋
MyMac ~ % signalk-server-setup
____ _ _ _ __
/ ___| (_) __ _ _ __ __ _ | | | |/ /
\___ \ | | / _` | | '_ \ / _` | | | | ' /
___) | | | | (_| | | | | | | (_| | | | | . \
|____/ |_| \__, | |_| |_| \__,_| |_| |_|\_\
|___/
? Enter the location to store server configuration: /Users/xxx/.signalk
? Enter your vessel name: MyMac
? Enter your mmsi if you have one:
? Do you want to enable SSL? No
✔ Creating your server base deltas at /Users/xxx/.signalk/baseDeltas.json
✔ Creating your server settings at /Users/xxx/.signalk/settings.json
✔ Creating package.json
✔ Creating your server startup script at /Users/xxx/.signalk/signalk-server
MyMac ~ %
MyMac ~ % signalk-server --sample-n2k-data
The installed version of node (v23.1.0) is different than the recommended version (18 - 20). See https://github.com/SignalK/signalk-server/wiki/Installing-and-Updating-Node.js for more information how to upgrade.
Using sample data from /opt/homebrew/lib/node_modules/signalk-server/samples/aava-n2k.data
Could not parse security config
ENOENT: no such file or directory, open '/Users/xxx/.signalk/security.json'
Could not parse security config
ENOENT: no such file or directory, open '/Users/xxx/.signalk/security.json'
Could not parse security config
ENOENT: no such file or directory, open '/Users/xxx/.signalk/security.json'
(node:23018) [DEP0040] DeprecationWarning: The `punycode` module is deprecated. Please use a userland alternative instead.
(Use `node --trace-deprecation ...` to show where the warning was created)
signalk-server running at 0.0.0.0:3000
...
^C
Signal K Server e' gia' attivo come servizio ma prima di configurarlo dobbiamo fa arrivare al Mac
i segnali dei nostri dispositivi di bordo.
Ogni singolo dispositivo Talker NMEA 0183 deve essere collegato singolarmente, a meno che non si abbia
a bordo un multiplexer; per farlo basta un cavo adattatore USB a RS-232/RS-422.
Il CAN-bus NMEA 2000 invece richiede un unico collegamento.
E' impossibile descrivere tutti i casi anche perche' esistono versioni differenti di standard,
di cavi, di prese, ... e' fondamentale controllare la documentazione tecnica di ogni dispositivo.
Il caso piu' frequente e' l'utilizzo di NMEA 0183, standard molto vecchio ma ancora usatissimo,
effettuati i collegamenti l'ultima variabile che occorre configurare e' la velocita';
generalmente per le connessioni ad un GPS sara' 4800 mentre verso un AIS o un multiplexer sara' 38400
[NdA gli altri parametri tipici di una connessione seriale sono fissi:
8 Data bits, Parity None, 1 Stop bits, Handshake None].
Se i collegamenti sono corretti arriveranno le sentences NMEA 0183
che sono quasi comprensibili anche per noi umani:
$GPGLL,4434.4426,N,0923.0108,E,101030.000,A,A*69
E' sempre un protocollo seriale, ma presenta diversi vantaggi la connessione con NMEA 2000. Innanzi tutto vi e' un solo cavo comune per tutti i dispositivi, inoltre le velocita' di tramissione sono nettamenti superiori.
Non richiede invece alcuna connessione fisica il caso, sempre piu' comune su apparati recenti, di multiplexer che pubblicano dati direttamente su Wifi.
Come leggere dati su macOS?
Se i dati provengono da una linea seriale la soluzione piu' semplice
e' quella di utilizzare un cavo di conversione da seriale a USB.
Connesso il cavo, se non vi sono problemi con i driver,
dovrebbe essere disponibile un device con un nome /dev/cu.usbserial
che sara' quello da utilizzare nelle configurazioni.
Per provare puo' essere utile il comando:
screen /dev/cu.usbserial 9600
Per chiudere l'applicazione screen CTRL-A, CTRL-\.
Se i dati provengono su Wifi e' sufficiente utilizzare la stessa rete Wifi sul MAC
e conoscere l'indirizzo del dispositivo.
Per controllare il traffico TCP si utilizza il famigerato Netcat:
nc localhost 10110
Puo' sembrare complicato ed... a volte lo e' davvero!
Ma in mezzo al mare, soli con i vostri sensori e strumenti ci sarete voi,
ed e' importante imparare come funziona ogni singolo componente della vostra barca
per risolvere ogni problema che possa presentarsi.
Con un po' di fortuna basta qualche prova e si possono integrare velocemente tutte le sorgenti dati
della nostra barca.
Effettuate le connessioni fisiche la configurazione di solito e' semplice:
su Signal K basta registrare la sorgente nella sezione Server.
Signal K e' raggiungibile via URL alla porta 3000 ed ora presenta tutti i dati raccolti.
Oltre all'accesso diretto ai dati sono utilizzabili anche le dashboard
aggiuntive implementate come plug-in.
Tra queste:
Instrument Panel
e sopratutto
KIP.
Fino ad ora abbiamo attivato Signal K dal terminale con il comando signalk-server e per fermarlo abbiamo interrotto il processo con un [Control]-C. Puo' andare bene per effettuare le configurazioni iniziali... Tuttavia e' sicuramente piu' corretto attivarlo come servizio che parta in automatico all'avvvio.
macOS utilizza il launchd per gestire i demoni e gli user agent [NdA che sono in pratica la stessa cosa ma vengono eseguiti nel contesto di un utente]. Una descrizione tecnica completa rischia di essere un po' lunga... vediamo solo i passi in pratica:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.signalk.signalk-server</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/signalk-server</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
Sulla creazione di demoni e degli user agent in macOS maggiori dettagli si possono trovare sulla documentazione ufficiale.
Signal K e' raggiungibile via URL alla porta 3000 e presenta i dati con la sua interfaccia web o con i plug-in installati (eg. KIP). Ma non e' l'unico modo di accedere ai dati.
I dati pubblicati da Signal K possono essere utilizzati da altre applicazioni come
OpenCPN
che e' un ottimo plotter Open Source.
L'integrazione tra i due strumenti e' molto semplice.
Sul menu di OpenCPN, scegliere Preferences... scegliere Connections ed
aggiungere una nuova connessione network con protocollo Signal K, indirizzo localhost e porta 3000:
Gia' fatto!
Se Signal K e' attivo con i dati di prova ci troveremo a Tallin:
qtVlm e' un ottimo programma di routing [NdA determina la rotta piu' efficiente dalla partenza all'arrivo tenendo conto di tutte le variazioni dei venti (cfr. grib) e delle caratteristiche della barca a vela (cfr. polari)]. qtVlm non riconosce il protocollo Signal K ma solo l'NMEA 0183... ma possiamo integrarli ugualmente!
Su Signal K controlliamo che l'interfaccia NMEA TCP sia attiva (e' il default)
ed attiviamo i plugin di conversione da Signal K ad NMEA (per default non sono attivi):
A questo punto Signal K ritrasmette i messaggi sulla porta TCP 10110 con il formato NMEA 0183.
Sul menu di qtVlm, scegliere Configuration quindi nel tab NMEA Connections ed
attivare una nuova connessione con indirizzo localhost e porta 10110:
Gia' fatto!
Se Signal K e' attivo con i dati di prova ci troveremo a Tallin:
Problemi? Parliamone!
Per eseguire l'installazione di tutti i componenti e' necessaria una connessione Internet, veloce, ovviamente se possibile; in caso contrario oltre alla connessione servira' un po' di pazienza. Una volta eseguita l'installazione la connessione Internet non e' piu' necessaria.
Signal K Server utilizza per default la porta 3000. Naturalmente andra' in errore se la porta e' occupata... basta modificare le porte di uno dei due servizi per aggirare il problema [NdA ad esempio nel mio caso avevo attiva l'applicazione Grafana].
L'avvio di Signal K puo' richiedere qualche secondo... attendere prego!
Le versioni del sistema operativo, degli ambienti, delle applicazioni, ... non sono mai perfettamente allineate tra loro. Nella maggior parte dei casi vengono solo riportati dei messaggi di warning che possono essere tranquillamente ignorati. In qualche caso potrebbe essere necessario qualche upgrade, ad esempio del sistema operativo di macOS [NdA se non si puo' fare altrimenti].
Per essere precisi bisogna ricordare che Signal K e' uno standard Open per la condivisione di dati orientato alla nautica che utilizza le tecniche piu' recenti di condivisione dei dati mentre Signal K Server e' un'implementazione di riferimento realizzata su Node.js ed e' quello che abbiamo descritto in questa paginetta.
Su un'imbarcazione e' sicuramente piu' comune un'installazione di OpenPlotter su Raspberry. OpenPlotter e' una distribuzione completa che contiene al suo interno anche Signal K Server.
E' sempre opportuno utilizzare le versioni piu' recenti. Alla data 2026-04 la versione piu' recente di signalk e' v2.24.0 e utilizza Node.js 24.
Buon vento!
Titolo: Installazione di Signal K su macOS
Livello: Avanzato
Data:
31 Ottobre 2024 🎃 Halloween
Versione: 1.0.2 - 1 Aprile 2026 🐟
Autore: mail [AT] meo.bogliolo.name