Donnerstag, 10. Januar 2013

10. Die RadioCard als "Stationstaste"

Manchmal ist es schon lästig sich seine Lieblingsstation auszuwählen. Zugegebenermaßen helfen die Favoriten da erheblich.

Damit sind wir wieder beim WAF (siehe blog vom 07.01.13). Das Navigieren, wohlmöglich noch durch einen Verzeichnisbaum (weil alles so schön geordnet sein soll) ist manchmal mehr als lästig.

Hier soll die RadioCard einspringen. RadioCard auflegen und schon gibt's was auf die Ohren.

Schauen wir uns mal den SW-Teil an. Nachdem die Gerätekennung durchlaufen wurde und feststeht, dass keine DeviceCard vorliegt, muss es eine von den Karten sein, für die eine Playlist hinterlegt wurde.

if (steuerkarte == 0)
          {
          Serial.println(steuerkarte);
          // dsplRFID(macAdrTmp);
          playPlaylist(macAdrTmp);
          }


Das war es schon und ab in das Unterprogramm (nun nehmen wir aber die temporäre Mac-Adresse mit).

Hier das Unterprogramm in seiner kompletten Pracht:

void playPlaylist(byte* macAdrSbox)
{
  snprintf(SBox, 150, "GET /status?p0=playlist&p1=resume&p2=%d-%d-%d-%d-%d&player=%02x:%02x:%02x:%02x:%02x:%02x HTTP/1.1", serNum[0], serNum[1], serNum[2], serNum[3], serNum[4], macAdrSbox[0], macAdrSbox[1], macAdrSbox[2], macAdrSbox[3], macAdrSbox[4], macAdrSbox[5]);
  client.stop();
  client.connect(server,9002);
  delay(1000);
  Serial.println(F("connecting..."));
  if (client.connected())
    {
    Serial.println(F("connected"));
    while (client.available())
    {
      char c = client.read();
    }
    Serial.println(SBox);
    client.println(SBox);
    client.println();
    Serial.println(F("abgesetzt"));
    }
   
  else
    {
    Serial.println(F("connection failed"));
    }
    Serial.println(F("Serverdaten lesen"));

  if (!client.connected())
    {
    Serial.println();
    Serial.println(F("disconnecting."));
    client.stop();
    }
}


Das, was hier an den Server gesendet wird, ist wohlvertraut. Lediglich die gesendeten Parameter sehen anders aus.

Nun wird gesendet (Beispiel);
GET /status?p0=playlist&p1=resume&p2=254-122-179-209-230&player=00:15:af:b8:ac:25 HTTP/1.1

Kurze Erläuterung:
p0 = es soll eine playlist gespielt werden
p1 = resume bedeutet, dass eine aktuelle Playlist abgebrochen wird und durch die unter p2 ersetzt wird. Auf die Dateierweiterung wird verzichtet, muss aber als .m3u vorhanden sein

Erst hier werden die Bindestriche zwischen den einzelnen UID-Werten erzeugt,

Der Befehl playlist kennt jede Menge weitere Parameter. Hier sei wieder auf das Command Line Interface (CLI) verwiesen. Siehe gestern (9.).

Auf dem Server gibt es ein Verzeichnis music/playlists. Dort "wohnt" die Playliste 254-122-179-209-230.m3u   mit dem Inhalt:

#EXTM3U
http://opml.radiotime.com/Tune.ashx?id=s96815&formats=aac,ogg,mp3,wmpro&partnerId=16&serial=158f087abcf88503358ccf826d66a5b0


Wir haben es hier auf jeden Fall mit einer erweiterten Playliste zu tun. Hierzu ein Zitat aus Wiki (http://de.wikipedia.org/wiki/M3U):

Die erste Zeile #EXTM3U ist die Einleitung der Kopfdaten und legt das Format der M3U fest, bei erweiterten M3Us ist immer als erste Zeile #EXTM3U zu verwenden.
Nach der ersten Zeile folgt der eigentliche Inhalt der M3U. Pro Mediendatei werden 2 Zeilen benötigt:

  • Die 1. Zeile beginnt immer mit #EXTINF:, danach folgt die Länge der Mediendatei in ganzen Sekunden. Nach der Länge wird ein Komma als Trennzeichen verwendet, danach folgt der Name der Mediendatei, welcher zur Anzeige im Medienspieler dient. Wenn die angegebene Länge kleiner als die tatsächliche Länge ist, wird wie beim PLS-Format die angegebene Länge nicht beachtet. (Setzt man die Länge auf −1, wird sie ebenfalls nicht beachtet.)
  • Die 2. Zeile ist identisch mit der Spezifikation von einfachen M3Us, hier wird der volle Dateiname mit absolutem oder relativem Pfad oder eine URL zu einer Datei auf einem Webserver angegeben
Also beginnen wir uns ein Playliste für die Freunde des WDR4 (not my favorite) zu basteln. Eine neue RFID-Karte wird einfach mit geöffnetem Serial Monitor des Arduino gelesen. Dort ist dann der Befehl in seiner kompletten Form zu sehen:

GET /status?p0=playlist&p1=resume&p2=238-8-172-209-155&player=00:15:af:b8:ac:25 HTTP/1.1

Also muss die Playliste 238-8-172-209-155.m3u heißen-

Dazu benötigen wir ein leeres Dokument, welches wir über einen Editor erzeugen.

dahinein schreiben wir schon mal 
#EXTM3U
#EXTINF:-1,


Jetzt benötigen wir nur noch den Link auf den externen Stream. Es gibt Links mit und ohne Stationslogo. Die Besten sind immer noch die, die durch den LMS erzeugt werden. Dazu suchen wir die Radiostation WDR4 im Menüpunkt Radio und fügen sie den Favoriten hinzu. Wenn wir jetzt in den LMS gehen, Und dort Hauptmenü - Favoriten auswählen, finden wir  rechts in der Zeile von Favoriten das Symbol eines Stiftes. Anklicken und WDR4 auswählen. Auch dort finden wir den Stift erneut. Anklicken. Jetzt ist folgendes Bild zu sehen:


Wir sehen zwei Felder, in denen wir etwas ändern könnten. Auf der linken Seite können wir die Anzeige anpassen. Die Änderung hier würde sich nicht auf die RadioCard auswirken, sondern nur auf die Favoriten-Anzeige. In der Mitte sehen wir den Link:

http://opml.radiotime.com/Tune.ashx?id=s100166&formats=aac,ogg,mp3,wmpro&partnerId=16&serial=158f087abcf88503358ccf826d66a5b0

Das ist unser gesuchter Link! Den wollen wir nicht ändern, sondern ihn nur ins Clipboard kopieren. Wir fügen den Link aus dem Clipboard in unser Dokument ein. Zum Schluss unter 238-8-172-209-155.m3u im Ordner music/playlists/  speichern und FERTIG!

Nach Auflegen der RadioCard zeigt der SqueezePlay-Player den nachfolgenden Bildschirm:


Als Gimmik gibt es noch die UID und PZ dazu. Alle anderen Links im Internet, die ich gefunden habe, zeigten kein Sender Logo! Leider gibt es auch Stationen, die im LMS kein Logo haben, z.B. BBC4.

Es gibt noch eine einfachere Möglichkeit. Unter Internetradio - Suchen im LMS den gewünschten Sender eingeben und danach auswählen. Dann ist der Link ebenfalls sichtbar.


Beim nächsten Mal geht es um die CDCard. Da schauen wir uns an, wie die Playlisten aus der Musik-Datenbank schnell erzeugt werden können.