Simple-Radio-Control-Protocol (SRCP) Specification
|
· | XDR-GTK by Konrad Kosmatka
|
· | Marko Weck in his system controlling a Technics analog radio
|
· | HDSDR via a plugin here
|
· | KiwiSDR (web app) via browser plugin here
|
StationList listens to port 9030 and sends to 9031
|
Radio-Application (like XDR-GTK) listens to 9031 (always +1) and sends to 9030
|
|
When the radio-app receives a UDP message, it should memorize the sender's UDP-Adr and UDP-Port, and send to that adr & port from then on.
|
So the radio-app UI only needs the setting for the UDP-port to be used on startup (default = 9031). No more need to specify the UDP-Adr.
|
StatlionList will intially send a freq=? to request the current frequency, and from then on the radio-app knows UDP-Adr and UDP-Port to be used for its future messages.
|
That allows using StationList on different PCs / Android (running Stationlist-M), without altering the radio-app settings. It will always send to the StationList last used.
|
A single UDP msg from SL to the radio-app (target-port 9031) to set the radio to 87.5 MHz looks like this:
|
from=StationList;freq=87500000
|
|
The radio-app then tunes to 87.5 MHz sends back its actual set frequency to target-port 9030
|
from=radio-app-name;freq=87500000
|
has 2 or more fields sperated by ';'
|
fields unknown to the message-receiver are ignored
|
new fields for other purposes can be specified. They will not interfere with unaware message-receivers.
|
|
|
Each field consists of name and value separated by '='
|
field: name=value
|
|
numerical values are always using base units. (Hz instead of kHz or MHz)
|
|
The first field is always the name of the message-sender
|
from=name of device
|
|
Example:
|
from=StationList
|
|
freq=n in Hertz
|
|
freq=? requests radio to send current value, so SL can update its display
|
|
Example
|
from=StationList;freq=87500000 --> radio now tunes to 87.5MHz
|
|
from=radio-app-name;freq=87500000 --> SL updates its display to 87.5 MHz
|
|
negative values: radio uses automatic bandwidth mode
|
RDS
|
PI=HexValue
|
PTY=HexValue
|
ECC=HexValue
|
AF=Original-RDS-HexValues (*) (max 25 byte values)
|
PS=Original-RDS-HexValues (*) (max 8 byte values)
|
RT1=Original-RDS-HexValues (*) (max 64 byte values)
|
RT2=Original-RDS-HexValues (*) (max 64 byte values)
|
ClearRDS=1 Clears entire RDS data in SL (only in rare cases needed)
|
|
* = decoding is performed by SL
|
|
Example
|
PI=F705;PTY=56;ECC=E0;AF=12345678... (all in one string)
|
(values in Hex, in AF: Hex byte-wise)
|
RDS message is only sent when the content has changed against the previous msg.
|
SL automatically clears its RDS data on each frequency change, no matter who initiated that.
|
Refresh rate: not faster than 5x per second.
|
The Rx can send all RDS-items in one message, no need to send each item seperately.
|
|
Note about AF
|
The AF-Data is a 25 byte long FIFO buffer in the Rx that is constantly filled up with each new (not yet in buffer) AF packet the Rx receives, the oldest entry gets lost when the buffer gets full. According to RDS-Specs there are no more than 25 entries. I am not sure if this is strictly obbeyed, at least this amount is sufficient for SL to do AF-search in the database.
|
So the Rx should first check if the new rcv'ed AF-byte is already is in the buffer, if not then add it. All unused byte are set to zero. The Rx doesn't need to sort that buffer, SL does it.
|
|