PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Netzwerkprotokoll im kleinen Maßstab



Technipion
15.08.2012, 16:50
Hey Leute,
zuerst mal ein herzliches Hallo meinerseits. Ich bin neu in diesem Forum, ich beobachte es zwar schon eine ganze Weile, habe aber erst jetzt den Mut aufgebracht mich anzumelden.
Ich bin Hobbyprogrammierer und -elektroniker. Ich bin 19 Jahre alt, habe aber schon mit 6 angefangen kleine sich bewegende Schaltungen zu bauen, aus purer Lust an der Schöpfung von "Leben".
Ich bin gerade an einem privaten Projekt, was sich unter Umständen aber später vermarkten lässt. Ich bin gerade beim Abitur und kann mich deshalb nicht um meinen Garten kümmern, deswegen benötige ich kleine Einheiten die sich um die Wasserzufuhr kümmern. Ich habe bereits Algorithmen aufgestellt, die in Abhängigkeit von Temperatur, Luftdruck und Luftfeuchtigkeit errechnen, wann welches Areal begossen werden muss. Mein Problem ist nun: Ich kann die Stationen nicht verknüpfen.

Die Hauptrecheneinheit ist ein Atmega32, die kleineren Stationen jedoch sind kleine PIC-Microcontroller, die alle per Funk verbunden sind. Der Atmega32 kann also per Antenne jede Einheit erreichen, allerdings ist das ganze System dann analog, und das funktioniert nicht. Um den Funkverkehr zu digitalisieren benötige ich ein Netzwerkprotokoll, sodass alle Microcontroller kommunizieren können und ich die Routinen für die Bewässerungsstationen schreiben kann.
Kabelverbindungen scheiden übrigens aus, da sich in dem Garten auch Nager aufhalten, und unterirdisch geht nicht, da der Boden viel zu hart zum Aufgraben ist.
Vielleicht kann mir also einer von euch zeigen/erklären, wie man am besten ein Netzwerkprotokoll erstellt und verwendet.

Ich bedanke mich schon einmal im Voraus
MFG Technipion

markusj
15.08.2012, 21:23
Hallo Technipion,

der Entwurf von Protokollen ist je nach Zielvorgabe eine sehr anspruchsvolle Tätigkeit. Je nach Anforderungen und Rahmenbedingungen können Protokolle sehr unterschiedlich Aussehen und gestaltet werden.

