Jump to content

Wie am besten Trennung einer Ethernet-Verbindung erkennen?


Recommended Posts

Hallo allerseits,

 

ich nutze in einer Anwendung (in C programmiert) einen Master-Brick zusammen mit einer Ethernet-Extension (V1.0 Standard, kein PoE).

 

Der Ablauf meines "Hautprogramms" wird im Wesentlichen durch die Zustände einiger Pins an einem IO-16 Bricklet gesteuert, die Anbindung meines Tinkerforge-Systems ans Netzwerk benutze ich nur sporadisch, um Statusmitteilungen (E-Mails) zu versenden.

 

Nun würde ich gerne per Software überwachen, ob mein Master-Brick via Ethernet-Extension eine aktive Verbindung zum Router hat bzw. ob diese Verbindung unterbrochen wurde (z.B. Kabel ausgesteckt) - helfen würde mir im Prinzip eine Funktion, die mir quasi den aktuellen Status der Link-LED der Ethernet-Extension zurückgibt.

 

Leider habe ich bislang noch keinen richtigen Weg und auch keinen sinnvollen Workaround gefunden (bitte korrigiert mich gerne, falls ich im Eifer des Gefechts was übersehen habe):

 

  • keine Callbacks verfügbar, die z.B. auf einen aktiven (bzw. inaktiven) Link zum Router reagieren
  • keine direkte Funktion zum Abfragen des Link-Status verfügbar

Daraufhin habe ich die Funktion 'master_get_ethernet_status()' getestet. Das funktioniert für meinen Fall jedoch nur soweit, dass ich nach einem Power-On und anschließendem Anstecken des Netzwerk-Kabels z.B. eine Änderung der IP-Adresse registrieren kann. Ziehe ich das Netzwerk-Kabel dann wieder ab, bleiben alle Daten auch bei weiterem, zyklischen Aufrufen (alle 500ms) von 'master_get_ethernet_status()' bis zu einem Power-On Reset konstant - TX_count und RX_count sind übrigens immer auf 0. Eine Trennung der Verbindung zum Router bekomme ich so also leider nicht mit...

 

Ich würde mich freuen, wenn mir da jemand mit einem Rat zur Seite stehen könnte :) 

 

 

 

 

Link zu diesem Kommentar
Share on other sites

Hallo Tinkiee24-7,

 

wenn du die Funktion nur selten brauchst, könntest du doch einen system() Aufruf starten, der mit einem einmaligen PING testet, ob noch ein Gegenüber erreichbar ist. Wäre jetzt mal so ne schnelle Lösung, wenn es nicht zeitkritisch sein soll.

 

Oder du fragst mit ethtool den Status deiner Karte ab. ( Auch über system() erreichbar )

Link zu diesem Kommentar
Share on other sites

Hallo miteinander,

 

zuerst mal besten Dank für eure Antworten!

 

@jgmischke:

 

Zeitkritisch ist das bei mir tatsächlich nicht, das wäre also kein Problem. Dein Ansatz hat sich für meinen Anwendungsfall interessant angehört, deswegen habe ich mich gleich mal eingehender damit beschäftigt. Ergänzend muss ich noch sagen, dass ich auf meinem PC mit Windows 7 arbeite. Das führt zu ein paar nicht ganz schönen Nebeneffekten, da z.B. die Argumente beim Aufruf von 'Ping' bei Windows und Linux eine teils unterschiedliche Syntax haben (Beispiel Windows: -n --> Linux: -c). Ist, wie gesagt, aber kein unlösbares Problem... Beim Ausführen des 'Ping'  wird aber offenbar immer nur auf die Netzwerkverbindung meines PC's zugegriffen - selbst dann, wenn ich mein Testprogramm auf einem RED-Brick compiliere und ausführe (an dem dann ein Master-Brick mit der betreffenden Ethernet-Extension hängt). Wenn ich bei diesem Hardware-Setup mein Netzwerk-Kabel an der Ethernet-Extension anstecke oder abziehe passiert gar nichts. Erst wenn ich meine LAN-Verbindung am PC deaktiviere, bekomme ich eine Änderung über mein Programm im RED-Brick angezeigt (-> 'Ping' zur IP des angeschlossenen Routers).

Da beiße ich mir gerade noch die Zähne aus. Hast du evtl. noch einen Tipp, auf was ich da achten muss?

 

ethtool habe ich mir ebenfalls angeschaut - liefert auch die interessante Info zum Link-Status. Allerdings möchte ich den Einsatz von ethtool ehrlichgesagt vermeiden, da ich an für sich eine plattformunabhängige Lösung suche (soll auf Windows und Linux lauffähig sein).

 

