String in äquivalente Nummer wandeln

Gast #4810453
Lesenswert?

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!
Moderator (Firma: Titel) Persönliche Seite #4810467
Lesenswert?

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...
Gast #4810482
Lesenswert?

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?
Gast #4810492
Lesenswert?

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...
#4810495
Lesenswert?

@ 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.
Gast #4810497
Lesenswert?

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?
Gast #4810510
Lesenswert?

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
Gast #4810515
Lesenswert?

> 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.
Gast #4810517
Lesenswert?

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.
Gast #4810532
Lesenswert?

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.
Gast #4810557
Lesenswert?

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.
#4811328
Lesenswert?

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
Gast #4813571
Lesenswert?

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.
#4813591
Lesenswert?

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...
Gast #4814328
Lesenswert?

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...)
Gast #4814331
Lesenswert?

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?
Gast #4814353
Lesenswert?

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.
Gast #4814429
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren