Beacon e il pianificatore#
I beacon della propria stazione sono ciò che fa apparire la stazione su
aprs.fi. L’IGate e il digipeater da soli si limitano a ritrasmettere il traffico
che sentono; non annunciano mai la propria posizione. Esistono tre beacon logici
— tracker, igate e digi — ciascuno con i propri flag di abilitazione,
intervallo, coordinate, simbolo, commento e instradamento RF/INET, salvati dalla
rispettiva pagina dell’amministrazione web (g_config.trk_*,
g_config.igate_*, g_config.digi_*). A ogni beacon vengono filtrati i
caratteri | e ~ dal commento e dal testo di stato al momento della
trasmissione, prima che raggiungano il pacchetto in onda — entrambi sono
riservati al gruppo di telemetria nel commento in base 91
(Telemetria); il testo salvato resta esattamente come l’operatore lo ha
inserito.
Il pianificatore di beacon condiviso#
Tutte le trasmissioni periodiche della propria stazione girano su un solo
task FreeRTOS, beacon_sched, creato da beacon_scheduler_start()
(main/beacon_scheduler.c). A ogni passata il pianificatore chiama la funzione
«service» di ogni sottosistema — beacon_service() (i beacon di tracker, igate
e digi insieme), weather_beacon_service(), telemetry_beacon_service(),
query_capabilities_service(), bulletins_service() e
objitems_service() —, ciascuna delle quali trasmette ciò che è dovuto e
restituisce quanti secondi mancano prima che serva di nuovo. Il pianificatore
dorme poi fino al più vicino di questi, limitato da
BEACON_SCHED_POLL_CAP_S (30 s), così che un’abilitazione o un intervallo
modificati nell’amministrazione web abbiano effetto senza riavvio. I
sottosistemi conservano i propri flag di abilitazione e intervalli; solo il task,
e il suo stack, sono condivisi.
Condividere un unico task è ciò che mantiene il budget di stack a una sola
allocazione. Tutti quei servizi terminano nella stessa catena TX TNC2/AX.25
carica di virgola mobile — diversi snprintf() attraverso il formattatore di
newlib con supporto float, poi lat_lon_to_aprs() e
aprs_path_build_suffix() verso aprs_service_send_tnc2() →
modem_send_tnc2() → modem_build_frame_tnc2() →
ax25_encode()/hdlcFrame(), impilando diversi buffer da 300–450 byte per
livello — e vengono eseguiti in sequenza all’interno di una passata, quindi lo
stack viene riutilizzato tra loro e conta solo l’albero di chiamate più
profondo. Quell’albero è quello meteo, e BEACON_SCHED_TASK_STACK_BYTES è
dimensionato su di esso a 14336 byte con margine deliberato, non ridotto a un
minimo misurato. Il task registra il proprio
uxTaskGetStackHighWaterMark() a ESP_LOGD a ogni passata, che è la misura
da prendere prima di abbassare quella costante.
La primissima passata è trattenuta finché il modem RF non si dichiara pronto, o
al massimo per BEACON_SCHED_MODEM_WAIT_CAP_MS (6 s), a seconda di cosa
avviene prima. modem_init() blocca per circa cinque secondi calibrando il
clock reale dell’ADC ed è chiamata dopo che aprs_service_start() ha creato
questo task, quindi senza quell’attesa ogni beacon abilitato scadrebbe subito e
registrerebbe «modem not ready or busy» sulla gamba RF — e «not connected» su
quella INET — a ogni avvio. Il limite è ciò che fa comunque partire la
pianificazione su una scheda in cui il modem audio è disabilitato nella
configurazione e la notifica di pronto, di conseguenza, non arriva mai.
Le risposte alle query viaggiano sullo stesso task#
Una risposta a una query APRS è un beacon in tutto tranne che nel suo innesco:
?APRS? e ?APRSP eseguono il costruttore di posizione, ?APRSS quello
di stato, ?WX? quello meteo, e tutte finiscono nella stessa catena di TX
TNC2/AX.25 carica di virgola mobile. Per questo vengono servite anche qui.
query_process() e query_process_directed(), che girano sui task che
ricevono traffico, si limitano ad accodare la richiesta; lo scheduler chiama
query_service() all’inizio di ogni passata e svolge la costruzione e la
trasmissione sullo stack dimensionato per quell’albero di chiamate (vedi
Risponditore di query APRS).
Poiché una query non è periodica, attendere la scadenza del beacon successivo si
noterebbe come una risposta tardiva. Accodare una richiesta chiama quindi
beacon_scheduler_wake(), che accorcia il sonno dello scheduler — quel sonno è
un ulTaskNotifyTake() con la prossima scadenza come timeout e non un semplice
ritardo. Un risveglio sollevato mentre il task è nel mezzo di una passata viene
trattenuto da FreeRTOS e raccolto dal sonno successivo, così nulla di accodato
viene dormito.
Funzioni di servizio#
Ogni sottosistema espone una *_service() che:
Controlla i propri flag di abilitazione. Un beacon disabilitato è un no-op a basso costo che restituisce un intervallo di ri-controllo breve, così che attivarlo dal web abbia comunque effetto senza riavvio.
Trasmette qualsiasi beacon attualmente dovuto, in RF (
aprs_service_send_tnc2()) e/o ad APRS-IS (igate_send_raw()) secondo i flagloc2rf/loc2inetdella pagina.Restituisce il numero di secondi (sempre ≥ 1) fino al prossimo evento dovuto più vicino.
beacon_service() gestisce i tre beacon di posizione in una singola passata.
Un beacon abilitato su entrambe le tratte viene costruito due volte, una per
tratta, e le due righe differiscono in un solo punto: il percorso. La
trasmissione radio porta la selezione di digipeater fatta nella pagina di quel
beacon; la trasmissione via APRS-IS porta TCPIP* e nient’altro, che è quanto
la guida alla connessione di aprs-is.net richiede a un pacchetto originato
dal client: un alias WIDEn-N inviato lì descriverebbe ripetitori che il
pacchetto non ha mai attraversato. Entrambe le righe provengono dallo stesso
costruttore e dallo stesso snapshot di configurazione preso sotto lock, quindi
nient’altro può divergere fra loro, e ogni tratta è registrata per ciò che ha
davvero fatto invece che con un’unica riga incondizionata.
Jitter anti-collisione#
La pianificazione dei beacon è altrimenti deterministica, quindi più stazioni che
scelgono tutte lo stesso intervallo tondo (es. WX ogni 600 s) tendono a
sincronizzarsi in fase e a collidere su un canale RF condiviso — una classica
patologia APRS. beacon_scheduler_jitter() disperde il momento dovuto di un
beacon di ± una piccola percentuale (seminato con esp_random(), uniforme),
così che i beacon della propria stazione si decorrelano sia tra loro sia dalle
stazioni vicine, e i beacon dovuti simultaneamente derivano separandosi nel
tempo. Il jitter è applicato all’intervallo usato per calcolare il timestamp del
prossimo dovuto di un beacon — non semplicemente al sonno del pianificatore,
che lascerebbe la griglia temporale dei dovuti sottostante deterministica e le
permetterebbe di ri-sincronizzarsi al ciclo successivo.
Scaglionamento del TX dentro una passata#
Quando più beacon della propria stazione diventano dovuti insieme, vengono
serviti consecutivamente nel task del pianificatore, molto più velocemente di
quanto un frame a 1200 Bd liberi l’etere. Con il valore di fabbrica TX buffers =
1, il 2° e 3° frame urterebbero un anello TX RF pieno e verrebbero scartati. Per
evitarlo, il task del pianificatore si registra tramite
aprs_service_set_beacon_context(), e solo in quel task
aprs_service_send_tnc2() può attendere brevemente (fino a 4 s) che l’anello
scenda sotto il limite prima di arrendersi — così ogni beacon dovuto finisce per
attivare la radio, mentre tutti gli altri chiamanti (RX/digipeat, INET→RF, TX di
messaggi) mantengono il comportamento non bloccante di scarta-se-pieno e un ramo
RF occupato non ferma mai la decodifica RX né il socket APRS-IS.
Estensioni dati (PHG / RNG / DFS / DF)#
I beacon di posizione dell’IGate e del digipeater possono portare ciascuno una delle estensioni dati APRS da stazione fissa nello slot di 7 byte che segue il codice del simbolo — lo stesso slot che una stazione in movimento usa per rotta e velocità, ed è per questo che ne viene emessa sempre una sola. Abilita estensione dati nella pagina IGate o Digi apre lo slot di quel ruolo, e Tipo di estensione sceglie quale lo riempie. I due ruoli hanno impostazioni proprie, così un IGate e un digipeater sulla stessa stazione con SSID diversi possono pubblicare coperture diverse:
Tipo |
In onda |
Significato |
|---|---|---|
PHG |
|
Potenza di trasmissione, altezza dell’antenna sul terreno medio, guadagno e direttività. Il software ricevente disegna la copertura stimata risultante come un cerchio (o un lobo, con antenna direttiva). |
RNG |
|
Una singola portata radio omnidirezionale precalcolata in miglia terrestri, per un operatore che conosce già il proprio raggio di copertura reale e preferisce dichiararlo anziché farlo dedurre dal PHG. |
DFS |
|
Intensità del segnale omni-DF: gli stessi codici di altezza/guadagno/ direttività del PHG, ma riportando l’intensità del segnale ricevuto in punti S invece della potenza trasmessa. Un’intensità di 0 significa che questa stazione non riceve il segnale, e il software di tracciamento lo rappresenta come un cerchio di esclusione anziché di copertura. |
DF |
|
Il rapporto DF del cap.8 di APRS101: il rilevamento verso un segnale,
seguito dalla terna NRQ che lo qualifica — rilevazioni per periodo di
campionamento ( |
Il rapporto DF è l’unica estensione con un requisito di simbolo tutto suo. Il suo
token è di quindici byte dove lo slot ne ha sette, e il capitolo 8 afferma che il
rilevamento e l’NRQ sono significativi solo quando il rapporto porta il simbolo
DF — tabella dei simboli / e codice simbolo \. Un ricevitore che vede un
altro simbolo non ha motivo di guardare oltre lo slot: legge 000/000 come una
normale coppia rotta/velocità e prende /270/735 come i primi otto caratteri
del campo commento. Perciò il DF viene trasmesso solo con quella coppia di
simbolo; con qualsiasi altra lo slot resta vuoto, il log nomina il simbolo che ha
soppresso il rapporto e la pagina mostra una nota accanto al tipo di
estensione non appena i due non concordano. La stessa regola vale per oggetti e
item e in ricezione: una continuazione DF in arrivo viene sempre scavalcata così
da non finire mai nel commento, ma il suo rilevamento viene letto solo quando il
simbolo del trasmettitore è il simbolo DF.
PHG usa tutti e quattro i sottocampi, DFS tutti tranne la potenza di trasmissione, e RNG e DF nessuno — DF ha invece i propri input di rilevamento e NRQ; la pagina disabilita gli input che il tipo selezionato non usa. Poiché un controllo disabilitato non viene inviato nel POST, i valori memorizzati degli altri tipi sopravvivono al passaggio avanti e indietro.
Abilitare PHG, DFS o un rapporto DF che il simbolo consente forza il formato di posizione non compresso. Il formato compresso non ha spazio per lo slot di 7 byte (APRS101 cap.9 afferma che non supporta il PHG), e un rapporto DF è più largo dello slot stesso, quindi emettere quei byte dentro un rapporto compresso sarebbe semplicemente un dato sbagliato, e scartare l’estensione per mantenere la compressione perderebbe un campo che l’operatore ha abilitato esplicitamente. Il firmware registra un warning che nomina quale delle due impostazioni ha ceduto, invece di lasciarlo scoprire in onda. Un rapporto DF che il simbolo sopprime non mette byte nello slot, quindi non costa al beacon la sua compressione.
L’ambiguità di posizione è un’altra cosa e viaggia con ciascuna di esse: azzera cifre decimali del formato non compresso, che mantiene il suo slot di estensione, quindi nessuna delle due impostazioni deve cedere all’altra.
RNG è l’eccezione, perché il formato compresso porta nativamente una portata
radio precalcolata: i due byte cs contengono { seguito da una cifra di
portata, decodificata come 2 × 1,08^s miglia. Una baliza con RNG selezionato
e la compressione spuntata resta quindi compressa, con la portata ripiegata in
quei due byte e senza alcun token RNGrrrr nel campo informativo. La forma
compressa quantizza la portata a passi di circa l’8 per cento e parte da un
minimo di 2 miglia, quindi una portata impostata sotto quel valore viene
trasmessa come 2.
PHG è l’estensione che ci si aspetta da un digipeater. Il capitolo 7 la presenta come il modo in cui una stazione dichiara il cerchio di copertura su cui i vicini ragionano quando scelgono un percorso, e i client di mappa disegnano quel cerchio prima di tutto per i digipeater — per questo la pagina Digi offre gli stessi quattro tipi della pagina IGate, sulle proprie impostazioni, invece di lasciare vuoto lo slot di quel ruolo.
Il beacon Tracker porta PHG e nient’altro, attivato con Includi estensione dati PHG nella sua stessa pagina. Lì non ci sono sottocampi da compilare: i quattro valori sono i dati d’antenna della stazione stessa, modificati una volta sola nel blocco PHG della pagina Stazione. Un tracker che trasmette beacon in Mic-E mantiene il token — Mic-E non ha uno slot di 7 byte dopo il codice di simbolo, ma APRS 1.2 stabilisce che il suo campo di testo può portare un normale campo di commento di posizione, PHG incluso, ed è lì che va: dopo il blocco di frequenza, così una radio continua a sintonizzarsi automaticamente dai primi byte, e prima del commento dell’operatore.
Posizione GPS in tempo reale e rotta/velocità#
La posizione di ogni beacon usa per default la latitudine/longitudine/
altitudine fissa salvata nella propria pagina — l’unica modalità offerta dai
beacon di IGate e Digipeater. La pagina del beacon Tracker aggiunge un
ulteriore interruttore, Usa posizione GPS in tempo reale
(g_config.trk_use_live_gps), indipendente dalla casella Usa GPS
descritta sopra: mentre Usa GPS copia la posizione del ricevitore GNSS nei
campi fissi una sola volta, al salvataggio, Usa posizione GPS in tempo reale
fa sì che trackerBeaconService() (main/beacon.c) rilegga il ricevitore
— tramite gps_snapshot() (main/gps.c) — a ogni singola trasmissione, e
trasmetta quella latitudine/longitudine/altitudine in tempo reale al posto dei
valori fissi.
Una posizione in tempo reale viene usata solo quando è effettivamente valida:
gps_snapshot() deve riportare valid e has_position (il ricevitore
ha una soluzione RMC attiva, non scaduta oltre GPS_LINK_TIMEOUT_S).
Qualsiasi cosa al di sotto di questo — ricevitore spento, ancora in fase di
acquisizione, o collegamento silenzioso — lascia i parametri del beacon
esattamente come letti da g_config.trk_lat/trk_lon/trk_alt, così
il Tracker continua a trasmettere la sua posizione fissa di riserva invece di
saltare una trasmissione o inviarne una scaduta. L’altitudine viene sostituita
solo quando il flag has_altitude del ricevitore stesso è impostato, dato
che una posizione 2D non porta alcuna altitudine da fornire.
Quando il ricevitore riporta anche rotta e velocità per quella stessa lettura
(has_course e has_speed entrambi impostati), il beacon Tracker li porta
a sua volta, nel formato scelto:
Non compresso — l’estensione dati standard
CSE/SPD("%03u/%03u", gradi veri e nodi), nello stesso slot di 7 byte occupato da PHG/RNG/DFS/DF. Un’estensione PHG attiva ha comunque priorità su CSE/SPD per quello slot, la stessa precedenza che Oggetti/Item danno a PHG rispetto al CSE/SPD proprio di un elemento in movimento.Compresso — ripiegato nello slot a due byte proprio del campo compresso (
cs/T) tramiteaprs_compressed_cs_from_course_speed(), lo stesso codificatore usato da Oggetti/Item per un elemento in movimento. Una portata radio precalcolata ha comunque priorità su rotta/velocità per quello slot, perché RNG è un’impostazione che l’operatore ha attivato esplicitamente e non ha altrove dove andare; rotta/velocità cede il passo allo stesso modo dell’altitudine.Mic-E — la coppia reale di rotta/velocità, al posto dello «sconosciuto»
000/000che invia ogni beacon a posizione fissa (e una posizione in tempo reale senza rotta/velocità riportate in quel ciclo).
La velocità viene convertita dai km/h del ricevitore (gps_data_t::speed_kmh)
ai nodi in cui sono definiti tutti questi campi, usando lo stesso fattore 1.852
che gps.c applica già nel verso opposto quando interpreta una velocità NMEA
in nodi nello snapshot.
Smart Beaconing#
SmartBeaconing (g_config.trk_sb_enable, pagina Tracker) accorcia o
allunga automaticamente l’intervallo del beacon Tracker in base alla
velocità attuale, e forza un beacon anticipato in presenza di un
cambiamento di rotta sufficientemente marcato, seguendo l’algoritmo
standard pubblicato da Hans-Gunnar Lundahl e implementato da HamHUD e
dalla maggior parte dei tracker moderni. Ha effetto solo insieme a Usa
posizione GPS in tempo reale descritto sopra: SmartBeaconing non ha
velocità né rotta su cui lavorare senza una posizione in tempo reale, e il
beacon Tracker torna all’intervallo fisso trk_interval ogni volta che
non ne è disponibile una - lo stesso ripiego che Usa posizione GPS in
tempo reale applica già alla posizione.
Frequenza dinamica#
Tra le due soglie di velocità seguenti, smartBeaconingInterval()
(main/beacon.c) interpola linearmente l’intervallo del beacon dal
valore lento al valore veloce man mano che la velocità aumenta:
Impostazione |
Significato |
|---|---|
Intervallo lento |
Periodo del beacon usato a o sotto la Velocità bassa - la cadenza per una stazione ferma o in movimento lento (valore di fabbrica: 600 s). |
Intervallo veloce |
Periodo del beacon usato a o sopra la Velocità alta (valore di fabbrica: 60 s). |
Velocità bassa / Velocità alta |
Le due soglie di velocità, km/h, che delimitano l’interpolazione. Una posizione in tempo reale senza rotta/velocità riportate in quel ciclo (ancora in acquisizione, o un ricevitore che omette la rotta a velocità zero) viene trattata come frequenza lenta. |
Corner-pegging#
Indipendentemente dalla frequenza sopra, trackerBeaconService()
interroga la posizione in tempo reale ogni pochi secondi alla ricerca di
un cambiamento di rotta rispetto all’ultimo beacon trasmesso e, non
appena questo supera la soglia di svolta, anticipa la prossima
trasmissione a quel ciclo invece di attendere che l’intervallo sopra
trascorra - il comportamento classico di SmartBeaconing di un tracker che
segnala visibilmente la curva che sta percorrendo, invece di segnalare
una posizione solo più avanti sulla nuova strada. La soglia stessa si
allarga a bassa velocità e si restringe ad alta velocità:
soglia (gradi) = Angolo di svolta + Pendenza di svolta / velocità (km/h)
per cui una stazione veloce attiva il corner-pegging con un cambiamento di rotta molto più piccolo rispetto a una lenta - Pendenza di svolta è ciò che rende innocuo il normale rumore di rotta a bassa velocità (manovre in un parcheggio, una lettura di rotta GPS che oscilla da fermi) senza per questo attenuare il rilevamento delle curve ad alta velocità. Tempo minimo tra svolte rifiuta inoltre un secondo beacon da corner-pegging entro quel numero di secondi dall’ultimo, indipendentemente da quanto marcato appaia il nuovo cambiamento di rotta, così che una stazione lenta o momentaneamente ferma con una lettura di rotta rumorosa non possa riattivare il corner-pegging a ogni ciclo.
Impostazione |
Significato |
|---|---|
Angolo di svolta |
Cambiamento minimo di rotta, in gradi, che attiva una svolta a o sopra la soglia di velocità alta (valore di fabbrica: 25°). |
Pendenza di svolta |
Gradi aggiunti a Angolo di svolta, scalati in modo inversamente proporzionale alla velocità attuale, allargando la soglia effettiva a bassa velocità (valore di fabbrica: 255°). |
Tempo minimo tra svolte |
Intervallo minimo, in secondi, consentito tra due beacon da corner-pegging (valore di fabbrica: 15 s). |
Una trasmissione inviata per qualsiasi motivo - l’intervallo di frequenza, o il corner-pegging - aggiorna il riferimento del corner-pegging, cosicché un beacon appena inviato per una rotta non riattivi subito il corner-pegging sulla stessa rotta.
Altitudine compressa#
Un rapporto di posizione compresso non ha un token di commento per l’altitudine,
ma non gli serve. Gli stessi due byte cs che portano rotta/velocità o una
portata radio portano un’altitudine quando il byte di tipo dichiara GGA come
sorgente NMEA, decodificata come 1,002^(c × 91 + s) piedi. Un beacon con
Includi altitudine e Comprimi posizione entrambe spuntate usa quella forma, e
il token /A= viene omesso dal commento, così l’altitudine è dichiarata una
volta sola — nove byte di commento risparmiati in cambio di nulla, con un passo
di circa lo 0,2 %.
I due byte portano una cosa per volta, quindi un beacon che abbia anche RNG
selezionato li cede alla portata: la portata non ha altro posto dove andare,
mentre l’altitudine ha ancora /A= come ripiego, ed è questo che un beacon
del genere emette.
Sovrapposizioni numeriche in un rapporto compresso#
Una sovrapposizione di simbolo si scrive nella posizione di tabella della coppia
di simbolo, e APRS 1.2 cap.21 ammette che sia una lettera A-Z o una
cifra 0-9: quelle numeriche sono il modo in cui un digipeater annuncia la
propria politica di instradamento, il «cerchio numerato» della tabella
alternativa. Il formato compresso non può portare la cifra in sé: il primo byte
di un campo di posizione è proprio ciò che dice a un ricevitore quale dei due
formati sta leggendo, e una cifra iniziale significa non compresso.
Per questo una sovrapposizione numerica viaggia come la lettera minuscola
corrispondente, a per 0 fino a j per 9, e il ricevitore la
rimappa sulla cifra. Il firmware applica quella mappatura mentre costruisce il
campo, così la sovrapposizione si configura una volta sola, come cifra, e la
spunta Comprimi posizione non cambia nulla né di come si inserisce né di come
viene tracciata.
Anche i due byte della coppia sono limitati in ingresso — nel modulo e di nuovo
alla lettura del file di configurazione — perché nessuno dei due è cosmetico: un
identificatore di tabella fuori da /, \, A-Z e 0-9
ripiega sulla tabella primaria, e un codice fuori dall’intervallo stampabile
ripiega su &.
La capacità di messaggistica sta nell’identificatore di tipo dati#
Il primo byte del campo informativo di un rapporto di posizione dichiara due cose insieme (APRS101 cap.6): se segue una marca temporale, e se la stazione può accettare messaggi APRS.
Marca temporale |
|
|
Significato |
|---|---|---|---|
No |
|
|
Posizione, senza marca temporale |
Sì |
|
|
Posizione con marca temporale |
La distinzione non è decorativa: è così che un client ricevente decide se offrire al proprio operatore l’azione invia messaggio per quella stazione. Le radio Kenwood TH-D7/D700/D710, APRSISCE/32, Xastir, YAAC e aprs.fi leggono tutte questo bit, e una stazione che dichiara di non accettare messaggi viene mostrata senza alcuna via di risposta.
Questa stazione esegue un motore di messaggistica completo, risponde alle query
dirette e conferma i messaggi che riceve, quindi con Abilita messaggistica
attivo tutte e tre le balise di posizione lo dichiarano. L’identificatore viene
scelto in buildPositionPacket() dalla stessa copia sotto lock da cui
provengono tutti gli altri campi della balise. Oggetti e item non sono toccati —
portano i propri identificatori ; e ). Mic-E dichiara la stessa cosa in
un altro punto: la sua posizione viaggia nell’indirizzo di destinazione AX.25,
quindi non gli avanza un identificatore di tipo di dato, e il flag di capacità
di messaggistica è portato dal byte TYPE (`` ` `` capace di messaggi, '
tracker a senso unico) che segue il byte della tabella dei simboli. Entrambi i
formati leggono la stessa spunta Abilita messaggistica, quindi non possono
contraddirsi su ciò che questa stazione dichiara.
Commento di posizione Mic-E#
Un rapporto Mic-E porta, nei bit A/B/C del suo indirizzo di destinazione, uno di quindici commenti di posizione: i sette valori standard M0 Off Duty, M1 En Route, M2 In Service, M3 Returning, M4 Committed, M5 Special e M6 Priority; sette valori personalizzati di definizione locale C0–C6; ed Emergency, che è lo schema con tutti e tre i bit a zero. Ogni radio APRS Kenwood e Yaesu lo espone in un menu del pannello frontale, e i client riceventi lo mostrano accanto alla stazione.
Commento di posizione Mic-E, nella pagina Tracker, sceglie fra i quattordici valori standard e personalizzati. Si applica solo quando Codifica posizione Mic-E è attiva, perché nessun altro formato ha un campo per esso, e il valore di fabbrica è M0 Off Duty: quello convenzionale per una stazione che non si muove, che è ciò che questo firmware trasmette.
Emergency è deliberatamente assente da quell’elenco. Trasmetterlo chiede ad altri operatori, e in alcune regioni ai servizi di emergenza, di rispondere a un’emergenza reale; non è qualcosa che una pagina di configurazione debba poter attivare con un clic sbagliato e lasciare attivo per tutti i beacon successivi. In ricezione è gestito per intero: vedere Filtraggio per il decodificatore, e il registro del traffico per la riga di avviso che un’emergenza ricevuta produce.
Testo di stato Mic-E#
La coda di testo libero del campo informazioni Mic-E — tutto ciò che segue il
blocco di frequenza, il token PHG/estensione dati e il campo altitudine —
porta, byte per byte, ciò che l’operatore ha scritto come commento del
beacon. L’unica eccezione è il primo byte di quella coda: APRS12c cap.10
riserva una , o 0x1d iniziale al sottoformato Mic-E Telemetry Data
(ormai obsoleto), quindi un commento che iniziasse con uno di quei due byte
verrebbe letto come telemetria anziché come testo. aprs_mice_encode() si
protegge da questo inserendo un singolo spazio prima di uno di quei
caratteri prima di aggiungere il commento; un commento che inizia con
qualsiasi altro byte arriva in aria invariato. Lo spazio inserito non porta
informazione propria e un client ricevente lo mostra come un normale spazio
iniziale del commento.
Direzione d’antenna ed ERP nei rapporti di stato#
Un rapporto di stato può terminare con due caratteri dopo un ^: la direzione
d’antenna in unità di dieci gradi, e un codice che rappresenta la potenza
irradiata efficace. L’operatività in meteor scatter è la ragione d’essere della
coppia — le due cifre che serve a un corrispondente per sapere se vale la pena
aspettare un burst — e APRS101 cap.16 la fissa come ultimo campo del testo di
stato, che è l’unico posto in cui può essere riconosciuta.
Entrambe le metà si impostano nella pagina Stazione e valgono per tutta la stazione, come l’opzione Maidenhead: Direzione antenna nei rapporti di stato avanza di dieci gradi da 0 a 350, ed ERP nei rapporti di stato offre la tabella della specifica stessa, da 10 W a 7290 W nei passi che seguono il quadrato della cifra del codice. Una direzione senza potenza, o una potenza senza direzione, non dice nulla, quindi il blocco viene emesso solo quando entrambe sono impostate — lasciarne una su Off è ciò che fa una stazione che non lavora in meteor scatter, e allora trasmette esattamente il rapporto di stato che trasmetteva prima.
Il campo informativo di stato ha un tetto di 63 byte, e l’assemblaggio scarta i suoi blocchi opzionali in ordine finché non entra: prima il campo iniziale, poi il blocco di frequenza. La coppia direzione/ERP non viene mai scartata. Sono tre byte, e una stazione che trasmette un rapporto di stato durante un appuntamento di meteor scatter lo trasmette proprio per quei tre byte.
Ambiguità di posizione#
Ambiguità di posizione, nella pagina Stazione, vale per tutta la stazione: si applica a tutti e tre i beacon di posizione, perché con quanta precisione una stazione è disposta a dire dove si trova è una proprietà della stazione e non di un singolo beacon. I livelli 0–4 svuotano le cifre di minuto meno significative in onda (APRS101 cap.6) — il punto decimale, il carattere di emisfero e le larghezze dei campi non cambiano mai, ed è questo che mantiene il rapporto analizzabile:
Livello |
Latitudine |
Longitudine |
Precisione |
|---|---|---|---|
0 |
|
|
Centesimi di minuto (piena). |
1 |
|
|
Al 1/10 di minuto. |
2 |
|
|
Al minuto. |
3 |
|
|
Ai 10 minuti. |
4 |
|
|
Al grado. |
Le cifre vengono svuotate, mai arrotondate via, come fanno i decodificatori di riferimento che leggono una cifra svuotata come «sconosciuta». Il riporto di grado descritto sopra si applica prima, quindi una coordinata i cui minuti danno un 60.00 pieno per errore in virgola mobile al limite di un grado viene riportata nel grado successivo e non in quello precedente.
Un livello diverso da zero forza anche il formato non compresso, per lo stesso tipo di motivo di un’estensione dati: il formato compresso non ha cifre decimali da svuotare, quindi rispettare una spunta di compresso insieme all’ambiguità trasmetterebbe la posizione esatta che l’operatore ha chiesto di nascondere. Mic-E, invece, porta l’ambiguità in modo nativo e non ha bisogno di questo ripiego.
L’estensione di precisione !DAO!#
Estensione DAO nella pagina Station è una seconda impostazione di
precisione, a livello di stazione, che si affianca all’ambiguità invece di
sostituirla. Quando è attiva, aprs_dao_build() aggiunge l’estensione di
precisione/datum !DAO! nella sua forma leggibile (WGS-84,
aprs12/datum.txt) al commento di ogni rapporto di posizione non
compresso e al campo di testo Mic-E, dove lo standard riserva la stessa
posizione finale. I cinque byte recuperano, come una cifra decimale in più
per asse, la terza cifra dei minuti che i campi semplici
DDMM.mmN/DDDMM.mmW troncano via — un ordine di grandezza in più
di precisione rispetto a quella che il formato non compresso porta da solo,
pari alla risoluzione in virgola mobile di latitudine/longitudine di questo
firmware. Il campo base e questa cifra extra sono due viste di un’unica
misura della coordinata — entrambi leggono la divisione gradi/minuti di
main/include/aprs_minutes.h, come i byte di posizione Mic-E — quindi un
ricevitore che risomma la cifra resta sempre entro mezzo millesimo di minuto,
circa 0,9 m, dalla posizione reale, e mai più lontano di quanto lo sia il solo
campo base.
firmware.
Poiché ripristina precisione, !DAO! viene applicata solo quando
Position ambiguity è 0 e il formato non è quello compresso: una stazione
che nasconde deliberatamente la propria posizione, o che invia già
coordinate compresse a piena risoluzione, non deve recuperare quella
risoluzione tramite questa estensione. Un ricevitore che non riconosce
l’estensione vede semplicemente cinque byte in più di testo nel commento,
quindi è sempre sicuro attivarla.
Il marcatore di non archiviazione !x!#
Richiedi ad APRS-IS di non archiviare i miei pacchetti, nella pagina
Stazione, è un’impostazione di privacy valida per tutta la stazione,
disattivata per impostazione predefinita. Se attivata, ogni campo di testo
libero proprio viene preceduto dal marcatore di non archiviazione di APRS-IS,
!x!, seguito da uno spazio e poi dal testo dell’operatore, se presente. Il
marcatore è indirizzato ai database dietro APRS-IS, non a un gateway: chiede
loro di non memorizzare il pacchetto, ma non lo trattiene da RF né da APRS-IS
stesso, e un ricevitore che non lo riconosce vede semplicemente tre byte in
più di testo nel commento.
I campi che raggiunge sono:
i commenti di posizione di Tracker, IGate e Digipeater,
i testi di stato di Tracker, IGate e Digipeater,
il commento del rapporto meteorologico, in tutte e quattro le sue forme (oggetto, posizionata con e senza marca temporale, e senza posizione),
i commenti di oggetti e item,
il testo di bollettini e annunci.
Tre tipi di pacchetto restano fuori deliberatamente. Il testo di un messaggio
non è testo descrittivo su questa stazione: è una parola che il
corrispondente legge nel corpo di un messaggio a lui indirizzato. I pacchetti
di definizione della telemetria PARM/UNIT/EQNS/BITS sono
metadati a formato fisso, senza spazio per testo libero e con un budget di
cui la definizione stessa ha bisogno. Le risposte alle interrogazioni
rispondono alla domanda di un’altra stazione anziché riportare la posizione o
lo stato di questa.
Tutti questi campi sono costruiti da un unico builder condiviso,
aprs_free_text_build() in main/include/aprs_free_text.h, che applica
il marcatore e rimuove i caratteri che APRS riserva al gruppo di telemetria
di commento in base 91 (| e ~) nello stesso punto. Un campo in cui
l’operatore ha già scritto il marcatore viene lasciato intatto, quindi il
marcatore non viene mai inviato due volte.
Questa impostazione influisce solo sui pacchetti che questa stazione origina. Un pacchetto che questa stazione ritrasmette, sia esso da IGate a RF, da RF a IGate o digipetuto, viene passato invariato; il marcatore, se la stazione di origine lo aveva già inserito, viaggia comunque con esso, perché la ritrasmissione non riscrive mai i byte del payload.
Localizzatore Maidenhead nei rapporti di stato#
Localizzatore Maidenhead nei rapporti di stato, anch’esso valido per tutta la
stazione nella pagina Stazione, antepone a ogni rapporto di stato il
localizzatore della posizione propria di quel beacon, il byte della tabella dei
simboli e il codice del simbolo — la forma >IO91SX/G di APRS101 cap.16 —
seguito da uno spazio e dal testo di stato configurato. I ricevitori che
comprendono la forma posizionano la stazione con il solo localizzatore; gli
altri mostrano il tutto come testo di stato. Il testo configurato non viene mai
interpretato. Il localizzatore è sempre il campo fisso di 6 caratteri, in
maiuscolo.
APRS101 cap.16 ammette un solo campo iniziale nel campo informativo di un
rapporto di stato: il timestamp DHM oppure il localizzatore Maidenhead, mai
entrambi insieme — un ricevitore legge ciò che segue immediatamente il DTI
> come il localizzatore, quindi un timestamp in quella posizione verrebbe
letto erroneamente come tale. Quando Timestamp di stato e Localizzatore
Maidenhead nei rapporti di stato sono entrambi attivi sullo stesso beacon, il
localizzatore ha la precedenza e il timestamp viene omesso dai rapporti di
stato di quel beacon, poiché il localizzatore porta la posizione della
stazione, cosa che il timestamp non porta.
Budget di lunghezza del rapporto di stato#
APRS101 cap.16 limita il campo informativo di un rapporto di stato a 63 byte:
il DTI >, seguito da un timestamp DHM opzionale di 7 caratteri e al
massimo 55 caratteri di testo di stato, oppure senza timestamp e al massimo 62
caratteri di testo di stato. Tutto ciò che il rapporto può portare oltre alle
parole dell’operatore viene preso dallo stesso budget — il campo iniziale (il
timestamp, oppure il localizzatore Maidenhead quando ha la precedenza) e il
blocco di frequenza — e un testo di stato completo di 49 caratteri più
entrambi i blocchi opzionali chiede più di quanto entri.
Quando questo accade i blocchi opzionali vengono scartati, in quest’ordine, fino a che il campo entra:
il campo iniziale (il localizzatore Maidenhead, oppure il timestamp quando non si usa il localizzatore), che si limita a ripetere informazioni che questa stazione già trasmette altrove — la propria posizione o l’ora corrente;
il blocco di frequenza, l’unica parte del rapporto su cui una radio ricevente può agire.
Il testo di stato configurato non viene mai accorciato: è ciò per cui il rapporto esiste. Se non entra nemmeno da solo, l’intero rapporto viene rifiutato e il motivo registrato, invece di mettere in aria una riga di stato troncata — e quindi malformata.
Lo spazio separatore che precede il testo di stato appartiene al blocco che lo
precede, quindi viene scartato insieme a quel blocco: un rapporto rimasto senza
campo iniziale e senza blocco di frequenza — perché non ne è stato configurato
alcuno, oppure perché il budget qui sopra li ha tolti entrambi — esce come
>Il mio testo di stato, con le parole dell’operatore subito dopo il DTI
>, che è la forma definita da APRS101 cap.16. Lo spazio compare solo fra due
elementi entrambi presenti.
Blocco di frequenza#
Quando un beacon ha una frequenza di monitoraggio configurata, sia il suo
commento di posizione sia il suo rapporto di stato iniziano con il campo fisso
di 10 byte della frequenza di freqspec.txt, seguito dal tono
(Tnnn/Toff) e, per un ripetitore duplex, dallo shift in unità di 10 kHz.
Quale delle tre forme definite dalla specifica venga usata dipende solo dalla
frequenza:
Frequenza |
Emesso |
Forma |
|---|---|---|
Sotto i 100 MHz |
`` 50.62 MHz`` |
Forma da 10 kHz |
100.000-999.999 MHz |
|
Forma da 1 kHz |
Sopra i 999.999 MHz |
|
Designazione a lettera per le microonde, una lettera per blocco da 100 MHz |
La tabella delle lettere copre solo le bande che freqspec.txt enumera:
A (1200), B (2300), C (2400), D (3400), E (5600), F (5700), G (5800), H (10100),
I (10200), J (10300), K (10400), L (10500), M (24000), N (24100) e O (24200),
ciascuna estesa dalla sua base più 99 MHz. Una frequenza sopra i 999.999 MHz
fuori da tutte queste non ha alcuna forma da 10 byte, quindi nessun blocco viene
emesso e l’omissione viene registrata — un campo da 11 byte sposterebbe ogni
byte che un ricevitore legge dopo di esso.
I beacon della propria stazione (questa sezione) emettono sempre la forma
semplice a tono CTCSS, poiché g_config non ha una fonte per DCS/banda
stretta/RX separata; il blocco ripetitore di Oggetti/Elementi qui sotto è
dove l’operatore può scegliere questi tre sub-campi aggiuntivi.
Sub-campi ripetitore di Oggetti/Elementi#
Il blocco ripetitore della pagina «Oggetti ed Elementi» costruisce lo stesso
campo fisso da 10 byte della frequenza descritto sopra, più altri tre
sub-campi di freqspec.txt che un elemento può attivare:
Sub-campo |
Esempio |
Significato |
|---|---|---|
Codice DCS |
|
Sostituisce il sub-campo del tono CTCSS con un codice DCS (tre cifre ottali); i due condividono uno stesso spazio e sono mutuamente esclusivi. |
Flag banda stretta |
|
Rende minuscola la lettera iniziale del sub-campo tono/DCS (“T”/”D” diventa “t”/”d”) per segnalare la modulazione a banda stretta; non ha altro effetto sull’aria. |
Frequenza di ricezione separata |
|
Un secondo campo indipendente da 10 byte (definito solo nella forma 100.000-999.999 MHz) emesso subito dopo la frequenza primaria (di trasmissione), per un ripetitore la cui frequenza di ricezione non è lo shift duplex standard - ad esempio un ripetitore cross-band. |
Tutti e tre sono disattivati per impostazione predefinita, nel qual caso il blocco è, byte per byte, la stessa forma da 10 byte di frequenza più tono CTCSS costruita dai beacon della propria stazione descritti sopra.
I timestamp sono UTC#
I timestamp dei beacon sono zulu/UTC (051200z) secondo la specifica APRS —
per cui time_sync.c imposta l’orologio di sistema su TZ=UTC0 e non lo riscrive
mai. Il selettore di fuso orario della pagina System applica uno scostamento
fisso rispetto a UTC alla data e all’ora che l’amministrazione web mostra e a
nient’altro: l’orologio di sistema, ogni marca temporale APRS e ogni altra
formattazione di orario del firmware restano in UTC qualunque sia il suo
valore.