Protokolle kann man unterschiedlichen "Schichten" zuordnen. Die unteren Schichten arbeiten dabei sehr hardwarenah, die darüber liegenden Schichten bauen auf dieser Funktionalität auf und biete komplexere Dienste an. Die Aufgaben der Schichten ändern sich mit zunehmendem Abstraktionsgrad. Eine gängige Strukturierung:
Schicht 1: Die Bitübertragungsschicht (physical layer) kümmert sich darum, einzelne Bits über ein Medium zu befördern. Üblicherweise wird diese Aufgabe von spezialisierten Hardwarekomponenten (SPI/USART, Funkchips etc.) übernommen.
Schicht 2: Die Sicherungsschicht (data link layer) hat als Aufgabe, aus dem kontinuierlichen Bitstrom der über Schicht 1 versendet wird, eine zuverlässige und strukturierte Transportmöglichkeit für Daten zu formen. Speziell bei Funk ist dabei der Medienzugriff wichtig, da mehrere Sender sich gegenseitig stören.
Schicht 3: Die Vermittlungsschicht (network layer) brauchst du möglicherweise schon gar nicht mehr. Sie ist dafür zuständig, Informationen über mehrere Stationen hinweg zu übertragen (Routing). Die ersten beiden Schichten decken dagegen nur die Kommunikation zwischen zwei benachbarten Endpunkten ab.
Darüber gibt es noch weitere Schichten (mehr dazu im Wikipedia-Artikel OSI-Modell (http://de.wikipedia.org/wiki/OSI-Modell)), die sind aber an dieser Stelle uninteressant.

Der wichtigste Teil deines Protokollentwurfes wird darin bestehen, zum einen eine zuverlässige Fehlererkennung zu gewährleisten, und zum anderen den Medienzugriff zu regeln. Darauf aufbauen kannst du dann die Signalisierung für dein Bewässerungssystem erledigen.

mfG
Markus

Technipion
16.08.2012, 14:20
Zuerst mal vielen Dank für die schnelle Antwort!

Ich konnte heute in der Schule noch ein wenig darüber nachdenken und einen ungefähren Plan entwerfen wie ich meine Drahtloskommunikation aufbauen könnte. Wenn ich das jetzt mit deiner Antwort (den verschiedenen Schichten) kombiniere, kommt etwa folgendes heraus:

An jede Station kommt (oder ist bereits) ein Microcontroller, der an zwei seiner Pins mit einer Antenne, die auf 2 verschiedenen Frequenzen senden kann, verbunden ist. Die erste Frequenz (die ruhig niedrig sein kann) ist für die Synchronisation der Pakete und die zweite für den Inhalt. Dadrin wären dann quasi Schicht 1 und 2:
Wenn ich einen bestimmten Controller ansteuern will, baue ich zuerst das zu schickende Paket. Dazu schreibe ich in den Header die Nummer, die ich vorher an der anzusteuernden Platine eingestellt habe (ist sozusagen die IP-Adresse der Platine, und die ist mit einem Kodierschalter einstellbar). Außerdem kommt die Nummer des Absenders hinein. Dann kommt der Bytecode und am Schluss noch eine Prüfsumme. Dann wird geprüft ob die Hauptleitung (Frequenz 2) gerade frei ist und gegebenfalls gewartet. Ist jedoch gerade kein Funkverkehr, wird ein kurzer Impuls auf der Nebenleitung (Frequenz 1) gesendet und somit alle Empfänger aufmerksam gemacht (z.B. durch ein Interrupt; der Funkverkehr ist in diesem Moment für die anderen gesperrt). Dann wird der Header gesendet (evtl. sogar mit eigener Prüfsumme?) und der entsprechende Empfänger weiß, dass er gemeint ist. Die anderen Empfänger gehen dann wieder in den Standby. Als nächstes wird der Content gesendet und anschließend die Prüfsumme und dann gewartet. Der Empfänger wertet die Daten aus und liefert im Normalfall einen Erfolgscode zurück an den Absender. Falls er das Paket nur fehlerhaft erhalten hat (und das an der Prüfsumme merkt), gibt es einen Errorcode und das Paket wird erneut gesendet. Wenn es beim x-ten Senden (muss man ausprobieren wie oft) nicht ankommt, wird abgebrochen.
Wenn das Paket erfolgreich übermittelt wurde, und der Erfolgscode beim Absender angekommen ist, sendet dieser erneut einen Impuls auf der Nebenfrequenz und der Funkverkehr ist wieder entsperrt.

Ich wollte jetzt fragen, wie ihr Experten das seht. Kann man das so machen; rein vom Zeitaufwand her ist es kein so großes Problem, ich würde sagen maximal 2-3 Wochenenden und fertig ist das Projekt.

Danke schonmal im Voraus
Gruß Technipion

markusj
16.08.2012, 21:07
Waaaaaaaait: Vergiss es. Einfach Drähte an einen µC anschließen macht noch keine Funkverbindung! Du willst dir Funkmodule kaufen. Günstig und recht weit verbreitet sind die RFM12 von Pollin. Die kümmern sich dann für dich komplett um Schicht 1. Ach ja: 2 bis drei Wochenenden ist ... optimistisch. Irgendwas geht immer schief ;)

mfG
Markus

ElchiMtr
16.08.2012, 21:26
Hey,

unabhängig davon wie deine Hardware aussieht (davon haben hier viele mehr Ahnung als ich) würde ich an deiner stelle über ein Token-Ring-Verfahren nachdenken. Das macht die Frage wer was sendendarf recht einfach. Dabei darf immer nur ein Teilnehmer senden. Und dieser sendet immer an den, der in der Reihenfolge als nächster kommt. So schickst du immer alle Daten in gewissen Intervallen im Kreis, das erzeugt zwar recht viel Datenverkehr, aber du kannst sehr leicht sagen: Wenn der Vorgänger fertig ist bin ich dran. Und für deine Anwendung reicht es sicher wenn so eine Runde alle paar Minuten gesendet wird.
Ich hoffe das hilft dir weiter.

Gruß Elchimtr

Technipion
16.08.2012, 22:51
Hey danke für die Antworten,
ich meinte natürlich nicht, direkt die Antennen an die Pins anzuschließen, sondern eine externe Sende- und Empfangsschaltung. Aber die Funkmodule die markusj vorgeschlagen hat funktionieren doch auch irgendwie. Wie stellen die eine fehlerfrei Bitübertragung her? Das könnte man doch dann in den Übertragunsalgorithmus integrieren...
Das Token-Ring-Verfahren klingt auch nicht schlecht, allerdings ist mein Vorschlag von oben ja fast das gleiche, nur das ich damit in jedem Zyklus jeden beliebigen Zugriffspunkt ansteuern könnte.
Und das 2 bis 3 Wochenenden optimistisch sind weiß ich auch, ich besitze was so etwas angeht aber auch viel Ehrgeiz ;)
Ich denke ich werde mich jetzt erst einmal an den Code und die Übertragungsmodule (vorerst ein einfacher Draht, danach erst Funk) setzen, und wenn ich fertig oder gescheitert bin mein Ergebnis hier posten.
Ich danke euch allen schon mal für die Antworten und falls ich während des Bauens noch Fragen habe melde ich mich einfach wieder.
Danke
Gruß Technipion

