AVB in der Theorie super aber die Praxis ist eher bescheiden

  • Solch eine API zu entwickeln ist nicht so einfach und ich hatte vorher keine Ahnung davon. Man lernt im Prozess und deswegen muss ich einige Dinge wieder über den Haufen werfen, da sie sich als unklug erweisen :/. das kostet natürlich Zeit, wenn man nur alleine daran werkelt.


    Noch kommen die meisten Daten leider noch nicht aus der Datenbank, ich muss erst das HATEOAS Thema abarbeiten. Da sich wie schon erwähnt die Json nochmal ändern. Wenn die Daten aus der Datenbank kommen kann ich wieder an dem Thema ansetzten was mit meine File basierten Store nicht ging.


    Dann kann man die Möglichkeiten der Datenbank voll ausnutzen und genau das ist so genial... Allerdings zeigt sich auch das mit der Datenbank trotz Optimierung die Sache aus bremst :( Also zumindest das füllen der Tabelle, in der Abfrage sieht es erst mal so aus als ob das keinen unterschied ausmacht. Ich habe schon an einer Lösung gedacht um das Problem zu kompensieren.

    Einmal editiert, zuletzt von marcoboy ()

  • Manchmal verliert man plötzlich den Anhänger...


    Folgendes Problem da die IEEE etwas vergessen hat.


    Der Descriptor "streamPortInput oder streamPortOutput" zeigt auf MAP und CLUSTER descriptoren. Nun weiß man aber nicht als welcher UNIT sie kommen.


    audioUnit-> audioMap u. audioCluster ; videoUnit -> videoMap u. videoCluster und sensorUnit u. sensorMap.


    Um den richtigen Descriptor aufzurufen muss man also wissen welcher streamPort der Unit zugeordnet wurde. Diese Information ist nicht im Descriptor StreamPort enthalten.


    Jetzt gibt es drei Möglichkeiten.


    A: man sucht in der Datenbank -> müsste man in 3 tabellen audioUnit/videoUnit/sensorUnit suchen

    B: wir schauen in der URI nach ob da audioUnit,videoUnit oder sensorUnit auftaucht

    C: man schaut in der Dokumention nach, was man aufrufen kann -> geht nicht wir wollen ja HATEOAS


    Wie lösen das andere ?? Sie unterstützen ausschließlich nur audioUnits dann kann es nur ein audioMap u. audioCluster sein...


    Wir wollen es besser machen und haben das Problem gelöst :D...

  • So Embedded Resources sind da...


    Was ist das ??? Das sind Rescource die Innerhalb der Daten entstehen können, um nicht weitere Anfragen auszulösen stellt man die Interessanten Daten innerhalb dieses Object dar.


    Gezeigt hier im localized description. Was ist das ? Es ist ein Feld welche in Abhängigkeit das ausgewählten descriptors "locale" auf den entsprechenden String zeigt.


    Für jede Sprache gibt es einen "locale" descriptor. Wie kann man nun auf die Sprache auswählen ?


    Ich habe mich für einen Query entschieden, also an der uri http://..../?langIndex= 0 ohne query wird immer default 0 ausgewählt... So wie es der Standard vorschreibt. Kann man bei anderen Controllern die Sprache umschalten.. Nö.... es gibt noch andere Möglichkeiten, im Header, oder als URI .../en/...


    Die Daten werden dargestellt und der link zeigt auf den entsprechenden strings descriptor.

  • Hier mal noch zwei weitere Beispiele..


    ClockDomain -> enthält mehre ClockSources...

    externalPort -> enthält physische Schnittstellen (Jacks)....


    internal, external und jacks descriptoren werden in Hive nicht angezeigt, warum auch immer....

    Die Abwägung ist immer Daten aus den links anzuzeigen oder auch nicht...


    Ein weiteres Hindernis taucht nun auf, wenn man Daten Ressourcen ändern wollte ging das mit Forms. Das war recht einfach... Nun geht der Client meist davon aus das der die Daten in dem Format in dem er sie bekommt auch ändern kann. Die bedeutet die Daten auch als Json entgegen zunehmen. Der Client macht ein GET auf die Ressource, dann hat er das Schema und sendet diese verändert wieder zurück. Das macht eine größere Baustelle auf...

  • Halli Hallo...


    ich wollte ich nicht mit Kleinigkeiten behelligen:)...


    Was gibt es neues ?


    Alle Json wurden überarbeitet, vereinfacht, vor allem was die von Raw Values betrifft. Dieser werden als Objekt dargestellt und dessen Bedeutung ist Teil dies Objektes oder ein weiteres.



    Alle Descriptoren werden geprüft ob die Values korrekt sind (range etc. ), Probleme erscheinen im Objekt warnings[]. Alle Signale werden als HAL Links angezeigt und lassen sich so verfolgen. Alle Descriptoren wurden getestet, dazu habe ich mir ein Entity gebaut welches alle unterstützt. Andere Controller sehen dabei recht alt aus 8o... Auch wird geprüft ob sie in der Struktur an der korrekten stelle auftauchen. So das geprüft wurde ob der Controller auch alle Descriptoren abfragt und in der DB korrekt einträgt.


    Alle security Funktionen wurden umgesetzt ! Auch mit HAL ! Das hat zwei Wochen gedauert im das zu verstehen wie sie das im Standard meinen und die Funktionen Sinnvoll in der HAL Struktur abzubilden. Hierzu kann ich noch etwas mehr erzählen wenn gewünscht... Zumal kommt der Controller mit verschlüsselten Entitys klar, sobald sie auf dem Markt verfügbar wären X/...


    In HAL erscheinen alle commands die mit dem Ressource möglich sind, wenn sie vom Entity unterstützt werden -> ADP Flags...


    HAL lässt sich abschalten, wer es nicht braucht...


    Etwas Ordnung schaffen Doku nachholen...


    Das nächste große Projekt wird sind POST/PUT etc. als Json auszuwerten....


    Ich arbeite daran :huh:

  • Ach du dickes Ei =O... :update


    Ich habe das ganze noch mal genau geprüft und musste feststellen, so wie ich es meinte hätte man es lösen können. Hat man aber nicht :/.... Man macht den connectionCount zum index... Bedeutet mit dem txConnection und dem connectionCount -> zero basierend fragt beim beim Talker das flow Paar ab.


    Nur leider geht mir so dann eine GET Ressource flöten, zumindest ohne den eigenen Datenbestand zu bemühen.


    Deswegen mussten die Links etwas umgearbeitet werden..

    5 Mal editiert, zuletzt von marcoboy ()


  • Wenn man über den tx path werden die Verbindungen der Quelle angezeigt.. mit txConnection lassen sich diese dann abfragen... stopFlow wirkt auf den streamOutput des Gerätes und es bewirkt das die Quelle keine Pakete mehr sendet. Die Bandbreite bleibt aber per SRP reserviert. Ist hier das Flag "STREAMING_WAIT" steht dort startFlow ;)..




    und auch disconnecten :)


    5 Mal editiert, zuletzt von marcoboy ()

  • Ich bin gerade dabei den Code zu überarbeiten und den HTTP Server gewisse Möglichkeiten zu verpassen den Zugriff auf auf Ressourcen zu regeln... Da schon ganz viele, wir reden von 7 Leute den Workspace herunter geladen haben besteht denn Interesse das mal Live auszuprobieren ? Prinzipiell bestünde die Möglichkeit das ich einen VPN Zugang frei schalten zum AVB Testfeld. In dem Workspace sind Umgebungsvariablen, die sind dann auf die Adresse des Controllers zu ändern... Erkläre ich dann wie das geht...


    Die Dokumentation findet man im Reiter "DOCS" ... Ohne AVB Kenntnisse ist das allerdings schwer zu verstehen :/.. Zumindest sieht man aber die JSON Response. Die HAL API ist da schon einfacher, man klickt sich einfach durch....


    Das makefile bedarf auch noch einer Nacharbeit, da fehlt noch einiges um den Controller als Dienst zu installieren.


    RPIs kann man natürlich auch versenden, aber ohne Code da ich mit der Lizenz nach uneins bin...

  • Da wir hier in einen Technisch geprägten Forum sind, werden die meisten nicht an ein Enzym denken :rolleyes:.


    Das mit der URL deny und allow liste funktioniert, IP Adressen match ist in Arbeit... Allerdings plane ich ich Wildcards einzubauen https://de.wikipedia.org/wiki/Wildcard_(Informatik) ..


    Vielleicht wird es auch noch ein Modul Python, CGI geben... damit wäre es möglich z.Bsp begrenzt auf interne Variablen zu zugreifen. Oder auch auch Hardware wie z.Bsp eine Switch in den Controller mit einzubinden.. Ich werde mich mal mit dem Modulkonzept von HTTP Servern auseinander setzen..


    Bevor das kommt, räume ich den Code aber noch kräftig auf... Mir vielen auf dem Klo noch eine Ideen ein diesen übersichtlicher zu gestalten....


    Die Möglichkeiten Geräte zu ignorieren wird es auch geben...

  • So so... Ich habe den Code nochmals stark umgearbeitet und aufgeräumt. Das wird mich auch noch eine weile beschäftigen. Zentrales Element ist eine Buffer und Array Struktur um Speicher dynamisch für alles mögliche zu handeln. Das hätte man vorher machen sollen, so eine typisches Ding wenn man keine Ahnung hat. Baustützen darunter und los ging es... Mit Valgrid den Code dann ausgiebig untersucht und gehofft nichts dummes mit eingebaut zu haben.


    Auch der HTTP Code wurde überarbeitet, die meisten Callbacks werden jetzt in einem Zyklus verarbeitet. So das sich die Antwortzeiten auf eine Anfrage verringerten.


    Um auf den Speicher mit dem AECP_AA zu zugreifen müssen keine Parameter mehr übergeben werden. Sie werden aus dem Descriptor Store gelesen. Keine Querys mehr um die Daten abzufragen. Der erste Schritt um die Daten bei der Abfrage nicht mehr zwischen zu speichern, um per Chunks die Daten zu übertragen. Ein einfaches GET auf die Ressource und je nach content_type kommt dann der Inhalt direkt oder base64 codiert.


    Allerdings wird der HAL Link nicht angezeigt ? Warum, da Apple das Flag das sie den memory Zugriff unterstützen in den ADP Daten nicht setzen. Tja... an der Stelle Lachen wir laut, Hive ließt ihn trotzdem aus.


    Der Upload z.Bsp von Firmware funktioniert dann genau umgekehrt. So kann man auch mehre Gigabyte in das Gerät laden oder holen.


    Wie bleiben an dem Thema dran... :).. Da die API ja so zu sagen fix ist wäre ein HTML/Javascript kundige nicht schlecht. Es ginge nur um eine Art Demo Seite. Die Json Profile müssen auch noch generiert werden....

  • Tadaaa...

    Auslesen des Memorys per chunks und kann der client im Header -> "Accept: application/json;q=0.9, image/webp,*/*;q=0.8" bekanntmachen das er den Inhalt auch so versteht.


    Dreht man den q Faktor um erzwingt man das die Antwort kein json ist, soweit dies möglich ist. Entweder kommt dann 406 Not Acceptable oder das was der Server ausliefern kann.


    Das "q" steht für die Wertigkeit. Bedeutet der Client bevorzugt json akzeptiert aber auch ein image oder alles andere. Im Antwort Header wird je nach Inhalt Content Type ausgewählt und dann kommt auch ein Bild :).. Alles was nicht darstellbar ist kommt als "application/octet-stream", wo mit das download Fenster aufgeht.

  • Allerdings offenbart sich schnell das dieser Zugriff seitens Apple im Gerät ein Problem auslöst. Macht man dies zu oft startet die AVB Stack im Apple offenbar neu.


    Es Antwortet auf Packete nicht mehr und sendet ein "depart" -> meldet sich vom Netzwerk ab, ein paar Sekunden später erscheint es wieder mit dem dem Index 0. Wovon ich ausgehe das der ganze Stack neu gestartet wurde. Ich vermute das man auch so den Stream abschießen kann.


    Ob das über High Siera 10.13.6 auch noch so ist nehme ich an...


    :edit man kann den Stream damit abschießen ! Die Adressen vom Inhalt wurden auch geändert, also muss es hierzu auch eine Änderung gegeben haben. Vielleicht wurde deswegen des Flag im ADP entfernt ?


    Wie man oben in der Konsole sieht wird die TCP/IP Verbindung einfach so vom Controller zu gemacht. Die Daten aus dem Geräten werden in einen Buffer Größe x gesammelt und dann als Chunk (kleine Teilstücke) an den Browser gesendet. Beim HTTP Protokoll wir der Header zu erst gesendet. Tritt während der Übertragung der Chunks ein Fehler auf, wie hier das man die Daten aus dem Gerät nicht vollständig bekommt gibt es Problem. Im Header steht der Status 200 OK, bei der Übertragung ist dann nicht mehr alles OK. Die Daten sind unvollständig, trotz des Statuscodes 200. Der Client muss nun anhand der Länge prüfen ob der Body korrekt übertragen wurde. Alternativ kann man in der Fußzeile -> trailers gewisse Parameter setzen. Aber der Browser muss diesen auch auswerten, macht viele offenbar nicht. Man kann also nur hoffen, das dass schließen der TCP/IP Verbindung ähnlich wie beim MQTT als Error vom client verstanden wird.

  • Da schon ganz viele, wir reden von 7 Leute den Workspace herunter geladen haben besteht denn Interesse das mal Live auszuprobieren ? Prinzipiell bestünde die Möglichkeit das ich einen VPN Zugang frei schalten zum AVB Testfeld. In dem Workspace sind Umgebungsvariablen, die sind dann auf die Adresse des Controllers zu ändern... Erkläre ich dann wie das geht...


    wahrscheinlich "etwas" verspätet - aber ja das Interesse wäre da.