Maskinoversættelse, ikke gennemgået af en modersmålstalende. Engelsk er referencen.

Modtagertillid og maritimRedigér på GitHubKilde: docs/NMEA-TRAINING.md

NMEA-træningsstrømme: kshana nmea-scenario

Søfartsskoler og simulatorcentre kan føre NMEA 0183 genereret af Kshana ind i en brosimulator eller en kortplotter for at træne besætninger i at genkende GNSS-jamming og spoofing.

Kun til træning og test. De genererede strømme er syntetiske. De må aldrig føres ind i et fartøjs levende navigationssystemer. Kshana er vejledende, ikke typegodkendt navigationsudstyr. Hver strøm starter med og gentager hvert tiende sekund en proprietær markørsætning, $PKSHT,TRAINING,SYNTHETIC,NOT-FOR-NAVIGATION, som modtagere ignorerer; --no-marker fjerner den til en simulator, der afviser ukendte sætninger. Dette skriver kun NMEA-tekst: der er intet RF-, IQ- eller bølgeformsoutput, og intet sender andet end teksten til den adresse, du angiver.

Træningsstrøm fra scenariet coastal-drag-off (motor v0.40.0, seed 22, 25 minutter med én positionsbestemmelse pr. 10 s fra instruktørloggen). Et kort viser fartøjets sande spor og det spor, modtageren rapporterer: de er enige, indtil en indskrevet positions-drag-off begynder ved 421 s; det rapporterede spor driver derefter væk fra det sande, mens modtageren beholder en gyldig positionsbestemmelse, og springer tilbage, når hændelsen slutter ved 1140 s. Ved siden af ses afstanden mellem de to spor over tid og den gennemsnitlige bærebølge-til-støj-tæthed, som modtageren rapporterer, og som stiger til ét forhøjet niveau, så længe hændelsen varer. Syntetiske træningsdata genereret af Kshana. Kun til træning og test: før aldrig denne strøm ind i et fartøjs levende navigationssystemer. Vejledende, ikke typegodkendt navigationsudstyr. Vejledende software, ikke typegodkendt navigationsudstyr (IEC 61108, IEC 61162): operatøren er fortsat ansvarlig for fartøjets navigation. Positioner, datoer og spor er opfundne.Træningsstrøm fra scenariet coastal-drag-off (motor v0.40.0, seed 22, 25 minutter med én positionsbestemmelse pr. 10 s fra instruktørloggen). Et kort viser fartøjets sande spor og det spor, modtageren rapporterer: de er enige, indtil en indskrevet positions-drag-off begynder ved 421 s; det rapporterede spor driver derefter væk fra det sande, mens modtageren beholder en gyldig positionsbestemmelse, og springer tilbage, når hændelsen slutter ved 1140 s. Ved siden af ses afstanden mellem de to spor over tid og den gennemsnitlige bærebølge-til-støj-tæthed, som modtageren rapporterer, og som stiger til ét forhøjet niveau, så længe hændelsen varer. Syntetiske træningsdata genereret af Kshana. Kun til træning og test: før aldrig denne strøm ind i et fartøjs levende navigationssystemer. Vejledende, ikke typegodkendt navigationsudstyr. Vejledende software, ikke typegodkendt navigationsudstyr (IEC 61108, IEC 61162): operatøren er fortsat ansvarlig for fartøjets navigation. Positioner, datoer og spor er opfundne.

Figuren er tegnet ud fra instruktørloggen for scenarios/training/coastal-drag-off.toml.

Brug#

# write a file (default <name>.nmea) and the instructor log next to it
kshana nmea-scenario scenarios/training/coastal-drag-off.toml --out drag.nmea

# serve over TCP in real time on this machine only (waits for the simulator to connect)
kshana nmea-scenario scenarios/training/open-sea-jamming.toml --tcp 10110

# reachable from the bridge-simulator host: name the address in full
kshana nmea-scenario scenarios/training/open-sea-jamming.toml --tcp 192.168.1.20:10110

# UDP, one sentence per datagram, ten times faster than real time
kshana nmea-scenario scenarios/training/combined-event.toml --udp 192.168.1.50:10110 --speed 10

# UDP broadcast
kshana nmea-scenario scenarios/training/combined-event.toml --udp 192.168.1.255:10110 --broadcast
Indstilling Betydning
--out <file> skriv strømmen til en fil; uden netværksoutput er standarden <name>.nmea
--instructor-log <prefix> skriv <prefix>.instructor.json og <prefix>.instructor.txt (standard: ved siden af filen)
--tcp <addr:port> eller <port> TCP-server; kørslen starter, når en klient har forbundet (--wait-clients <n>). En enkelt port lytter kun på 127.0.0.1
--udp <addr:port> eller <port> UDP, én sætning pr. datagram; --broadcast tillader en broadcast-adresse. En enkelt port sender til 127.0.0.1
--realtime, --speed <x> styr tempoet for strømmen; --speed 0 er så hurtigt som muligt. Netværksoutput kører som standard i realtid, filer så hurtigt som muligt
--seed <n> erstat scenariets seed
--no-marker udelad markørsætningen

