lanner / experimental / illustrated protocol guide
Two tones.
Three ways to carry text.
RTTY sends a stream of characters. SITOR-B adds a checked seven-unit alphabet and sends each character twice. NAVTEX gives that broadcast stream a bulletin header, a body and an end marker.
hfmodem implements the character tables, waveform generation and passive decoders. Its console can monitor all three. These are experimental implementations with local software tests; no named independent on-air Lanner result is claimed. Every figure below is a schematic built from protocol and implementation constants, not a received signal.
01 / The physical channel
The same shift does not mean the same code
Both defaults use two audio tones 170 Hz apart. RTTY runs at 45.45 baud, with mark above space in the USB audio convention. SITOR-B runs at 100 baud: the higher tone is B and the lower is Y. In the seven-unit table B is stored as zero and Y as one; this differs from RTTY’s mark-as-one convention. A frequency shift is the distance between tones, not the signal’s occupied bandwidth.
rtty.py and sitor.py. Vertical strokes identify tone centres; they are not spectral-power measurements.Tone geometry in text
| Mode | Lower tone | Centre | Upper tone | Symbol rate |
|---|---|---|---|---|
| RTTY | Space 1415 Hz | 1500 Hz | Mark 1585 Hz | 45.45 Bd |
| SITOR-B /NAVTEX | Y 1615 Hz | 1700 Hz | B 1785 Hz | 100 Bd |
02 / Asynchronous characters
A start, five code units, and a stop
The default RTTY character has one space start unit, five ITA2 code units in order 1 through 5, and 1.5 mark stop units. That is 7.5 unit times: about 165.02 ms at 45.45 Bd, or 6.06 codewords per second before shift characters and other controls. There is no character checksum or retransmission in this framing. An incorrect but valid-looking character can print without a warning.
Selected character’s units in text
| Element | Value | Tone | Duration |
|---|
03 / One alphabet, two cases
Shifts give five bits a larger vocabulary
Five bits have 32 combinations. Letter shift (LTRS, 11111 in transmitted unit order) selects letters; figure shift (FIGS, 11011) selects numbers and punctuation. The same 10101 code prints Y in letters and 6 in figures. A lost shift can affect a run of text, not just one character. The console defaults to US-TTY figures and unshift on space (USOS); --no-rtty-usos keeps figure state across a space.
Print Y
Same code; print 6
With USOS, restore letters
Print Y with USOS; 6 without
US-TTY and international ITA2 differ in eight figures entries; their letter codes agree. SITOR retains the shift idea but maps characters into its own seven-unit alphabet. See the full code tables for controls and both figures variants.
04 / Time diversity
SITOR-B separates two copies of each character
A SITOR word has seven units and exactly four B tones plus three Y tones. That ratio detects any single-unit inversion; it cannot detect every multiple-unit error. Seven units at 100 Bd occupy 70 ms. Direct (DX) and repeated (RX) slots alternate. Four other 70 ms slots lie between a word and its copy: a 280 ms clear interval, or 350 ms from one start to the next.
The receiver checks both copies. A valid copy can replace an invalid one; matching valid copies agree. Two different valid copies leave the character unresolved. hfmodem also uses soft tone evidence when both hard decisions are damaged; confidence thresholds and shift-state handling belong to its receiver implementation. This is time-diversity forward error correction, without a return-path acknowledgement.
Slots and recovery decision in text
| Slot | Start/end | Contents | Pair role |
|---|---|---|---|
| 0 | 0–70 ms | A | Direct copy |
| 1–4 | 70–350 ms | Four other words | 280 ms spacing between copies |
| 5 | 350–420 ms | A | Repeated copy |
The waveform starts with alternating phasing signals to establish slot alignment. The library default is 16 pairs, consistent with M.625’s minimum, and ends with idle-alpha signals in the DX stream. These defaults are not a complete NAVTEX transmitting schedule: broadcast-specific phasing and identification rules apply beyond basic waveform generation. Selective SITOR-B addressing and SITOR-A’s acknowledged 450 ms cycles are outside these console monitors.
06 / At the operating desk
Choose the text decoder and keep listening
hfmodem console rtty monitor
hfmodem console sitor-b monitor
hfmodem console navtex monitor
hfmodem console rtty monitor --no-rtty-usosThese use the rig’s current dial and leave sideband and receive-filter choices to the operator. Optional --freq KHZ tunes once. You may retune the radio itself while the monitor runs; tone acquisition can search audio up to 4 kHz. Read the monitor guide for audio-source selection, recordings, status output and KiwiSDR handling.
Tune both tones inside the receive passband. Incorrect rate, tone polarity or alphabet state can turn plausible signal energy into wrong text. RTTY does not supply delivery confirmation. SITOR-B may leave unresolved characters, and NAVTEX may need a complete later bulletin before it produces output. The library’s RTTY and collective SITOR-B transmit functions do not make these passive console entries a two-way terminal.
07 / Implement it yourself
Tables, timing and receiver decisions
The figures show wire order, tone centres and default timing. The files below contain complete tables and the implementation-specific acquisition and decision rules. The diagrams are explanatory schematics; the linked code remains the source for exact behavior.
| Part | Constants or behavior | Source |
|---|---|---|
| ITA2 | All 32 codes, unit 1 first, 8 US figures overrides, shift state | ita 2.py |
| RTTY | 45.45 Bd, 170 Hz shift, 1415/1585 Hz tones, 1.5 stop units; generation and frame recovery | rtty.py |
| Seven-unit alphabet | Full traffic/service words, B/Y polarity and valid-word checks | ccir 476.py |
| SITOR-B | 100 Bd, 1615/1785 Hz tones, phasing, five-slot repeat distance, pair validation, soft recovery and lock/resume behavior | sitor.py |
| Common FSK | Sample rate, tone shaping, sample/clock and frequency fitting | fsk.py |
| NAVTEX | ZCZC header, identifier validation, NNNN and partial-window assembly | navtex.py |
Primary references: ITU-T S.1 specifies ITA2 and unit order. ITU-R M.625-4 defines the seven-unit alphabet, phasing, time diversity and copy checks; M.476-5 describes legacy equipment conventions. The US Coast Guard NAVTEX reference explains bulletin identity and boundaries.
See the implementation scope and software evidence. No successful live-radio result is inferred from these figures or from local round trips.