-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 24

Thema: Netzwerkprotokoll für RFM12

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2012
    Beiträge
    33

    Netzwerkprotokoll für RFM12

    Anzeige

    Hallo Community,

    seit einigen Monaten - nach einer C-Vorlesung in der Uni - habe ich mich mit dem Thema "Microcontroller" zu beschäftigen begonnen und einiges darüber gelesen. Ich finde diese Dinger genial, vor allem die Vielfältigkeit reizt mich besonders.
    Da ich zur Zeit am Bauen eines Terrariums bin möchte ich dieses natürlich mit einem AVR Microcontroller steuern. Grundsätzlich will ich allerdings mehrere Units in meiner Wohnung haben die unterschiedliche Aufgaben übernehmen und vor allem miteinander über RFM12 Module kommunizieren können.
    Als Beispiel soll das Terrarium die Uhrzeit von der Digitaluhr ablesen können.

    Ich habe deshalb auch begonnen ein Netzwerkprotokoll zu entwerfen - vorerst nur theoretisch auf Papier. Ich würde auf ein zentral gesteuertes System setzen in dem ein "Tower" alle Units nacheinander fragt ob sie Daten zu senden haben (Token Ring) und die Datenframes vom Sender zum Empfänger leitet.
    Um Sendefehler zu erkennen verwende ich eine CRC Checksumme im Datenframe.

    Hier das Schema:
    Klicke auf die Grafik für eine größere Ansicht