Der er ingen autentificering. En TCP-server med en ikke-lokal adresse leverer strømmen til enhver, der kan nå den, og UDP sender til den adresse, du angiver. En TCP-klient, der ikke henter sine data inden for to sekunder, bliver droppet, så én gået i stå forbruger ikke kan holde de andre tilbage.

Det samme seed giver de samme bytes på én platform, og tempoet ændrer aldrig bytes. På tværs af platforme er generatorens egen aritmetik bitidentisk (den bruger det portable matematiklag), men satellitpositioner og elevationsvinkler kommer fra motorfunktioner, der kalder værtens matematikbibliotek, så i et sjældent grænsetilfælde kan et afrundet ciffer for elevation, azimut eller C/N0 i GSV afvige mellem platforme.

Hvad der skrives#

Hver epoke (1, 2, 5 eller 10 pr. sekund) indeholder: RMC, GGA, GNS (positionsbestemmelse, position, tid), GSA (anvendte satellitter og DOP, én pr. konstellation), GSV (satellitter i sigte med elevation, azimut og SNR i dB-Hz, ét sæt pr. konstellation, NMEA 4,10-signal-ID), VTG (kurs og fart over grunden), ZDA (tid og dato), HDT (gyrokurs) og VBW (fart gennem vandet og over grunden fra loggen). Taleren er GN ved flere konstellationer, ellers konstellationens egen. Linjerne slutter med CRLF og har gyldig kontrolsum.

HDT og VBW træder i stedet for uafhængige sensorer (et gyrokompas og en Doppler-log). Ingen hændelse berører dem, hvilket er bevidst: forskellen mellem det, GNSS rapporterer, og det, gyroen og loggen siger, er et signal til debriefingen.

Når positionsbestemmelsen går tabt, er GGA-kvaliteten 0, RMC-status er V, positionsfelterne er tomme, og tidsfelterne fortsætter (modtagerens ur kører videre), som rigtige modtagere gør.

Fartøjet#

[vessel] og [[waypoint]] angiver en startposition, en fart og de punkter, der skal styres igennem. Fartøjet styres mod det næste waypoint under en grænse for drejehastighed (max_rot_deg_per_min, standard 30), en grænse for, hvor hurtigt drejehastigheden kan opbygges (max_rot_accel_deg_per_s2), og en grænse for fartændring (max_accel_kn_per_min). Et etapes fart er waypointets speed_kn. [environment] tilføjer en strøm, så farten over grunden afviger fra farten gennem vandet, og kursen afviger fra kursen over grunden, samt en magnetisk misvisning. stop_at_end bringer fartøjet til standsning ved det sidste waypoint.

Satellitgeometri#

Satellitterne kommer fra motorens egne nominelle konstellationer (GPS-slottabel, Galileo- og BeiDou-MEO-Walker-mønstre, GLONASS ICD), propageret af constellation::satellite_positions_fixed (tolegemeproblem plus sekulær J2, jordrotation) og set fra fartøjet med motorens WGS-84-elevationsvinkler. Det synlige antal, elevationer og azimutter i GSV er plausible for stedet og tidspunktet på dagen. Dette er en nominel himmel, ikke en efemeride for strømmens dato: PRN'er tildeles i slotrækkefølge, og hver konstellation bevarer sin offentliggjorte slotopbygning, propageret kontinuerligt fra GPS-slottabellens epoke (2016-12-31) under J2, så opbygningen er intakt, men dens orientering er ikke den virkelige himmels på strømmens dato. C/N0 følger elevationen (et nominelt zenitniveau, angivet i [receiver]) med et fast offset pr. satellit, langsom fading og støj. En satellit under track_threshold_dbhz har et tomt SNR-felt; en under use_threshold_dbhz spores, men anvendes ikke. Op til max_used (standard 12, NMEA GGA's loft) anvendelige satellitter bruges, valgt efter geometri (den højeste satellit i hver 30 graders azimutsektor først). Færre end fire anvendelige satellitter mister positionsbestemmelsen, og den vender tilbage efter reacquire_s med anvendeligt signal.

Hændelser#

