@canboat/canboatjs
Version:
Native javascript version of canboat
210 lines (172 loc) • 7.83 kB
Markdown
# Architecture Diagram: canboatjs, n2k-signalk, and signalk-server Integration
## Overview
This diagram shows how the three main components work together to process marine data from NMEA 2000 devices to Signal K format and beyond.
```mermaid
graph TB
%% Hardware Layer
subgraph "Hardware Layer"
N2K[NMEA 2000 Network]
ACTISENSE[Actisense NGT-1]
YDWG[Yacht Devices YDWG-02]
IKON[Digital Yacht iKonvert]
MINIPLEX[MiniPlex-3-N2K]
SOCKETCAN[SocketCAN Interface]
end
%% Data Formats
subgraph "Raw Data Formats"
ACT_FMT["Actisense Format<br/>2017-03-13T01:00:00.146Z,2,127245,204,255,8,fc,f8,ff,7f,ff,7f,ff,ff"]
YDWG_FMT["YDWG Raw Format<br/>16:29:27.082 R 09F8017F 50 C3 B8 13 47 D8 2B C6"]
IKON_FMT["iKonvert Format<br/>!PDGY,127245,255,/Pj/f/9///8="]
CANDUMP_FMT["candump Format<br/>can0 09F8027F [8] 00 FC FF FF 00 00 FF FF"]
PCDIN_FMT["PCDIN Format<br/>$PCDIN,01F119,00000000,0F,2AAF00D1067414FF*59"]
MXPGN_FMT["MXPGN Format<br/>$MXPGN,01F801,2801,C1308AC40C5DE343*19"]
end
%% canboatjs Layer
FROMPGN["@canboat/canboatjs<br>FromPGN Parser"]
TOPGN["@canboat/canboatjs<br>ToPGN Converter"]
JSON_N2K_OUT["Canboat JSON Format<br/>(for output)"]
%% Parsed Data
subgraph "Parsed N2K Data (JSON)"
JSON_N2K["Canboat JSON Format<br/><code>{<br/> 'pgn': 127245,<br/> 'src': 204,<br/> 'dst': 255,<br/> 'fields': {<br/> 'Instance': 252,<br/> 'Direction Order': 0,<br/>'Angle Order': 0.1745<br> }<br/>}</code>"]
end
style JSON_N2K text-align:left
%% n2k-signalk Layer
N2K_MAPPER["@signalk/n2k-signalk<br>N2kMapper"]
%% Signal K Delta
subgraph "Signal K Delta Format"
SIGNALK_DELTA["Signal K Delta<br/><code>{<br/> 'context': 'vessels.self',<br/> 'updates': [{<br/>'values': [{<br/> 'path': 'steering.rudderAngle',<br/> 'value': 0.1745<br/> }]<br/> }]<br/>}</code>"]
end
style SIGNALK_DELTA text-align:left
%% signalk-server Layer
SIGNALK_SERVER[Signal K Server]
%% Client Applications
subgraph "Client Applications"
APPS[Navigation Apps<br/>Navionics, iSailor,<br/>iNavX, Aqua Map]
WILHELMSK[WilhelmSK]
WIDGETS[Web Widgets]
CUSTOM_CLIENTS[Custom Applications]
end
%% Output Formats
subgraph "Output Data Formats"
NMEA0183_OUT[NMEA 0183 TCP :10110]
SIGNALK_WS[Signal K WebSocket]
SIGNALK_REST[Signal K REST API]
SIGNALK_TCP[Signal K TCP]
end
%% Connections - Hardware to canboatjs
N2K <--> ACTISENSE
N2K <--> YDWG
N2K <--> IKON
N2K <--> MINIPLEX
N2K <--> SOCKETCAN
ACTISENSE <--> ACT_FMT
YDWG <--> YDWG_FMT
IKON <--> IKON_FMT
SOCKETCAN <--> CANDUMP_FMT
MINIPLEX <--> MXPGN_FMT
%% canboatjs parsing
ACT_FMT --> FROMPGN
YDWG_FMT --> FROMPGN
IKON_FMT --> FROMPGN
CANDUMP_FMT --> FROMPGN
PCDIN_FMT --> FROMPGN
MXPGN_FMT --> FROMPGN
FROMPGN --> JSON_N2K
%% n2k-signalk conversion
JSON_N2K --> N2K_MAPPER
N2K_MAPPER --> SIGNALK_DELTA
%% signalk-server processing
SIGNALK_DELTA --> SIGNALK_SERVER
%% Output connections
SIGNALK_SERVER --> SIGNALK_WS
SIGNALK_SERVER --> SIGNALK_REST
SIGNALK_SERVER --> SIGNALK_TCP
SIGNALK_SERVER --> NMEA0183_OUT
%% Client connections
SIGNALK_WS --> APPS
SIGNALK_REST --> WIDGETS
NMEA0183_OUT --> APPS
SIGNALK_TCP --> CUSTOM_CLIENTS
SIGNALK_WS --> WILHELMSK
%% Reverse flow - Signal K to N2K
SIGNALK_SERVER --> JSON_N2K_OUT
JSON_N2K_OUT --> TOPGN
TOPGN --> ACT_FMT
%% Styling
classDef hardware fill:#e1f5fe,stroke:#0277bd,stroke-width:2px
classDef format fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef canboatjs fill:#e8f5e8,stroke:#2e7d32,stroke-width:2px
classDef n2ksignalk fill:#fff3e0,stroke:#ef6c00,stroke-width:2px
classDef signalkserver fill:#e0f2f1,stroke:#00695c,stroke-width:2px
classDef output fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef clients fill:#f1f8e9,stroke:#558b2f,stroke-width:2px
class N2K,CAN,ACTISENSE,YDWG,IKON,MINIPLEX,SOCKETCAN hardware
class ACT_FMT,YDWG_FMT,IKON_FMT,CANDUMP_FMT,PCDIN_FMT,MXPGN_FMT,JSON_N2K_OUT format
class FROMPGN canboatjs
class TOPGN canboatjs
class N2K_MAPPER,DELTA_CONV,STANDARD_PGNS,FUSION_PGNS,LOWRANCE_PGNS,RAYMARINE_PGNS,MARETRON_PGNS,ACTISENSE_PGNS,DIGITALYACHT_PGNS,SIMRAD_PGNS n2ksignalk
class SIGNALK_SERVER signalkserver
class NMEA0183_OUT,SIGNALK_WS,SIGNALK_REST,SIGNALK_TCP output
class APPS,WIDGETS,CUSTOM_CLIENTS,WILHELMSK clients
```
## Data Flow Explanation
### 1. **Hardware Layer**
- **NMEA 2000 Network**: Marine electronics network using CAN bus protocol
- **Gateways**: Various hardware devices that bridge NMEA 2000 to serial/ethernet/wifi
- **Interfaces**: Direct CAN bus interfaces for Linux systems
### 2. **canboatjs (@canboat/canboatjs)**
**Purpose**: Parse and encode NMEA 2000 data in various formats
- **FromPgn Parser**: Core parser that converts various N2K formats to standardized JSON
**Key Features**:
- Multi-format input support (Actisense, YDWG, iKonvert, etc.)
- Real-time stream processing
- Bidirectional conversion (parse and generate)
- Hardware abstraction layer
### 3. **n2k-signalk (@signalk/n2k-signalk)**
**Purpose**: Convert parsed NMEA 2000 JSON to Signal K delta format
- **N2kMapper**: Main conversion engine
- **PGN Mappings**: Manufacturer-specific and standard PGN definitions
- **Delta Converter**: Transforms N2K data to Signal K delta updates
**Key Features**:
- Comprehensive PGN coverage
- Manufacturer-specific extensions
- Signal K delta format output
- Custom mapping support
### 4. **signalk-server**
**Purpose**: Central hub for marine data processing and distribution
- **Stream Processors**: Handle different data types and formats
- **Data Providers**: Connect to various data sources
- **Plugin System**: Extensible architecture for custom functionality
- **Network Interfaces**: Serve data via HTTP, WebSocket, TCP, etc.
**Key Features**:
- Multi-protocol support (NMEA 2000, NMEA 0183, Signal K)
- Web-based administration interface
- Plugin ecosystem for extensions
- Real-time data streaming
- Format conversion and bridging
## Integration Points
### **canboatjs → n2k-signalk**
- canboatjs parses raw N2K data into standardized JSON format
- n2k-signalk consumes this JSON and converts it to Signal K deltas
- Both libraries share common PGN definitions from @canboat/ts-pgns
### **n2k-signalk → signalk-server**
- signalk-server uses n2k-signalk as a stream processor
- N2K data flows through canboatjs → n2k-signalk → Signal K deltas
- Server maintains device metadata and manages data flow
## Output Capabilities
### **Data Formats**
- **Signal K**: Native JSON format via WebSocket and REST APIs
- **NMEA 0183**: Converted output via TCP for legacy applications
- **NMEA 2000**: Bidirectional N2K communication
### **Client Applications**
- **Navigation Apps**: Navionics, iSailor, iNavX, Aqua Map via NMEA 0183 TCP
- **Signal K Apps**: WilhelmSK and custom applications via Signal K APIs
- **Web Applications**: Browser-based instruments and controls
- **Custom Clients**: Direct API access for specialized applications
## Key Benefits
1. **Multi-Format Support**: Handle various proprietary formats from different manufacturers
2. **Real-Time Processing**: Stream-based architecture for live data
3. **Extensibility**: Plugin system and custom mappings
4. **Standardization**: Convert proprietary formats to open Signal K standard
5. **Bridging**: Connect legacy NMEA 0183 apps to modern NMEA 2000 networks
6. **Device Integration**: Support for multiple hardware interfaces and protocols