markusj
17.08.2012, 00:29
@Token-Ring: Don't! Funk ist ein unzuverlässiges Medium, es macht mit Garantie einen Heidenspaß verlorenen Tokens hinterherzujagen ... Über Funk haben sich simple konkurrierende Zugriffsverfahren wie CSMA bewährt.

@Fehlerfreie Funkmodule: Gar nicht. Du schiebst Bytes in den Sendepuffer, das Funkmodul sendet diese in den Äther und auf der Gegenseite empfängt ein Funkmodul meistens etwas, das eine hohe Ähnlichkeit mit dem hat, was ursprünglich Mal gesendet wurde. Die einfachen Funkmodule nehmen dir nur die Synchronisation und die eigentliche Datenübertragung ab (Schicht 1). Den Medienzugriff, Fehlererkennung und Behandlung musst du selbst implementieren. Und das ist schon mehr als genug.

mfG
Markus

PS: Das mit den Datenverlusten ist leicht übertrieben dargestellt. Oft geht alles gut, selten gehen Übertragungen ganz verloren oder es gibt Bitmüll. Da du aber eine zuverlässige Übertragung haben möchtest, solltest du vom schlimmsten ausgehen ;)

PPS: Wenn du erst über Draht arbeitest: Plane von vornherein eine Abstraktion zwischen deinem Protokoll und dem Treiber für Schicht 1. Sonst musst du später alles Umstricken und Teufels Küche weil du Fehler nicht findest die durch die Modifikationen verursachst oder zutage förderst.

ikarus_177
17.08.2012, 09:53
@markusj: ist in diesem Fall überhaupt ein Zugriffsverfahren wie CSMA notwendig? Wie Technipion in seinem ersten Beitrag schreibt, hat er eine Hauptrecheneinheit (setze ich mal mit "Master" gleich) und mehrere "Slaves". Wenn nun der Master ein Telegramm per "Broadcast" aussendet (alle Slaves können ja die drahtlos übermittelte Information empfangen) und in dem Telegramm Fehlererkennungsinformationen (etwa CRC) mit drinstecken - wäre das nicht doch auch ausreichend?

Der Slave könnte ja dann das Paket ACKnowledgen und ggf. Daten zurücksenden.

Ich habe mal ein ähnliches Protokoll für ein halbduplex RS485 implementiert - wäre das nicht rein aus der Sicht des ATMega eine äquivalente Situation zu der hier dargestellten Funklösung (Single-Master, logischer Bus, ...)?

markusj
17.08.2012, 10:34
Naja, theoretisch könnte man für Rückantworten einfach einen Zeitslot nach Senden des Paketes von der Master-Einheit reservieren, dann braucht man das nicht. Sollen dann aber einzelne Module selbst Ereignisse an den Master senden, muss dieser dann ständig die entsprechenden Module abfragen.

Vieles ist auch eine Geschmackssache, wenn ich so etwas entwerfe, plane ich es oft im Hinblick auf eine Wiederverwendbarkeit bei anderen Projekten. Das macht beim ersten Mal etwas mehr Arbeit, dafür hat man danach dann aber Bibliotheken die für viele andere Anwendungsfälle ebenfalls eingesetzt werden können.

