RIFP radio image sender and receiver
The Radio Image Framing Protocol (RIFP) 1.0 is an experimental, extensible standard
for sending images over low-rate radio links.
The default rifp-cpfsk-4800 profile uses binary continuous-phase FSK and can
be deployed around 433.92 MHz where local regulation permits it. RIFP itself is
not tied to 433 MHz or to FSK.
The implementation is not an analogue WEFAX receiver. The group3 and
group4 codecs nevertheless use real CCITT Group 3/4 TIFF facsimile
compression.
Protocol properties
RIFP 1.0 provides:
- a 28-byte versioned base header;
- 64-bit random session identifiers;
- 32-bit sequence and chunk-count fields;
- advisory and critical flags;
- extensible 16-bit type/length/value header fields;
- MANIFEST, DATA, END and CANCEL frame types;
- JSON manifests with namespaced extension data;
- CRC-32 on every frame;
- CRC-32 and SHA-256 verification of the complete encoded image;
- out-of-order delivery, repetition and duplicate detection;
- explicit media types and content-encoding names; and
- named radio profiles that are independent of the framing protocol.
Unknown advisory extensions are ignored. Unknown critical extensions cause the
individual frame to be rejected, allowing future features such as encryption,
signatures, FEC and repair requests to be introduced safely.
Dependencies
python3 -m pip install -r requirements_radiofax.txt
For live RF, install SoapySDR, its Python bindings and the hardware module for
your SDR. Transmission requires TX-capable hardware such as a HackRF, LimeSDR,
PlutoSDR or USRP. Many RTL-SDR devices are receive-only but can run the
receiver.
Offline conformance loopback
Run the commands from the directory containing all three Python files:
python3 radiofax_sender.py example.png \
--preset small --codec group4 --bits 1 \
--packet-repeats 1 --manifest-repeats 1 \
--sender-id CIRCL \
--content-hint "scheduled weather image" \
--manifest-extension 'org.example.source={"camera":"north"}' \
--duty-cycle 1 --iq-output example.cf32
python3 radiofax_receiver.py \
--iq-input example.cf32 \
--output-dir received-radiofax
Both sides must use the same sample and symbol rates. Defaults are 96
ksample/s and 4,800 symbols/s. IQ-file mode uses --iq-gap and does not add
long silence representing regulatory duty-cycle pacing.
Manif