Hallo!
Dann will ich mal etwas weiter ausholen.
Also zunächst mein Vorhaben:
Ich besitze eine Squeezebox Touch und ein Squeezebox Radio. Dazu habe ich noch einige Softwareplayer auf dem Rechner + IPhone...also ein Logitech Musik System, das mit einem lokalen Server (das lasse ich auf meinem RPi laufen) arbeitet. Steuern lässt sich das System sehr praktisch über ein CLi interface.
Nun ist es so, das meine 3 Jahre alten Zwillinge nicht so richtig gut mit CD´s (trotz des Servers haben wir auch CD´s) umgehen können. Ständig darf man neue Sicherungen davon erstellen, da die alten zerkratzt sind. Zudem habe ich mal ein Projekt gesehen, wo jemand mit einem Mikrocontroller einen RFID-Reader steuert und damit dann seine Musikbibliothek. Das will ich auch...allerdings mit Hilfe des Raspberrys.
Also habe ich mir bei ebäh einen ganz billigen RFID-Reader besorgt, der sich als Tastatur über USB anmeldet. Und habe meine Versuche gestartet. Mein Bash-Script läuft auch wie bereits geschrieben fast vollständig.
- Code: Select all
#!/bin/bash
#
#Variablen laden aus Datei...
# Absolute path to this script, e.g. /home/user/bin/foo.sh
SCRIPT=$(readlink -f $0)
# Absolute path this script is in, thus /home/user/bin
SCRIPTPATH=$(dirname $SCRIPT)
echo $SCRIPTPATH
source $SCRIPTPATH/settings.sh
#Logging bei bedarf einschalten
if test -t 1; then
#local gestartet...nichts unternehmen
if [ $Debug -eq 1 ]; then
echo "Werde keine Log-Datei schreiben..."
# exec 2>&1 | tee $SCRIPTPATH/rfid.log
fi
else
#als Dienst gestartet...loggen wenn gewünscht
if [ $Debug -eq 1 ]; then
exec >$SCRIPTPATH/rfid.log 2>&1
fi
fi
#Startvariablen
Endzeit=0
while [ true ]
do
sonderfunktion=0
read -p "Warte auf RFID Code.... " code <$EingabeGeraet
echo "Folgender Code wurde eingelesen: $code"
#Testen, ob es sich um einen RFID-Code handelt
if ! [[ "$code" =~ ^[0-9]+$ ]] ; then
echo "$code ist kein RFID TAG!!!"
continue
fi
#Testen, ob es eine Sonderfunktion ist
testvar=$(echo $(eval echo \${VR$code}))
#testvar=$(echo $((VR$code)))
echo "-$testvar-"
if [ ${#testvar} = 0 ]; then
echo "Keine Sonderfunktion"
else
#Sonderfunktion
echo "-$testvar-"
sonderfunktion=1
fi
#Ein zu schnelles Einlesen verhindern
Startzeit=$(date +%s)
echo $Startzeit
if [ $sonderfunktion -ne 1 ]; then #Lauter etc. nicht ausbremsen
if [ $Endzeit -ne 0 ]; then
if [ $code -eq $codealt ]; then
#Es ist der gleiche Code....erst nach xx Sekunden
if [ $(($Startzeit - $Endzeit)) -lt 10 ]; then
echo "Gleicher RFID-Code...nicht so schnell!!!"
continue
fi
else
#Es ist ein anderer code....erst nach xx Sekunden
if [ $(($Startzeit - $Endzeit)) -lt 3 ]; then
echo "Nicht so schnell!!!"
continue
fi
fi
fi
fi
if [ $sonderfunktion -eq 1 ]; then
echo "Führe funktion $testvar aus..."
(echo "$testvar"; sleep 0.1) | nc $ServerIP $ServerPort
echo "$PlayerMAC display Führe%20folgende%20Funktion%20aus: ${testvar// /%20}" | nc -i 1 $ServerIP $ServerPort
continue
fi
#Nur zum testen
#playercount=`(echo "player count ?"; sleep 0.1) | nc $ServerIP $ServerPort`
#echo $playercount
playlistcount=`(echo "playlists 0 1 search:$code"; sleep 0.3) | nc $ServerIP $ServerPort`
echo $playlistcount
if [ "${playlistcount:(-1)}" == "1" ]; then
echo "Playlist gefunden!"
(echo "$PlayerMAC playlist play $code"; sleep 0.1) | nc $ServerIP $ServerPort
echo "$PlayerMAC display Starte%20Playlist $code" | nc -i 1 192.168.183.21 9090
else
echo "nicht gefunden!!"
echo "$PlayerMAC display Der%20Code%20$code wurde%20nicht%20gefunden!!" | nc -i 1 $ServerIP $ServerPort
fi
#Um ein zu schnelles Einlesen zu verhindern
Endzeit=$(date +%s)
codealt=$code
done
read -n 1
echo "fertig"
und dazu die settings:
- Code: Select all
#Einstellungsdatei für rfid.sh
#
# Hier werden alle Einstellungen und Sonderfunktionen konfiguriert
#
#Einstellungen
#Debug -> Wenn 1 dann wird im Startverzeichnis eine Log-Datei geschrieben (rfid.log)
Debug=0
#ServerIP -> IP-Adresse vom Squeezebox Server
ServerIP="192.168.183.21"
#ServerPort -> Standard 9090
ServerPort="9090"
#Eingabegerät -> Das Gerät, was die zeichen vom RFID-Reader zurückgibt
EingabeGeraet="/dev/tty1"
#PlayerMAC -> Die MAC des Players, der gesteuert werden soll
PlayerMAC="00:04:20:22:91:6d"
#Sonderfunktionen hier hinterlegen:
#Es muss immer ein VR der Kartennummer vorangestellt werden!!
#Es können alle CLI Kommandos ausgeführt werden
#
VR0003244512="$PlayerMAC display Sonderfunktion..."
VR0003231703="$PlayerMAC power 0"
VR0003670208="$PlayerMAC pause"
VR0003704451="$PlayerMAC mixer volume +5"
VR0003680339="$PlayerMAC mixer volume -5"
VR0003244512="$PlayerMAC mixer muting"
VR0003693318="$PlayerMAC playlist index +1"
VR0003701069="$PlayerMAC playlist index -1"
Nun ist es so, das ich direkt aus tty1 lese...aber nicht im Exclusivzugriff. Daher bekomme ich nicht immer die Ausgabe...und ich bin auf der Suche nach einer Lösung.
Sicherlich ist mein erster Fehler gewesen, ein USB-Reader zu kaufen. Ein serieller wäre vermutlich einfacher für mich...
Zu der Funktion:
Es wird auf ein RFID-TAG gewartet. Dieser wird auf gültigkeit Überprüft. Danach werden die hinterlegten RFID-Tags abgefragt, ob eine "Sonderfunktion" wie z.B. lauter, leiser etc. damit gewünscht ist. Ist das nicht der Fall, wird einfach die Playlist mit der eingelesenen Nummer gestartet.
So können ganz einfach weitere Alben mit RFID-Tags ausgestattet werden. Einfach eine Playlist mit der NUmmer anlegen und Karte einlesen...das wars.
Ich habe jetzt aufgrund der Bemerkungen von Dir etwas weiter geforscht. Bei dem verwiesenen Projekt ist nichts drin. Allerdings habe ich diese Seite gefunden:
https://gist.github.com/gpisacco/3161554/download#dort ist das gesuchte...auch ein Makefile. Der Code lässt sich problemlos kompilieren. Aber bei der näheren Betrachtung habe ich festgestellt, das es nicht so einfach ist, wie ich es eigentlich erhofft hatte. C ist doch wohl um einiges schwieriger als ich dachte. Von dem Code verstehe ich nicht sehr viel...zumindest zu wenig um damit weiter zu machen und das Projekt damit umzusetzen(?)
Bisher hatte ich so gut wie keine Berührung mit C. Wenn dann waren es alles Projekte, die kein Makefile hatten...daher bin ich auch nicht darauf gekommen. Aber mit dem was in dem Makefile steht, kann ich so gut wie gar nichts anfangen.
Ich vermutete eigntlich, das es in C einfacher sein würde mein Vorhaben umzusetzen. Gerade wenn ich noch ein paar Sonderfunktionen hinzuprogrammieren möchte...wie z.B. eine Lautstärkeveränderung bis zu einer vorgegebenen Lautstärke...und was mir nicht noch alles einfallen würde...aber zunächst müsste ich die Sachen aus dem Bash-Script in C übertragen.
Daher suche ich weiter eine (einfache) Möglichkeit die Eingaben der RFID-Tastatur einzulesen. Ich habe jetzt noch diesen Beitrag gefunden:
http://www.linuxquestions.org/questions ... post372925vielleicht geht das eher in die richtige Richtung? Obwohl es mit C ja gut funktionieren würde...oder sollte ich es lieber so machen, das ich mit meinem Bash-Script das C-Programm aufrufe und die Rückgabe (also die RFID-Nummer) verarbeite? Ich denke das wäre ein eher unüblicher weg?
Vielleicht stehe ich ja nur gerade auf dem Schlauch...und denke viel zu kompliziert...
Danke für die Bemühungen!
Gruß
Bismosa