Hver [[event]] har en kind, et indsættelsestidspunkt start_s, en duration_s (fra indsættelsen til starten af udløsningen), en indsættelsesrampe ramp_s og en udløsningsrampe recovery_s. Styrken stiger lineært over ramp_s, holdes og falder derefter over recovery_s; 0 er et trin. Alle effekter skalerer med denne styrke. Parametre, der ikke hører til typen, afvises.

kind parametre virkning
jamming cn0_drop_db, spread_db (standard 6) hver satellits C/N0 falder med op til cn0_drop_db (spredning pr. satellit), satellitter falder fra, laveste først, positionsbestemmelsen går tabt, når færre end fire er anvendelige, og vender tilbage efter udløsningen og reacquire_s
drag-off final_offset_m, én af bearing_deg (sand) eller relative_bearing_deg (til kursen ved indsættelsen, derefter fastholdt), valgfri max_accel_mps2, counterfeit_cn0_dbhz modtageren beholder en gyldig positionsbestemmelse, hvis position driver væk fra sandheden; SOG og COG omfatter driften. Driften følger smoothstep på rampene, så det falske spor starter og stopper uden hastighedstrin; dens toppe er 1.5 D/T m/s og 6 D/T^2 m/s i anden for en rampe på T s over D m (begge logges), og et scenarie, der ville overskride max_accel_mps2, afvises. Et trin (ramp_s = 0) flytter positionen uden at røre hastigheden
time-spoof offset_s, counterfeit_cn0_dbhz tiden i RMC, GGA, GNS og ZDA flyttes fra den sande UTC; positionen forbliver sand
replay-delay delay_s, affect_time (standard true), counterfeit_cn0_dbhz position, hastighed (og tid) er fartøjets for delay_s siden, hvor forsinkelsen følger smoothstep på sine ramper, og den rapporterede fart skaleres med 1 - d(delay)/dt, mens den ændrer sig: en forenklet abstraktion i stil med meaconing, ikke en udbredelsesmodel

counterfeit_cn0_dbhz: mens en drag-off, tids-spoof eller replay-forsinkelse er aktiv, viser hver sporet satellit dette ene forhøjede niveau, et klassisk tegn. Udelad det ved en subtil hændelse, hvor det ægte C/N0-mønster bevares. Mens en vilkårlig falsk hændelse er aktiv, følger modtageren det falske signal, så jamming får den ikke til at falde fra; en positionsbestemmelse, der er gået tabt på grund af tidligere jamming, vender tilbage efter reacquire_s på det falske signal (se combined-event). En tidsændring, der ville få den rapporterede tid til at standse eller løbe baglæns (en hastighed på 1 s pr. sekund eller mere), afvises, medmindre den er et trin (ramp_s = 0).

Hændelser kan overlappe; deres virkninger lægges sammen (offsets, tidsændringer, forsinkelser) eller den stærkeste tæller (jamming). Tidslinjens onset er den første epoke, hvor hændelsen har en virkning, én epoke efter den indskrevne start_s, når hændelsen rampes ind.

Instruktørloggen#

Ved siden af strømmen giver <prefix>.instructor.json og <prefix>.instructor.txt:

  • hændelserne, som de blev injiceret, i klart sprog med hver parameter og deres UTC-indsættelsestidspunkt;
  • en tidslinje: indsættelse, fuld virkning, begyndende genopretning, genoprettet og modtagerens egne fix-lost og fix-regained;
  • det sande spor over for det rapporterede ved log_interval_s-afstand: sand og rapporteret position, fart og kurs, positionsfejl i meter, tidsoffset, anvendte og sporede satellitter, gennemsnitlig C/N0 og hvilke hændelser der var aktive;
  • den højeste fart og acceleration for det sande og for det rapporterede spor;
  • scenariets trainer_note.

Vis kun loggen ved debriefingen.

JSON-felter (skema kshana-nmea-training/1)#

