Hallo, ich verzweifel seit einiger Zeit an einer Aufgabe. Ich habe vor einen Gerätenamen (bspw. Küchenfenster) in eine äquivalente Nummer zu wandeln (16-Bit). Die Namenlänge kann man begrenzen, dass der Wert nie größer als 16 Bit (65534) wird. Umlaute könnte man automatisch umrechnen in ue, oe, das wäre auch nicht das Problem. Ich finde nur keine Möglichkeit, hier eine gute Lösung zu finden. Wenn man die Zeichen als ASCII interpretiert, und dann decimal aufsummiert hat man das Problem das man keine Reihenfolge erkennt. HALLO, ALOAH, HLOLH wäre alles die gleiche Nummer. Das ist noch nicht so optimal. Eine Rücktransformation (Nummer -> Name) muss nicht mehr stattfinden, es reicht wenn ich die Zahl habe, damit wird dann weitergearbeitet. Hat jmd. eine Idee wie man das realisieren könnte? kurzer Nachtrag: Der Name ist FREI änderbar!! Ich habe keine Ahnung wie der Name ist/sein kann, daher geht eine Tabelle nicht!
Dekodierung über eine Tabelle mit Strings, das ist immer eindeutig. Oder einen Hash berechnen, allerdings ist der nicht immer eindeutig.
Marius D. schrieb: > Hat jmd. eine Idee wie man das realisieren könnte? das geht nicht. entweder kannst du mit Kollisionen leben oder du verwendest eine feste Tabelle.
Marius D. schrieb: > Hallo, > > Ich habe vor einen Gerätenamen (bspw. Küchenfenster) in eine äquivalente Nummer zu wandeln (16-Bit) Wie genau ist die Transformationsvorschrift? Ggf. ein Hash oder ein CRC. Ggf. ein Struct mit { uint16_t idx char name[20] }
Marius D. schrieb: > Hat jmd. eine Idee wie man das realisieren könnte? Prinzipiell kannst du nicht einen großen Werteraum (5 ASCII Zeichen mit Zahlen und Groß-Kleinschreibung = (26+26+10)^5 = 916132832 Möglichkeiten) auf einen kleinen (16 Bit = 65536 Möglichkeiten) abbilden, ohne dass du Doppelbelegungen hast. Mit einem beliebig breiten Tag kannst du zwar die Wahrscheinlichkeit reduzieren, aber weil du dich auf 16 Bit begrenzt hast, wirst du mit wahrnehmbarer Häufigkeit Doppelungen haben. Alles eine Frage der Wahrscheinlichkeit...
Hallo, kurzer Nachtrag: Der Name ist FREI änderbar!! Ich habe keine Ahnung wie der Name ist/sein kann, daher geht eine Tabelle nicht!
Marius D. schrieb: > Der Name ist FREI änderbar!! Ich habe keine Ahnung wie der Name ist/sein > kann, daher geht eine Tabelle nicht! warum willst du den String überhaupt in eine Zahl umwandeln? Beschreibe mal dein Problem etwas genauer.
Matthias Q. schrieb: > Marius D. schrieb: >> Hallo, >> >> Ich habe vor einen > Gerätenamen (bspw. Küchenfenster) in eine äquivalente Nummer zu wandeln > (16-Bit) > > Wie genau ist die Transformationsvorschrift? > > Ggf. ein Hash oder ein CRC. Ggf. ein Struct mit { > uint16_t idx > char name[20] > } Okay klingt Interessant, Tabelle ist raus. Wie würde denn der Hash oder CRC funktionieren, wenn der Eingabestring völlig frei definierbar ist?
Peter II schrieb: > Marius D. schrieb: >> Der Name ist FREI änderbar!! Ich habe keine Ahnung wie der Name ist/sein >> kann, daher geht eine Tabelle nicht! > > > warum willst du den String überhaupt in eine Zahl umwandeln? > > Beschreibe mal dein Problem etwas genauer. Ich habe ein Hausautomationssystem gebaut. MEGA328 + DHT + 2 Triacs + ESP8266. Das kann man dann in jede Unterputz/Aufputzdose stecken. Steuerung erfolgt via Handy (App mache ich mit dem App-Inventor, da bin ich zu faul für Eclipse und Java :D, PC-Terminal ist mit VisualBasic programmiert. Firmware vom Controller in C). Jetzt hat der ESP eine feste IP (da dynamisch mit AppInventor nicht zu finden ist, VB braucht da auch sehr lange, das will nicht so richtig). Da ich eine feste IP habe, muss ich jedem Gerät einen PORT zuweisen für die Kommunikation via TCP/IP or HTTP GET/PUT. Dieser PORT ist 16-Bit groß und soll vom Namen abhängen. Bspw. Küchenrolllade = Port 0, Küchenfenster = Port 1, etc...
@ Marius Dege (2009marius15) >Okay klingt Interessant, Tabelle ist raus. >Wie würde denn der Hash oder CRC funktionieren, wenn der Eingabestring >völlig frei definierbar ist? Mann muss eine Tabelle aller bisher erkannten/aktuellen Hashtags anlegen und bei einem neuen String prüfen, ob der neue Hash noch nicht vorhanden ist. Wenn doch, musst du reagieren.
Marius D. schrieb: > Da ich eine feste IP habe, muss ich jedem Gerät einen PORT zuweisen für > die Kommunikation via TCP/IP or HTTP GET/PUT. Dieser PORT ist 16-Bit > groß und soll vom Namen abhängen. warum sollte man das so machen? Warum nicht alle geräte über den gleichen Port? Übermittle doch in den Daten einfach auch den String?
Peter D. schrieb: > Nimm eine CRC16 (AVR-GCC: "crc16.h"). die Wahrscheinlichkeit für eine Kollision ist viel zu hoch. Sein Ansatz mit den Ports ist einfach "falsch".
Peter II schrieb: > Marius D. schrieb: >> Da ich eine feste IP habe, muss ich jedem Gerät einen PORT zuweisen für >> die Kommunikation via TCP/IP or HTTP GET/PUT. Dieser PORT ist 16-Bit >> groß und soll vom Namen abhängen. > > warum sollte man das so machen? > > Warum nicht alle geräte über den gleichen Port? Übermittle doch in den > Daten einfach auch den String? Mhh. Es ist zzt. noch in der Entwicklung, von daher kann ich jetzt Änderungen noch leicht ändern. Gleicher Port wäre machbar. Namensstring mitsenden, Gerät sucht dann seine Daten raus. Das ist eigentlich ganz gut, auf das einfache kommt man natürlich nicht :D
> HALLO, ALOAH, HLOLH
1. Byte Anfangsbuchstabe
2. Byte Namenslänge
3. Byte Endbuchstabe
4. Byte laufende Nummer
Hallo 48.04.4C.01
ALOAH 41.04.4F.02
HLOLH 48.04.48.03
Die laufende Nummer kann man auf weitere - freie - Bits ausdehnen.
Obolus schrieb: >> HALLO, ALOAH, HLOLH > > 1. Byte Anfangsbuchstabe > 2. Byte Namenslänge > 3. Byte Endbuchstabe > 4. Byte laufende Nummer > > Hallo 48.04.4C.01 > ALOAH 41.04.4F.02 > HLOLH 48.04.48.03 > > Die laufende Nummer kann man auf weitere - freie - Bits ausdehnen bei mir haben 16bit nur 2 Byte.
Peter II schrieb: > Obolus schrieb: >>> HALLO, ALOAH, HLOLH >> >> 1. Byte Anfangsbuchstabe >> 2. Byte Namenslänge >> 3. Byte Endbuchstabe >> 4. Byte laufende Nummer >> >> Hallo 48.04.4C.01 >> ALOAH 41.04.4F.02 >> HLOLH 48.04.48.03 >> >> Die laufende Nummer kann man auf weitere - freie - Bits ausdehnen > > bei mir haben 16bit nur 2 Byte. Asche auf mein Haupt.
Wenn's noch in der Entwicklung ist, dann entwickle doch eine Anlernfunktion.
Lernender schrieb: > Wenn's noch in der Entwicklung ist, dann entwickle doch eine > Anlernfunktion. Wie meinst du das? Ich finde die Idee mit der Namensübermittlung ganz gut. Ist zwar rel. viel Overhead, aber würde klar gehen. Der Vorteil ist auch das man auch global alle ansprechen könnte.
Hallo, Marius D. schrieb: > Ich habe ein Hausautomationssystem gebaut. MEGA328 + DHT + 2 Triacs + > ESP8266. Das kann man dann in jede Unterputz/Aufputzdose stecken. ich denke, den MEGA328 hätte ich noch weggelassen. > > Steuerung erfolgt via Handy (App mache ich mit dem App-Inventor, da bin > ich zu faul für Eclipse und Java :D, PC-Terminal ist mit VisualBasic > programmiert. Firmware vom Controller in C). Protokoll der Wahl für solche Sachen ist bei mir MQTT. Nachteil: ein RasPi o.ä. mit Mosquitto als MQTT-Broker Vorteil: alle Protokollsachen nahezu beliebig realisierbar Sachen wie KeepAlive usw. bereits Bestandteil Bibliotheken und Software für nahezu jedes System, incl. AVR und ESP8266 Gruß aus Berlin Michael
Michael U. schrieb: > Hallo, > Marius D. schrieb: >> Ich habe ein Hausautomationssystem gebaut. MEGA328 + DHT + 2 Triacs + >> ESP8266. Das kann man dann in jede Unterputz/Aufputzdose stecken. > > ich denke, den MEGA328 hätte ich noch weggelassen. >> >> Steuerung erfolgt via Handy (App mache ich mit dem App-Inventor, da bin >> ich zu faul für Eclipse und Java :D, PC-Terminal ist mit VisualBasic >> programmiert. Firmware vom Controller in C). > > Protokoll der Wahl für solche Sachen ist bei mir MQTT. > Nachteil: > ein RasPi o.ä. mit Mosquitto als MQTT-Broker > Vorteil: > alle Protokollsachen nahezu beliebig realisierbar > Sachen wie KeepAlive usw. bereits Bestandteil > Bibliotheken und Software für nahezu jedes System, incl. AVR und > ESP8266 > > Gruß aus Berlin > Michael Nein nein, der MEGA hat schon Sinn. Da läuft meine FW + Bootloader drauf, die ich updaten kann mittels PC oder meiner App. Außerdem bin ich da freier in der Software, Ansteuerung der Komponenten, NSP Detection (Interrupts, Timer, ADC etc...). Geht bestimmt auch direkt auf dem ESP, aber bis ich mich da eingearbeitet habe, habe ich die FW des MEGA 10x fertig. Raspi macht auch keinen Sinn, zum einen wegen der Einarbeitung, zum anderen denke ich mal braucht der auch weitaus mehr Strom als der MEGA der mit 4Mhz läuft. Zudem habe ich es super klein bekommen alles, und es gibt sogar 4 HW-Versionen (Software selektiert sich selber). Ich habe mit dem ESP bis jetzt auch noch keine Einschränkungen gehabt, finde die Dinger echt gut (und billig für 1,50$). Mit Raspi bin ich nicht so billig wie mit meiner jetzigen HW.
Marius D. schrieb: > Jetzt hat der ESP eine feste IP (da dynamisch mit AppInventor nicht zu > finden ist, VB braucht da auch sehr lange, das will nicht so richtig). Mal ne dumme Frage: wenn der ESP eine feste IP hat, musst du doch irgendwo eine Tabelle haben mit all den IPs der verschiedenen ESPs? Oder meinst du, jeder ESP hat die gleiche IP? Wie soll das denn im Netzwerk funktionieren mit mehreren Geräten und der gleichen IP? Oder spannt jeder ESP ein eigenes WLAN auf, in das du dich dann anmeldest? Dann muss praktischerweise jedes WLAN ja auch eine sinvolle SSID haben, die es identifiziert, womit du die notwendige Info dann auch hast...
Tassilo H. schrieb: > Marius D. schrieb: >> Jetzt hat der ESP eine feste IP (da dynamisch mit AppInventor nicht zu >> finden ist, VB braucht da auch sehr lange, das will nicht so richtig). > > Mal ne dumme Frage: > wenn der ESP eine feste IP hat, musst du doch irgendwo eine Tabelle > haben mit all den IPs der verschiedenen ESPs? Oder meinst du, jeder ESP > hat die gleiche IP? Wie soll das denn im Netzwerk funktionieren mit > mehreren Geräten und der gleichen IP? > Oder spannt jeder ESP ein eigenes WLAN auf, in das du dich dann > anmeldest? Dann muss praktischerweise jedes WLAN ja auch eine sinvolle > SSID haben, die es identifiziert, womit du die notwendige Info dann auch > hast... Nein, jeder ESP ist in meinem Heimnetzwerk angemeldet mit Static-IP. Das kann man einstellen. Der Port ist auch überall gleich. Es ist immer die .205 bei mir. Dann hat jedes Gerät einen Namen (Tür, Fenster, Badlampe, etc...)
Marius D. schrieb: > Nein, jeder ESP ist in meinem Heimnetzwerk angemeldet mit Static-IP. Das > kann man einstellen. Der Port ist auch überall gleich. Es ist immer die > .205 bei mir. Dann hat jedes Gerät einen Namen (Tür, Fenster, Badlampe, > etc...) bedenkst du auch das viele Home-Router (Accesspoints) teilweise nur 16 Geräte gleichzeitig können?
Marius D. schrieb: > Hat jmd. eine Idee wie man das realisieren könnte? Im Prinzip gar nicht, 16 bit reichen nur für 2 Zeichen. Selbst wenn du die Zeichenmenge einschränkst auf Grossbuchstaben mit Umlauten reicht es nur für 3 Zeichen. Windows macht das mit Atoms, da wird eine Tabelle aller im System benutzen Strings aufgebaut und jedes bekommt eine Nummer. Man muss jeden String in diesem String-Pool eintragen und bekommt die 16 bit Nummer, bei demselben String dieselbe Nummer, aber daszu braucht man eine Zentrale die die Strings verwaltet, und löschen kann man die Strings nicht mehr weil keine Nummer doppelt vergeben werden darf (bis zum nächsten Reboot), es sei denn, man zählt mit wie viele die Strings verwendeun und informiert diesen Stringpool wenn man einen String nicht mehr benötigt. Die andere Alternative wäre es, einen hash-Wert zu bilden, aber dabei können Kollisionen auftreten (unterschiedliche Strings bekommen dieselbe Nummer), perfekt ist die Lösung also nicht. Und hash-Werte mit Tabelle gegen Duplikate benötigen wieder die Zentrale.
MaWin schrieb: > mehr benötigt. > > Die andere Alternative wäre es, einen hash-Wert zu bilden, aber dabei > können Kollisionen auftreten (unterschiedliche Strings bekommen dieselbe > Nummer), perfekt ist die Lösung also nicht. > > Und hash-Werte mit Tabelle gegen Duplikate benötigen wieder die > Zentrale. Ist eigentlich schon alles geklärt, war ein Denkfehler.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.