Talk:NMEA over Ethernet

From 1ste Gimnechiske Wiki

Jump to: navigation, search

Chats

20080930 Aun / Stein Eldar

kikket du paa NMEA over Ethernet prosjektet? Stein Eldar Johnsen 2:10 så det i går, har ikke fått nest no på spec'en, men virker greit. lest

Aun Johnsen 2:11 trenger ikke kjenne NMEA protokollen for aa jobbe med prosjektet, trenger jo bare finnu ut hvordan man gjoer en RS-232 link om til en TCP/IP link og omvendt har mest lyst til aa faa til dette i multicast Stein Eldar Johnsen 2:12 skal være mulig å mega-hacke det med en RS-232 over TCP/IP... eller ha et prog som har interface mot RS-232, og forwarder til UDP pakker. og visa versa

Aun Johnsen 2:14 men jeg trenger en protocol der jeg kan lage en unik ID for hver device jeg kobler til, fx at GPS'en i mobilen og min Garmin faar forskjellige navn, og at mottakeren kan velge hvilken han vil ha fx IPheader - unitID $NMEAstring*CS Stein Eldar Johnsen 2:15 Enkelt, du har et "subscription system" som tar imot I-Am-Alive, og med timeout om den ikke blir fornyet.

Aun Johnsen 2:15 joda, men trenger vi handshake da? Stein Eldar Johnsen 2:16 ikke mye, men handshake er kjempeenkelt om du ikke skal ha ID-sikkerhet.

Aun Johnsen 2:17 trenger ikke sikkerhet, eneste grunnen for ID er filtrering Stein Eldar Johnsen 2:17 det er anntatt at nettverket er sikkert fra før?

Aun Johnsen 2:18 det er antatt at det ikke finnes sensitiv data i nettet Stein Eldar Johnsen 2:18 ok pjaktisk da holder det med enkel subscription, uten handshake.

Aun Johnsen 2:19 en NMEA setning ser slik ut: $GPGLL,1234.56,12345,12,0,1,A*2C FOR EKSEMPEL Stein Eldar Johnsen 2:20 UDP("min-ip:port serviceID timeout") som sendes e.g. hvert minutt, med 3 minutt timeout. og så kan du lage en dummy svar som sier "OK", og så sender den NMEA til subscription ikke har blitt fonyet på lenge nok. begynner de alltid med $?

Aun Johnsen 2:21 jess Stein Eldar Johnsen 2:22


Aun Johnsen 2:22 men noen ganger er *CS paa slutten droppet, det er bare en checksum som er paakrevd av noen typer setninger desuten, setningen er maksimalt 80 ALFANUM 8bit med 1 stop bit inkludert checksum slutter altid med <LF><CR> Stein Eldar Johnsen 2:23 det er ikke noe problem, for om du pruker UDP, så sendes hver setning i hver sin UDP pakke. det er så lite overhead at det er helt greit

Aun Johnsen 2:23 for at en device skal vaere brukbar paa en ECDIS (elektronisk baatkart) maa den sendes hvert sekund Stein Eldar Johnsen 2:23 du bruker <CR><LF> fra RS-232 som pakke-skiller. fortsatt ikke noe problem.

Aun Johnsen 2:24 jepp, men det er lagt inn i NMEA protokollen, NMEA er egentlig ikke skrevet for RS-232, bare tilpasset i ettertid Stein Eldar Johnsen 2:24 også inn i NMEA over ethernet?

Aun Johnsen 2:25 vi kan sikkert sloeyfe <CR><LF> over ethernet, men da maa lytterprogrammet/driveren legge det til foer det sendes til programmene som skal bruke det husk vi skal lage en virtuel RS-232 port hos mottakeren Stein Eldar Johnsen 2:26 sånn jeg tenker: <LF><CR> er *praktisk talt* en setnings-skiller, så kan det legges til om du vil koble tilbake på anna overføring eller mot device.

Aun Johnsen 2:27 vel siden hver setning starter med $ og slutter med <LF><CR> saa kan jo dette strippes av senderen og legges til av mottakeren, maa bare vaere sikker paa at begge snakker samma spraaket Stein Eldar Johnsen 2:27 Hver pakke en ENTEN en NMEA setning, ELLER en subscription. Subscription begynner ikke med $. ... eller er MNEA stort sett en-veis?

Aun Johnsen 2:28 NMEA er envegs Stein Eldar Johnsen 2:28 ok. enda enklere.

Aun Johnsen 2:28 senderen bryr seg ikke om noen lytter, han sender uansett eneste grunnen til aa bruke subscription i et nettverk er for aa redusere baandbredde, men tror ikke at dette skal gjeore beslag paa saa mye vi snakker jo om ca 80B/s per device blir det ikke det? Stein Eldar Johnsen 2:31 om du bruker IPv4 over UDP, så må du ha subscription, eller bruke BROADCAST, som suger.