Name:	CMNCATE-Schema.jpg
Hits:	54
Größe:	63,5 KB
ID:	23370

    Ad 1)
    Der Tower wählt die nächste UnitID aus seinem Speicher und versucht dieser das Sendetoken zu schicken.

    Ad 2)
    Die Unit bestätigt den Tokenerhalt oder reagiert nicht nach einer bestimmten Zeit.

    Ad 3)
    Der Tower versucht einen Datenframe* zu senden oder sendet ein READY, wenn keine Daten zum Senden vorhanden sind.
    Falls ein Timeout passiert wird das Token an die nächste Unit weitergegeben.

    Ad 4)
    Falls ein Datenframe ankommt wird dieser auf Gültigkeit** untersucht und im FIFO gespeichert, damit er später weiterverarbeitet werden kann.
    Wenn ein Fehler auftritt wird der Frame (NAK) nocheinmal angefordert. (max. 3x)
    Wenn Daten zum Senden vorhanden sind werden diese an den Tower zurückgesendet, ansonsten: READY.

    Ad 5)
    Der Frame wird wieder auf Gültigkeit** überprüft und ggf. gespeichert, wenn die Daten ungültig sind werden sie erneut angefordert.
    Wenn ein NAK ankommt (= Datenfehler Unit) wird das Datenpaket erneut gesendet.
    Falls READY ankommt (= Unit hatte keine Daten) wird das Token weitergegeben.

    Ad 6)
    Sobald das Token weitergegeben wurde hat die Unit keine Sendeerlaubnis mehr.
    Wenn ein NAK ankommt werden die Daten erneut gesendet.

    * ein Datenframe könnte wie folgt aussehen:

    ID | TIME | sender | empfänger | DATA | CRC

    ** Gültigkeit:

    Jede Unit speichert empfangene IDs für eine Zeit von X Sekunden in einer Blocklist und verwift Datenframes mit dieser ID.
    Jede Nachricht hat eine Lebensdauer von X Sekunden, wenn diese abgelaufen ist werden Frames auch verworfen. Damit will ich erneutes einsenden vom mitgeschnittenen Frames verhindern.

    Weiters möchte ich die Datenpakete mittels AES verschlüsseln um dem ganzen System mehr Sicherheit zu verleihen. Jede Unit soll dabei einfach einen geheimen Key gespeichert haben und damit die Datenframes verschlüsseln.

    Mich würde interessieren ob dieses Projekt in der Praxis umsetzbar ist, wo es scheitern könnte, und wie man es verbessern kann.

    Vielen Dank,
    Markus

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Eigentlich ist das kein Token-Passing sondern eher ein Polling-Verfahren bei dem der pollende Master in "Tower" umbenannt wurde.
    Zwei Dinge:
    1. Du möchtest die Sendeaufforderung evtl. auch wiederholen ("Token-Verlust")
    2. AES erfordert einiges an Rechenleistung und außerdem hast du dann für jedes Gerät einen Public-Key. Der Sender verschlüsselt die Daten mit dem Public-Key des Empfängers. Dieser Entschlüsselt dann mit seinem Private-Key.

    Normalerweise verwendet man als Medienzugriffsverfahren CSMA (im Falle der RFM-Familie ist keine CD/CA möglich). Der Polling-Ansatz ermöglicht aber prinzipiell gewisse Echtzeitgarantien, wobei das durch die Unzuverlässigkeit des Mediums eingeschränkt wird.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.10.2012
    Beiträge
    33
    1. Du möchtest die Sendeaufforderung evtl. auch wiederholen ("Token-Verlust")
    Da ja der Tower die Tokens vergibt und nicht die Unit das Token weitergibt bekommt UnitX nach einer Runde ja sowiso das Token wieder, oder?

    2. AES erfordert einiges an Rechenleistung und außerdem hast du dann für jedes Gerät einen Public-Key. Der Sender verschlüsselt die Daten mit dem Public-Key des Empfängers. Dieser Entschlüsselt dann mit seinem Private-Key.
    Kann die geforderte Rechenleistung für die Verschlüsselung auf einem AtMega644 bei 20Mhz zum Probem werden?
    Ich dachte AES ist ein symmetrisches Kryptosystem bei dem ich einen geheimen Schlüssel zum Ver- & Entschlüsseln habe.

    Der Advanced Encryption Standard (AES) ist ein symmetrisches Kryptosystem
    Quelle: http://de.wikipedia.org/wiki/Advance...ption_Standard

    Eignen sich andere Algorithmen wie XTEA oder Blowfish besser für diesen Anwendungsfall?

    Vielen Dank,
    Markus

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von cd_brenner Beitrag anzeigen
    Da ja der Tower die Tokens vergibt und nicht die Unit das Token weitergibt bekommt UnitX nach einer Runde ja sowiso das Token wieder, oder?
    Schon klar, aber: Du unternimmst damit noch nicht einmal den Versuch, eine stabile Kommunikation zu schaffen, weil du im Zweifelsfalle schon vor Kommunikationsbeginn aufgibst. Bei einer guten Funkverbindung sollte das eber weniger problematisch sein ...

    Zitat Zitat von cd_brenner Beitrag anzeigen
    Kann die geforderte Rechenleistung für die Verschlüsselung auf einem AtMega644 bei 20Mhz zum Probem werden?
    Ich dachte AES ist ein symmetrisches Kryptosystem bei dem ich einen geheimen Schlüssel zum Ver- & Entschlüsseln habe.
    Mein Fehler. Ich habe AES mit Public-Key-Krypto in einen Topf geworfen (und bin damit eher bei SSL rausgekommen). Davon abgesehen: Es hängt immer davon ab, wieviel Zeit du hast. Der langsamste Kryptoalgo ist kein Problem, wenn du keinen engen Zeitrahmen hast.

    Zitat Zitat von cd_brenner Beitrag anzeigen
    Vielen Dank,
    Markus
    Haha

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.10.2012
    Beiträge
    33
    Schon klar, aber: Du unternimmst damit noch nicht einmal den Versuch, eine stabile Kommunikation zu schaffen, weil du im Zweifelsfalle schon vor Kommunikationsbeginn aufgibst. Bei einer guten Funkverbindung sollte das eber weniger problematisch sein ...
    Du meinst also, dass ich ähnlich wie bei einer fehlerhaften Datenübertragung auch auf fehlerhafte Tokenübertragung mit direkter Sendewiederholung reagieren soll?
    Was bringt mir das für Vorteile wenn die Unit direkt nochmal das Token bekommt anstatt erst in der nächsten Runde?

    Es hängt immer davon ab, wieviel Zeit du hast. Der langsamste Kryptoalgo ist kein Problem, wenn du keinen engen Zeitrahmen hast.
    Ganz hab ich's sowiso noch nicht heraussen wie ich mein Programm schreiben muss, damit ich den kompletten Controller nicht sperre, wenn ich z.B. 3h FadeIn bei einer Halogenlampe machen will.

    Vielen Dank.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von cd_brenner Beitrag anzeigen
    Du meinst also, dass ich ähnlich wie bei einer fehlerhaften Datenübertragung auch auf fehlerhafte Tokenübertragung mit direkter Sendewiederholung reagieren soll?
    Was bringt mir das für Vorteile wenn die Unit direkt nochmal das Token bekommt anstatt erst in der nächsten Runde?
    Nehmen wir Mal an, du brauchst jede Sekunde neue Daten. Wenn das "Token" bei einem Knoten nicht ankommt, wird er im besten Fall eine Sekunde später (bei der nächsten Iteration) regieren. Oder wenn irgendetwas die Verbindung stark verschlechtert, erst noch viel später. Dieser Aussetzer kann unter Umständen zu lange für deinen Anwendungszweck sein.

    Zitat Zitat von cd_brenner Beitrag anzeigen
    Ganz hab ich's sowiso noch nicht heraussen wie ich mein Programm schreiben muss, damit ich den kompletten Controller nicht sperre, wenn ich z.B. 3h FadeIn bei einer Halogenlampe machen will.
    Ich glaube du möchtest dich Mal ein wenig in Richtung Multitasking auf µCs informieren. Solche einfachen zeitgesteuerten Aufgaben kann man relativ einfach über eine Warteschlange lösen, die in regelmäßigen Abständen (Timer!) gepollt wird. (Stichwort: Delta-Queue). Im Wesentlichen musst du dich einfach darauf einstellen, dass deine Funktionen nicht mehr blockierend warten, sondern sich ihren Zustand merken und dann andere Funktionen weiterrechnen lassen. Das nennt man kooperatives Multitasking.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    05.10.2012
    Beiträge
    33
    Nehmen wir Mal an, du brauchst jede Sekunde neue Daten. Wenn das "Token" bei einem Knoten nicht ankommt, wird er im besten Fall eine Sekunde später (bei der nächsten Iteration) regieren. Oder wenn irgendetwas die Verbindung stark verschlechtert, erst noch viel später. Dieser Aussetzer kann unter Umständen zu lange für deinen Anwendungszweck sein.
    Okay - jetzt hab ichs. Ich bin zu optimistisch an die Sache rangegangen und hab gedacht, dass Sendefehler eh recht selten ist. Wenn eine von 20 Tokennachrichten schief geht wärs nicht so tragisch, wenn das Ergebnis erst 1sec später kommt. Aber offenbar ist Funk doch fehleranfälliger.

    Das nennt man kooperatives Multitasking.
    An sowas hab ich schon gedacht: Quasi immer ein Stückerl abarbeiten sodass die Main-While nicht zu lange unterbrochen ist. Ich denke, ich werde hier relativ oft Flags einsetzen müssen um eine längere Aufgabe wie "fade über 3h ein" zu koordinieren. So wird halt der PWM-Wert alle 20ms (50hz) erhöht - pro Schleifendurchlauf 1x.

    http://stefanfrings.de/avr_io/protosockets.html

    LG Markus
    Geändert von cd_brenner (05.10.2012 um 17:30 Uhr)

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von cd_brenner Beitrag anzeigen
    Okay - jetzt hab ichs. Ich bin zu optimistisch an die Sache rangegangen und hab gedacht, dass Sendefehler eh recht selten ist. Wenn eine von 20 Tokennachrichten schief geht wärs nicht so tragisch, wenn das Ergebnis erst 1sec später kommt. Aber offenbar ist Funk doch fehleranfälliger.
    Muss nicht. Kann aber. Das hängt von deinem Funkmodul, dem Rauschen was sonst noch so in der Umgebung unterwegs ist, sowie der Umgebung selbst, ab. Wenn du einen der Knoten hinter eine Blechwand steckst, kommt halt wenig Pegel beim Empfänger an.
    Worauf ich hinaus wollte: Es gibt eine (dir momentan unbekannte) Verlustwahrscheinlichkeit, du solltest das also berücksichtigen und Gegenmaßnahmen einplanen.

    Zitat Zitat von cd_brenner Beitrag anzeigen
    An sowas hab ich schon gedacht: Quasi immer ein Stückerl abarbeiten sodass die Main-While nicht zu lange unterbrochen ist. Ich denke, ich werde hier relativ oft Flags einsetzen müssen um eine längere Aufgabe wie "fade über 3h ein" zu koordinieren. So wird halt der PWM-Wert alle 20ms (50hz) erhöht - pro Schleifendurchlauf 1x.
    Mal rein aus Neugierde: 3h alle 20ms ein Inkrement entspricht 19-Bit PWM. Mit welchem Mikrocontroller hast du so eine hohe PWM-Auflösung?! Mir ist kein 8-Bit AVR bekannt, der das bietet.
    Und Flags ... naja, ich hätte eher an Zähler gedacht. Wie gesagt, sieh dir Mal die Delta-Queue an, das eignet sich perfekt für zeitgesteuertes Task-Management.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    05.10.2012
    Beiträge
    33
    Muss nicht. Kann aber. Das hängt von deinem Funkmodul, dem Rauschen was sonst noch so in der Umgebung unterwegs ist, sowie der Umgebung selbst, ab. Wenn du einen der Knoten hinter eine Blechwand steckst, kommt halt wenig Pegel beim Empfänger an.
    Worauf ich hinaus wollte: Es gibt eine (dir momentan unbekannte) Verlustwahrscheinlichkeit, du solltest das also berücksichtigen und Gegenmaßnahmen einplanen.
    Okay - danke für deine ausführliche Erklärung!

    Mal rein aus Neugierde: 3h alle 20ms ein Inkrement entspricht 19-Bit PWM. Mit welchem Mikrocontroller hast du so eine hohe PWM-Auflösung?! Mir ist kein 8-Bit AVR bekannt, der das bietet.
    Bei dieser Aussage hab ich das natürlich nicht bedacht - ist aber klar, dass die Auflösung bei so vielen Werten nicht mitspielt. Ich denke die PWM Frequenz muss sowiso an den entsprechenden Anwendungsfall angepasst werden. Bei LEDs würde ich diese höher wählen als bei recht trägen Halogenspots.

    Frage am Rande: Welchen MOSFET kann ich für einen 20W Halogenspot mit 12V verwenden?

    Ist es klug auf einem Microcontroller den Speicher für den FrameBuffer (Nachricht empfangen -> Buffer schreiben -> Tokenweitergabe -> Buffer lesen -> Nachricht senden) dynamisch zu allokieren (malloc) - denn es ist effektiver wenn der Buffer nicht wie ein FIFO funktioniert, sondern auch Frames "in der Mitte" aus dem Buffer lesen kann, oder?

    Vielen Dank.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Kandel
    Alter
    29
    Beiträge
    1.220
    Zitat Zitat von cd_brenner Beitrag anzeigen
    Frage am Rande: Welchen MOSFET kann ich für einen 20W Halogenspot mit 12V verwenden?
    So ziemlich jeder Leistungs-MOSTFET wird sich da langweilen. Nimm den günstigsten n-MOS der 2,5A oder mehr ab kann und einen niedrigen RDS_on bei Logikpegeln (5V) hat. Günstig zu haben ist zum Beispiel der IRLZ24, mit einem RDS_on von 0,1Ohm macht das eine Verlustleistung von nur 0,17W bei den 20W/12V=1,7V die da fließen.
    Ach ja: Die Lampe wird mit Gleichspannung betrieben, oder? Normale MOSFETs können keine Wechselspannung schalten.

    Zitat Zitat von cd_brenner Beitrag anzeigen
    Ist es klug auf einem Microcontroller den Speicher für den FrameBuffer (Nachricht empfangen -> Buffer schreiben -> Tokenweitergabe -> Buffer lesen -> Nachricht senden) dynamisch zu allokieren (malloc) - denn es ist effektiver wenn der Buffer nicht wie ein FIFO funktioniert, sondern auch Frames "in der Mitte" aus dem Buffer lesen kann, oder?
    Dynamische Speicherallokation auf Mikrocontrollern ist normalerweise eine schlechte Idee. Langsam, benötigt größere Mengen Flash für die Speicherverwaltung und ist anfällig für Speicherfragmentierung.

    Was du mit dem zweiten Teil der Frage meinst, erschließt sich mir leider nicht.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Netzwerkprotokoll im kleinen Maßstab
    Von Technipion im Forum Software, Algorithmen und KI
    Antworten: 14
    Letzter Beitrag: 18.08.2012, 20:57
  2. Funkmodul RFM12
    Von Thomas$ im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 31
    Letzter Beitrag: 31.07.2009, 11:55
  3. RFM12 ATMega8
    Von Goldenflash im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 20.01.2009, 00:28
  4. Grundschaltung RFM12
    Von Jaecko im Forum Elektronik
    Antworten: 6
    Letzter Beitrag: 31.08.2008, 12:03
  5. RFM12 Funksteckdose
    Von Micha.Berlin im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 20.05.2008, 23:46

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •