Jump to content

IPConnection.Enumerate - Handhabung, Verbesserungen


Recommended Posts

Schade, dass die Enumerate Methode keine weiteren Events auslöst zum Beispiel wenn die Enumeration fertig ist. Problem im Moment ist, dass im Debugmodus und auf Klick Events aufgeteilt meine Methoden funktionieren.

 

Ich lade mir zuerst per IPConnection.Enumerate alle Daten der angeschlossenen Bricks und speicher diese in verschiedene Listen, dann will ich aus diesen Informationen alle Device Objekte erstellen.

 

Sobald ich dies aber in einer Konsolenanwendung automatisch hintereinander ausführe ist die Enumeration noch nicht fertig...  :o ...Ich arbeite ungerne mit Thread.Sleep oder irgendwelchen Dummy Schleifen, da es Debug\Relese Probleme nach sich ziehen kann.

 

Gibt es eine Methode das Ende Enumerate der zu ermitteln? Oder könnt ihr ein Event\Callback definieren was nach der Enumerate Methode ausgelöst wird?

Ich denke an etwas wie IPConnection.Enumerated (int AnzahlDevices). Übergeben wird dann die Anzahl aller Bricks und Bricklets.

 

Hat sonst noch jemand versucht die Bricks Dynamisch mittels Enumerate  anzulegen?

Hat jemand eine Idee das Ende der Enumerate Aufrufe abzuwarten ohne x ms zu warten?

 

Link to comment
Share on other sites

Das ist leider Protokollbedingt gar nicht so einfach umzusetzen.

 

Wenn du ein Enumerate erzwingst wird eine broadcast Nachricht losgeschickt auf die alle Bricks/Bricklets antworten.

 

D.h. der Master bekommt die Enumerate Nachricht, Antwortet darauf (mit seinem Namen, Version etc) und gibt die Nachricht dann weiter an alle seine Bricklets, Stack Teilnehmer und Extension Slaves. Die geben es entsprechend auch wieder weiter an alle Bricks/Brickelts die sie kennen.

 

Das funktioniert so weit ganz gut und es ist auch garantiert das jedes Brick/Bricklet erreicht wird, allerdings weiß kein Teilnehmer des Systems wann die letzte Nachricht rausgeht!

 

Der einzige der überhaupt weiß wieviele Teilnehmer es im System gibt ist brickd. Im hinblick auf die WLAN Extension füge ich dem allerdings nur ungerne mehr Intelligenz hinzu, weil das die Implementierung für die WLAN Extension später viel aufwendiger machen würde.

Link to comment
Share on other sites

Wenn das SO ist, dann wird mir nicht viel anderes übrigbleiben dazwischen eine Wartezeit einzulegen... Oder gibt es eine Option vor der Enumeration beim brickd die Anzahl der Bricks zu erfahren? So könnte man vergleichen bis alle Bricks geantwortet haben.

 

Wie arbeitet der Daemon? Wann weis er wieviele Bricks angesteckt sind?

 

Link to comment
Share on other sites

Ich bin dazu übergegangen, die Ergebnisse vom Enumerate in einer Datenbank abzulegen. Beim Programmstart kann ich dann entweder die Daten aus der DB wieder einlesen oder doch noch ein Enumerate erzwingen. Eigentlich wäre es schöner gewesen, wenn der brickd die Information schon cachen würde.

Link to comment
Share on other sites

@Wumpus: Die Idee mit einer Datenbank hatte ich auch, aber ich habe mich noch nicht auf ein Verwaltungskonzept mit den Bricks einigen können.

 

Im Grunde müsste ich entweder Vorgeben was gerade angesteckt ist oder erst auf die Enumeration warten. Da ich auf ein "Brick ist nicht da, Komponente Offline" hinaus will ich es nicht Vorgeben. Andererseits könnte man Kombinationen in der DB Vorgeben welche angesteckt sein müssen und auf diese wird dann geprüft...

 

Bis ich da ein Konzept habe arbeite ich an einen 3 Button Menü System ^^

Link to comment
Share on other sites

Worauf legst du denn am meisten Wert? Die Bestückung mit Bricklets sollte sich ja nicht allzu häufig ändern. Ist mehr oder minder semistatisch, man muss Geld in die Hand nehmen. Auf der anderen Seite kann es natürlich immer mal wieder vorkommen, dass irgendwelche Bestandteile gerade den Geist aufgeben

und resetet werden wollen.

 

Für den ersteren Fall läuft bei mir Quasi im Hintergrund (alle 10 Minuten) ein Enumerate als separater Prozess und überschreibt die Datenbank. Ich setze dabei auch Zeitstempel pro Bricklet. Dann weiss man welche Bricklets wie lange nicht mehr gesehen wurden. Das ganze kann man noch ergänzen, wenn z.B. eine Abfrage eines Wertes mit GET fehlerhaft (z.B. timeout) ist markiert man den Eintrag in der DB entsprechend und nutzt den Eintrag nicht.

Link to comment
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.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...