@pgogas/wsjtx-js v0.0.1
@pgogas/wsjtx-js
A JavaScript library for parsing WSJT-X UDP messages. WSJT-X is a popular amateur radio software package for weak signal communication modes like FT8, FT4, JT65, and WSPR.
Features
- ๐ Complete UDP Message Parsing - Supports all WSJT-X message types (Heartbeat, Status, Decode, Clear, Reply, QSO Logged, etc.)
- ๐ก Event-Driven Architecture - Easy-to-use event emitter for real-time message handling
- ๐ฏ Big-Endian Format Support - Proper handling of WSJT-X's big-endian UDP format
- ๐ง QDataStream Compatible - Fully compatible with Qt's QDataStream binary format
- โ Type-Safe - Well-defined message classes with comprehensive JSDoc documentation
- ๐งช Thoroughly Tested - Comprehensive test suite with high code coverage
Installation
npm install @pgogas/wsjtx-jsQuick Start
Basic Usage
const { WsjtxListener } = require('@pgogas/wsjtx-js');
// Create a listener on the default WSJT-X UDP port
const listener = new WsjtxListener({ port: 2237 });
// Listen for decode messages (new stations decoded)
listener.on('decode', (message) => {
console.log(`Decoded: ${message.message} (SNR: ${message.snr}dB)`);
});
// Listen for status updates
listener.on('status', (message) => {
console.log(`Frequency: ${message.frequency}Hz, Mode: ${message.mode}`);
});
// Start listening
await listener.start();
console.log('Listening for WSJT-X messages...');Manual Message Parsing
const { WsjtxParser } = require('@pgogas/wsjtx-js');
// Parse a UDP datagram buffer
const message = WsjtxParser.parse(udpBuffer);
console.log(`Message type: ${message.constructor.name}`);
console.log(`From station: ${message.id}`);Supported Message Types
| Message Type | Class Name | Description |
|---|---|---|
| Heartbeat | HeartbeatMessage | Periodic keepalive from WSJT-X |
| Status | StatusMessage | Current operating status and settings |
| Decode | DecodeMessage | Newly decoded message |
| Clear | ClearMessage | Clear decode window command |
| Reply | ReplyMessage | Reply to CQ or QRZ |
| QSO Logged | QsoLoggedMessage | QSO has been logged |
| Close | CloseMessage | WSJT-X is closing |
| WSPR Decode | WsprDecodeMessage | WSPR-specific decode information |
Event-Driven Listener
The WsjtxListener class extends Node.js EventEmitter and provides these events:
Message Events
message- Any message received (with message object and remote info)heartbeat- Heartbeat messagesstatus- Status updatesdecode- New decodesqsologged- Logged QSOswspr- WSPR decodesclear- Clear window commandsclose- WSJT-X closing
System Events
listening- Listener started successfullystopped- Listener stoppederror- Network or system errorparseError- Failed to parse a message
Example: Complete Event Handling
const { WsjtxListener } = require('@pgogas/wsjtx-js');
const listener = new WsjtxListener({ port: 2237 });
// Handle decode messages
listener.on('decode', (message, rinfo) => {
console.log(`๐ New decode from ${message.id}:`);
console.log(` Message: "${message.message}"`);
console.log(` SNR: ${message.snr}dB`);
console.log(` Mode: ${message.mode}`);
console.log(` Time: ${message.time}s`);
});
// Handle status updates
listener.on('status', (message) => {
console.log(`๐ Status update from ${message.id}:`);
console.log(` Frequency: ${message.frequency}Hz`);
console.log(` Mode: ${message.mode}`);
console.log(` Transmitting: ${message.transmitting}`);
});
// Handle QSO logging
listener.on('qsologged', (message) => {
console.log(`๐ QSO logged with ${message.dxCall}`);
console.log(` Grid: ${message.dxGrid}`);
console.log(` Mode: ${message.mode}`);
console.log(` Report: ${message.reportSent}/${message.reportReceived}`);
});
// Handle errors gracefully
listener.on('error', (error) => {
console.error('Listener error:', error.message);
});
listener.on('parseError', (error, buffer, rinfo) => {
console.error(`Parse error from ${rinfo.address}: ${error.message}`);
});
// Start listening
await listener.start();WSJT-X Configuration
To use this library, configure WSJT-X to send UDP messages:
- In WSJT-X, go to File โ Settings
- Click the Reporting tab
- Check Enable PSK Reporter Spotting
- Set UDP Server:
127.0.0.1(or your server IP) - Set UDP Server Port:
2237(or your chosen port) - Check Accept UDP requests
Message Format Details
All WSJT-X UDP messages follow this format:
Header (12 bytes):
- Magic Number: 0xadbccbda (4 bytes)
- Schema Version: uint32 (4 bytes)
- Message Type: uint32 (4 bytes)
Payload:
- Station ID: QString
- Message-specific fields...The library handles the big-endian format and QDataStream encoding automatically.
API Reference
WsjtxListener
Constructor
new WsjtxListener(options)Options:
port(number): UDP port to listen on (default: 2237)address(string): IP address to bind to (default: '127.0.0.1')
Methods
start()โ Promise - Start listening for messagesstop()โ Promise - Stop listeningisListening()โ boolean - Check if currently listeningaddress()โ object - Get current bind address/port
WsjtxParser
Static Methods
parse(buffer)โ Message - Parse a UDP datagram buffer
Message Classes
All message classes extend BaseMessage and include:
id(string): Station identifierschemaVersion(number): Message schema version- Message-specific properties...
Examples
See the /examples directory for complete working examples:
listener.js- Comprehensive message listener with all event types- Run with:
npm startornode examples/listener.js
Testing
# Run tests
npm test
# Run tests with coverage
npm run test:coverage
# Run linting
npm run lintContributing
- Fork the repository
- Create a feature branch:
git checkout -b feature-name - Make your changes and add tests
- Run the test suite:
npm test - Submit a pull request
Protocol References
License
MIT License - see LICENSE file for details
Publishing (For Maintainers)
This package uses semantic versioning and includes a publishing script for easy releases:
# Check status and run tests
npm run publish:check
# Publish with version bump
npm run publish:patch # Bug fixes (1.0.0 โ 1.0.1)
npm run publish:minor # New features (1.0.0 โ 1.1.0)
npm run publish:major # Breaking changes (1.0.0 โ 2.0.0)Requirements:
- Must be logged into npm:
npm login - All tests must pass
- Working directory should be clean (committed changes)
Related Projects
- WsjtxUdpLib - .NET implementation that inspired this library
- WSJT-X - The official WSJT-X software
Amateur Radio
This library is designed for amateur radio operators. A valid amateur radio license is required to operate WSJT-X and transmit on amateur frequencies.
73!
5 months ago