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!
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...
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.
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.