Aun Johnsen 2:31 vil ha IPv4 og IPv6, slik at det kan settes opp som man vil Stein Eldar Johnsen 2:32 Jepp, Og med 100 devicer, så får du 8kps... No prob. ... ok om du *vil støtte* IPv4 ... og IPv6 multicast til en viss grad også. siden det er avsender som bestemmer hvem som skal motta multicasten.

Aun Johnsen 2:34 tar en stor konstruksjonsbaat saa har vi noe slik som 6 GPS + 3 Gyro + 2 ARPA + 1 AIS + 2 vindsensorer + 3 MRU + 1 Fanbeam + 1 Tautwire + 2 HiPAP = 21 devices (Skandi Navica) med andre ord et par kbps Stein Eldar Johnsen 2:35 ... Det blir 21*80 bps = 1.68kbps med min løsning med UDP over IPv4 (ingen nettverks-basert multicast) og si 20 mottakere = 33.6kbps. Nok til å clogge et modem fra 1994.

Aun Johnsen 2:38 hehe hvordan blir det med IPv6? Stein Eldar Johnsen 2:39 litt mer pga pakke overhead...

Aun Johnsen 2:39 men v4 eller v6 er opp til den som setter opp tjenesten Stein Eldar Johnsen 2:39 UDP/IPv6 har ca 20 byte pakkeheader, mens UDP/IPv4 har 6 byte

Aun Johnsen 2:40 hva med broadcast i v6? Stein Eldar Johnsen 2:41 du får vel tilsvarende pakkeheader per mottaker, men fortsatt samme payload. lønner seg mer med større pakker. dvs 20 byte / mottaker + 80 byte NMEA.

Aun Johnsen 2:42 ok, saa dermed lage protocollen slik at alle devicer som sendes fra samme host kan kombineres, evt flere setninger sendes sammen Stein Eldar Johnsen 2:42 ops, nei 34 byte per på IPv6.

Aun Johnsen 2:44 si at payload er en unik ID + NMEA, hvor uID er en maate aa skille devicene fra hverandre en host kan for eksempel sende en gyro og 2 gps, da vil for eksempel hver pakke vaere header + id1 + NMEA + id2 + NMEA +id3+NMEA Stein Eldar Johnsen 2:45 ... 2 byte header-størrelse, 4 byte pakkestørrelse, 1 byte mottakercount, 1 byte status, 32 byte IP + 2 byte port / mottaker, + pakken. for en enkelt host, så lages et lite "lytterprogram" som tar imot og distribuerer lokalt. NMEA proxy. og gjøres det skikkelig, så vil proxyen og de forskjellige originatorene ha mer eller mindre identisk kode.

Aun Johnsen 2:47 problemet med NMEA er at protokollen gaar ut ifra at bare en device er paa linja, saa den sender ikke annen ID enn hva slags unit det er (GP = GPS - HD = Compass, osv, eneste unntaket er fabrikkspesifikke setninger, men da identifiseres bare hvem PGRM = Garmin) Stein Eldar Johnsen 2:50 ... hva med å legge til Device ID før $?

Aun Johnsen 2:50 min tanke i serveren setter du en tty = ID for hver device du har, da sender vi den ID-en foer $ kan til og med bruke vaar egen tag for dette, la oss si %ID$NMEA*CS Stein Eldar Johnsen 2:52 greit det, enkelt, og burde funke siden vi ikke har annen data, så trur jeg ikke vi trenger % om vi krever at ID er der... men greit nok

Aun Johnsen 2:57 ID$NMEA*CS joda men hvordan skiller vi flere NMEA pakker i samme pakken? CS er jo bare optional Stein Eldar Johnsen 2:58 enklest: ikke gjøre det. Sånnt kan vi tenke på i V2

Aun Johnsen 2:59 Det er enklere aa lese med %ID$NMEA*CS%ID$NMEA*CS enn ID$NMEA*CSID$NMEA*CS Stein Eldar Johnsen 2:59 om vi skal gjøre det, så kreves det køsystemer, som blir lett å få dustefeil i.

Aun Johnsen 3:00 trenger vi det? Stein Eldar Johnsen 3:00 om vi skal gruppere NMEA meldinger, og sende fast 1/sek, så trenger vi det. i tillegg til at de gir en delay i systemet.

Aun Johnsen 3:02 det beste er om vi legger dette til rette i dataprotocollen, men utelater bruken i programmet intil vi er sikker paa at det virker Stein Eldar Johnsen 3:03 bruk <LF><CR> som NMEA skille da.


Aun Johnsen 3:03 hehe Stein Eldar Johnsen 3:03 eller like så greit, bare <LF>.

Aun Johnsen 3:04 strippe det til <LF> ja