felt type, enhed betydning
schema streng kshana-nmea-training/1
warning streng erklæringen om, at den kun er til træning
scenario, description, trainer_note streng fra scenariet
seed heltal anvendt seed
start_utc ISO 8601 UTC kørslens start
duration_s s kørslens længde
summary.true_peak_sog_kn, summary.reported_peak_sog_kn knob højeste sande og rapporterede fart over grunden
summary.true_peak_accel_mps2, summary.reported_peak_accel_mps2 m/s i anden største ændring af hastighed pr. sekund, sand og mellem på hinanden følgende rapporterede positionsbestemmelser
events[] én pr. indskrevet hændelse
events[].id heltal 1-baseret; bruges af timeline[].event og track[].active_events
events[].description streng beskrivelse i klart sprog med parametrene
events[].start_utc ISO 8601 UTC indskrevet indsættelse
events[].parameters objekt hændelsen præcis som skrevet (kind, start_s, duration_s, ramp_s, recovery_s og typens egne parametre; fraværende udelades)
events[].resolved_bearing_deg grader sand eller null drag-off: den anvendte retning (en relativ pejling bestemmes ved indsættelsen)
events[].peak_drag_speed_mps, events[].peak_drag_accel_mps2 m/s, m/s i anden eller null drag-off: de toppe, som driften tilføjer det falske spor
timeline[] øjeblikke til debriefingen i tidsrækkefølge
timeline[].t_s, .utc s fra start, ISO 8601 UTC hvornår (sand tid)
timeline[].event heltal eller null hændelsens id; null for ændringer i modtagerens tilstand
timeline[].what streng onset, full-effect, recovery-begins, recovered (hændelser); fix-lost, fix-regained (modtager)
timeline[].text streng forklaring
track[] én række pr. log_interval_s
track[].t_s, .utc s, ISO 8601 UTC hvornår (sand tid)
track[].true_lat_deg, .true_lon_deg grader sand position
track[].true_sog_kn, .true_cog_deg, .true_heading_deg knob, grader sand sand fart og kurs over grunden samt gyrokurs
track[].fix_valid boolesk modtageren rapporterede en positionsbestemmelse
track[].reported_lat_deg, .reported_lon_deg, .reported_sog_kn, .reported_cog_deg grader, knob, grader sand eller null hvad modtageren rapporterede; null, mens positionsbestemmelsen er tabt
track[].position_error_m m eller null vandret afstand fra sand til rapporteret position
track[].time_offset_s s rapporteret UTC minus sand UTC
track[].n_used, .n_tracked heltal satellitter anvendt i positionsbestemmelsen og sporede
track[].mean_cn0_dbhz dB-Hz eller null gennemsnitlig C/N0 for de sporede satellitter
track[].active_events heltal id'er på hændelser med en virkning i dette øjeblik

At tilføje et felt ændrer ikke skemamærket. At omdøbe eller fjerne et felt eller ændre et felts betydning eller enhed tæller nummeret op (/2).

Scenariebiblioteket#

scenarios/training/, hver få minutters sejlads med en trænernote i sin TOML:

fil hvad den viser
open-sea-jamming.toml C/N0 falder samlet, satellitter falder fra, positionsbestemmelsen går tabt og vender tilbage
coastal-drag-off.toml en gyldig, sundt udseende positionsbestemmelse driver 1,4 km mod kysten; ensartet forhøjet C/N0
port-approach-time-spoof.toml positionen er korrekt, UTC driver 45 s foran under en langsom havneindsejling
combined-event.toml jamming, derefter falsk overtagelse med drag-off og tidsoffset, derefter en replay-forsinkelse
fjord-natural-degradation.toml en blokeret himmel, ikke interferens: væggene i en fjord (forudindstillingen fjord for horisontprofil, REPRESENTATIVE) skjuler satellitterne mod øst og vest, derefter åbner sundet sig igen (hændelse natural-degradation, med en skyline-tabel)

Positioner, datoer og spor er opfundne; biblioteket indeholder intet rigtigt fartøj, ingen rigtig operatør og ingen rigtig optagelse. Det udtaler sig ikke om, hvordan nogen modtager eller noget system ville klare sig mod interferens.

Modelleringsvalg#

Generatoren er et træningsværktøj uden ekstern uafhængig reference, og dens tal er modelleringsvalg, ikke målinger af nogen modtager. De er valgt, så de ligner en almindelig modtagerlog: C/N0-hældningen på 14 dB fra zenit til horisont under zenitniveauet (standard 47 dB-Hz) og offsettet pr. satellit på +/-1.5 dB, langsom fading på 0,8 dB over 97 s og 0,5 dB over 31 s, 0,3 dB jitter; tærsklerne for sporing (20 dB-Hz) og anvendelse (28 dB-Hz); positionsstøjen (1,5 m ved HDOP 1, korreleret over 30 s, lodret det dobbelte); 0,05 grads gyrostøj og 0,03 kn afdriftsstøj; styretidskonstanten på 20 s og waypointankomstradierne i fartøjsmodellen; og valget af satellitter efter azimutsektor. Standardværdierne findes i [receiver] og [vessel] og kan alle ændres i scenariet.

At læse den tilbage#

kshana receiver-trust kan indlæse disse filer (format = "nmea"). Testene kontrollerer hver sætning i hvert bibliotekscenarie mod dens egne regler for feltantal og kontrolsum og kører filerne gennem den læser, som fortolker GGA, RMC og GSV og springer de øvrige typer over uden at udelade nogen. Testene fastholder et gyldent uddrag pr. scenarie (tests/fixtures/nmea_training/); generér igen med KSHANA_BLESS_GOLDEN=1 efter en tilsigtet ændring.