mfG
Markus

Technipion
17.08.2012, 14:17
Hey Leute,
zuerst nochmal danke für eure Antworten.
Ich konnte gestern Abend noch etwas herumrechnen und ein kleines Simulationsprogramm schreiben. Dabei ist mir aufgefallen, dass die Wahrscheinlichkeit ein intaktes Paket zu erhalten nahezu exponentiell abnimmt. Deswegen habe ich mir noch einmal zwei kleine Änderungen überlegt wie ich eine einwandfreiere Fehlererkennung hinbekomme.
Die erste Änderung ist, dass ich in dem Header des Paketes noch einen Pakettyp einfüge, einfach nur weil es in den meisten Netzwerkprotokollen enthalten ist, und das Netzwerk ausbaufähig macht.
Die zweite Änderung ist ein Verfahren, welches ich mir überlegt habe nachdem ich bei der NASA einen ähnlichen Algorithmus gefunden hatte.
Da ich f1 und f2 (f = Frequenz) kenne, kann ich folgendes machen:
Wenn das Paket nach dem x-ten mal nicht ankam, wird noch ein Versuch unternommen. Das Paket wird gesendet/empfangen und das empfangene Signal wird mit einer FFT (Fast Fourier Transformation) in ein Spektrum transformiert. In dem Spektrum sieht man dann alle auftretenden Störgeräusche, und natürlich die Ursprungsfrequenz f1. Dann werden alle Teile entfernt, deren Spektrum nicht etwa f1 entspricht. Es wird Rücktransformiert und das Signal wird neu ausgewertet. Wenn das immer noch nicht funktioniert, wird erst abgebrochen.

Wie findet ihr die Idee? Rein mathematisch müsste das doch schon nahe an den professionellen Geräten liegen, oder? Ich meine irgendwie müssen die ja auch mit den wenigen Ausgangsdaten einen funktionierenden Stream erzeugen...

Danke schonmal
Gruß Technipion

markusj
17.08.2012, 17:11
Vergiss die beiden Frequenzen. An Layer 1 kommst du normalerweise nur ran, wenn du das Funkzeug selbst aufbaust. Alleine schon aus rechtlichen Gründen würde ich an deiner Stelle davon die Finger weglassen. (Evtl. kann ein Funkamateur dazu ja mehr sagen)
Auf Schicht 2 hast du im Grunde zwei Möglichkeiten: Fehlererkennung und Fehlerkorrektur. Oft wird beides zusammen eingesetzt. Für die Fehlererkennung nimmt man eine Prüfsumme wie CRC, für die Fehlerkorrektur kommen Kanalcodierungen wie Hamming-Codes zum Einsatz.

mfG
Markus

ikarus_177
17.08.2012, 21:13
@Technipion: rein theoretisch würde das mit dem Spektrum filtern natürlich funktionieren - vom rechnerischen Aufwand mal abgesehen.
Wie hast du das Simulationsprogramm aufgezogen? Kannst du da vielleicht ein bisschen mehr dazu schreiben? Würde mich interessieren!

Danke dir!

i_make_it
18.08.2012, 11:27
1234567890

markusj
18.08.2012, 18:58
@i_make_it

Vorsicht, du wirfst Medienzugriffsalgorithmen und Übertragungssicherung durcheinander. CSMA hat erst mal nichts mit einer Fehlererkennung/korrektur zu tun. Das sind unterschiedliche Aufgaben, aus gutem Grunde gliedert man die Schicht 2 daher oft logisch in einen Medienzugriffsteil (media access control) und das eigentliche Datenprotokoll, welches dann auch die Fehlerbehandlung übernimmt (logical link control).

Und welche CSMA-Geschmacksrichtung man überhaupt implementieren kann, hängt stark davon ab, welche Fähigkeiten einem Schicht 1 (das Funkmodul) zur Verfügung stellt. Viele in Bastlerkreisen verbreitete Funkmodule beherrschen nur Simplexbetrieb und können daher nicht prüfen, ob andere Sender die eigene Übertragung unterbrechen. Dann bleibt von der CSMA-Familie nur noch CSMA/CA übig.

mfG
Markus

i_make_it
18.08.2012, 20:57
1234567890