Daher wäre meine "Wunschvorstellung" irgendeine API-Funktion, die auf die Tinkerforge Hardware zurückgreift (träumen darf man ja ;)...)

 

@Nic:

 

Der Ansatz in deiner Antwort ist auch interessant - sozusagen Retriggern eines Monoflops über so etwas wie ein "Heartbeat"-Signal via LAN. Nur leider liegt da das Problem: In meinem Anwendungsfall habe ich keine Steuersignale o.ä. die von der Außenwelt per Ethernet an mein Gerät gehen. Der LAN-Anschluss wird nur unidirektional von meinem Gerät zur Kommunikation in die Außenwelt genutzt (-> Mailversand). Damit scheint diese Lösung für meine Anwendung leider nicht praktikabel zu sein...

 

Link zu diesem Kommentar
Share on other sites

Hallo zusammen,

 

ich bin mir nicht sicher, aber wurde da nicht mal was gemacht in Zusammenhang mit der Einfuehrung der Protokollversion 2??

 

Hier mal 2 Threads:

 

Socketverbindung bei Verwendung von WLAN/Ethernet

 

 IPConnection->getConnectionState

 

Vielleicht kommt ihre damit weiter.

 

 

Der Loetkolben

Link zu diesem Kommentar
Share on other sites

Hallo Tinkiee24-7,

 

wenn ich dich richtig verstehe, soll der Redbrick ein Signal senden, wenn die eth Verbindung gekappt ist oder? Wohin oder wie du dieses Signal erzeugst ist dann erst einmal zweitrangig.

 

Nehmen wir an, auf dem Redbrick ist die IP 192.168.1.2, auf dem Router die 192.168.1.1.

Dann kannst du mit "ping -c1 -t1 192.168.1.1" auf dem Redbrick abfragen, ob der Router erreichbar ist und ggfs. dann dein Signal erzeugen.

Oder hab ich da was falsch verstanden?

 

Link zu diesem Kommentar
Share on other sites

Hallo jgmischke,

 

das hast du richtig verstanden - im Falle einer gekappten Verbindung soll letztendlich eine C-Funktion aufgerufen werden, in der ich später dann eine entsprechende Ereignisbehandlung (und nicht nur eine Testausgabe) implementieren kann.

Im Prinzip habe ich es ganz ähnlich gemacht, wie du es vorgeschlagen hast, mit

system("ping -c 1 -w 1 192.168.178.1");

Hmm, möglicherweise war vielleicht auch noch die Verbindung zum Brick Viewer (per USB) aktiv. Das werde ich am Freitag nochmal nachvollziehen, komme vorher leider nicht dazu.

 

Soweit aber mal vielen Dank & schöne Grüße, Tinkee24-7

Link zu diesem Kommentar
Share on other sites

Hallo miteinander,

 

mich hat das Thema einfach nicht losgelassen, vor allem nicht der Wunsch nach einer betriebssystemunabhängigen Lösung...

 

Der PHY der Ethernet-Extension bringt dazu an für sich alles Nötige mit: er besitzt u.a. ein Status-Register, aus welchem via SPI der aktuelle Link-Zustand ausgelesen werden kann.

Also habe ich mich etwas eingehender mit der Master-Brick Firmware beschäftigt und basierend auf V2.4.1 um eine Funktion erweitert.

Zum Test habe ich die C-API (bislang nur manuell...) um eine entsprechende Funktion

int master_is_ethernet_link_up(Master *master, bool *ret_link_up);

 

erweitert. ret_link_up wird 'true', wenn ein Ethernet Link aktiv ist.

 

Das ganze habe ich mit einem kleinen Programm getestet - funktioniert prima!

 

Auf meiner Ethernet-Extension ist ein W5500 PHY, mein Quellcode bedient aber auch den W5200. Hat denn jemand eine Extension mit W5200 und mag einfach mal testen?

Im Anhang sind die entsprechende Master-Brick Binärdatei sowie die C API-Dateien und das Testprogramm (geschrieben in C, Dev-C++ Projekt). Wenn ihr in den API-Dateien sehen wollt, was ich ergänzt habe, sucht einfach nach dem Schlüsselwort "PHY-MOD".

 

Falls mir jemand zum Test mit einem W5200 Rückmeldung geben könnte, würde ich mich freuen. Der komplette Quellcode wird nach dem Testen natürlich noch veröffentlicht - vielleicht kann die Funktion ja sonst noch jemand gebrauchen  ;)

 

Viele Grüße,

Tinkee24-7

link_detect_api+firmware.zip

phy_link_testprog.zip

Link zu diesem Kommentar
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Reply to this topic...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...