Forum: Mikrocontroller und Digitale Elektronik String in äquivalente Nummer wandeln


von MOBA 2. (Gast)


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!

von Falk B. (falk)


Lesenswert?

Dekodierung über eine Tabelle mit Strings, das ist immer eindeutig. Oder 
einen Hash berechnen, allerdings ist der nicht immer eindeutig.

von Stefan K. (stefan64)


Lesenswert?

Ich glaube, was Du suchst, ist ein Hashtag.

Gruß, Stefan

von ick auf Beitrags (Gast)


Lesenswert?

Hashing

von Falk B. (falk)


Lesenswert?


von Peter II (Gast)


Lesenswert?

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.

von Matthias Q. (zaphod_beeblebrox)


Lesenswert?

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]
}

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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

von MOBA 2. (Gast)


Lesenswert?

Hallo,

kurzer Nachtrag:

Der Name ist FREI änderbar!! Ich habe keine Ahnung wie der Name ist/sein 
kann, daher geht eine Tabelle nicht!

von Peter II (Gast)


Lesenswert?

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.

von MOBA 2. (Gast)


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?

von MOBA 2. (Gast)


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

von Falk B. (falk)


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.

von Peter II (Gast)


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?

von Peter D. (peda)


Lesenswert?

Nimm eine CRC16 (AVR-GCC: "crc16.h").

von Peter II (Gast)


Lesenswert?

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

von MOBA 2. (Gast)


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

von Obolus (Gast)


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.

von Peter II (Gast)


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.

von Obolus (Gast)


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.

von Lernender (Gast)


Lesenswert?

Wenn's noch in der Entwicklung ist, dann entwickle doch eine 
Anlernfunktion.

von MOBA 2. (Gast)


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.

von Michael U. (amiga)


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

von MOBA 2. (Gast)


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.

von Tassilo H. (tassilo_h)


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

von MOBA 2. (Gast)


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

von Peter II (Gast)


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?

von MaWin (Gast)


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.

von MOBA 2. (Gast)


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.

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
Noch kein Account? Hier anmelden.