PDA

View Full Version : Steuerung Slimserver mittels Java



franknacht
2006-05-05, 06:17
Hallo,

ich möchte gerne mittels einen kleinen Java-Programms den SlimServer steuern, d. h. die Wiedergabe auf der Squeezebox.

Das CLI sowie die Hilfe habe ich mir angesehen. Dort steht, dass man direkt über die Command Line oder über Port 9090 Befehle an den Slimserver senden kann. Ich möchte gerne in Java einen Befehl sende n (z. B. rescan playlists) und die Antwort entgegennehmen.
Das ganze läuft unter Windows (XP) auf dem gleichen Rechner.

Mir reichen ein paar Schlagwörter als Hinweis; besser ein Programmbeispiel (in Java).

Hintergrund: ich möchte mit einem eigenen spartanischen Webinterface mittel JSP unter Tomcat auf den Slimserver zugreifen.
Ich habe mir die Sourcen der Softsqueeze angesehen. Leider werde ich so ganz nicht daraus schlau. Außerdem suche ich nicht die Abspielfunktionalität, sondern die Steuerungsfunktionalität.

Vielen Dank für jegliche Unterstützung.

Grüße
Frank

mherger
2006-05-05, 06:39
Hallo Frank

> Mir reichen ein paar Schlagwörter als Hinweis; besser ein
> Programmbeispiel (in Java).

Nicht ganz 100% Java, aber nahe dran:

public static String doRequest(String request)
{
try
{
Socket s = new Socket(SlimServer, SlimCLIPort);
OutputStreamWriter wr = new OutputStreamWriter(s.getOutputStream());
InputStreamReader rd = new InputStreamReader(s.getInputStream(),
"UTF8");

wr.write(request + "\n");
wr.flush();

output = rd.readLine();
}
catch (Exception e) {}
return output;
}

Das rufe ich dann über z.B. CLI.doRequest("version ?") auf und erhalte die
Versionsnummer zurück.

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
SlimString Translation Helper (http://www.herger.net/slim/)

franknacht
2006-05-05, 10:22
Hi,

vielen Dank. Genau das habe ich gesucht. Habe Dein Beispiel ausprobiert und etwas geändert:
try
{
InetAddress SlimServer = InetAddress.getByName("192.168.0.150");
int SlimCLIPort = 9090;
Socket s = new Socket(SlimServer, SlimCLIPort);
OutputStreamWriter wr = new OutputStreamWriter(s.getOutputStream());
BufferedReader rd = new BufferedReader(new InputStreamReader(s.getInputStream(), "UTF8"));
wr.write("version ?" + "\n");
wr.flush();
String output = rd.readLine();
System.out.println(output);
}
catch (Exception e) {
e.printStackTrace();
}

Funktioniert sehr gut. Jetzt kann ich loslegen.
Danke für die Starthilfe.

Grüße
Frank.

mherger
2006-05-05, 13:26
> vielen Dank. Genau das habe ich gesucht. Habe Dein Beispiel ausprobiert
> und etwas geändert:

Interessant, wie ähnlich sich die Code-Schnipsel doch sind. Ich verwende
Ewe, eine Programmiersprache, die zwar auf Java basiert, aber eine eigene
Klassenbibliothek mitbringt (www.ewesoft.com). "Echtes" Java habe ich seit
der 0.9 Beta o.ä. nicht mehr programmiert :-). Aber offenbar hat sich Ewes
Autor Mühe gegeben, so kompatibel wie möglich zu bleiben.

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
StringEditor Plugin (http://www.herger.net/slim/)

Emissary
2006-05-13, 13:26
Hi,

etwas spät vielleicht, aber ich habe vor einigen Monaten angefangen, eine Abstraktionsschicht für den Slimserver zu schreiben, diese erlaubt dann eine Interaktion mit dem Server auf folgende Art:



CLISession session = new CLISession(new InetSocketAddress(InetAddress.getByName("192.168.0.3"), 9090));

session.connect();

CLICommand command = new LoginCommand("user", "password");
session.execute(command);

AlbumsCommand albums = new AlbumsCommand();
albums.setSearch("<suchausdruck>");

albums = (AlbumsCommand) session.execute(albums);

while (albums.nextResult()) {
System.out.println(albums.getName());
}

session.disconnect();


Wenn daran Interesse besteht, würde ich diese unter einer OS-Lizenz zur
Verfügung stellen. Ca. 20 Kommandos sind bereits implementiert und die
Implementierung von weiteren ist sehr einfach. Es gibt auch eine
Methode, die über einen Broadcast die verfügbaren Slimserver sucht.

Dominik

mherger
2006-05-13, 22:33
Hallo Dominik

> etwas spät vielleicht, aber ich habe vor einigen Monaten angefangen,
> eine Abstraktionsschicht für den Slimserver zu schreiben, diese erlaubt
> dann eine Interaktion mit dem Server auf folgende Art:

Das ist noch etwas konsequenter OO als meine Version :-)

> Wenn daran Interesse besteht, würde ich diese unter einer OS-Lizenz zur
> Verfügung stellen. Ca. 20 Kommandos sind bereits implementiert und die
> Implementierung von weiteren ist sehr einfach. Es gibt auch eine
> Methode, die über einen Broadcast die verfügbaren Slimserver sucht.

Mich würde v.a. letztere Methode _sehr_ interessieren. Ich entwickle zwar
selber nicht wirklich in Java, aber einem Java-Ableger (Ewe). Diese
Methode liesse sich vielleicht portieren...

Gruss,

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
StringEditor Plugin (http://www.herger.net/slim/)

Emissary
2006-05-14, 06:46
Ok, dann werde ich mal sehen, daß ich das ganze vernünftig zusammengepackt bekomme. Ich denke, so gegen heute abend/morgen poste ich dann hier nen Link.

Emissary
2006-05-20, 17:40
Hi,

es hat leider etwas länger gedauert, als geplant, aber ich wusste nicht, daß man bei Sourceforge erst eine manuelle Prüfung durchlaufen muss.

Ich habe unter folgender URL ein Projekt erstellt:

http://sourceforge.net/projects/jsqueeze

Momentan ist lediglich im Subversion-Repository der grundlegende Sourcecode verfügbar.

Um die CLI-Klassen zu benutzen, benötigt man noch von Apache die MINA-Bibliothek ab der Version 0.9. Diese erhält man unter directory.apache.org.

Ich werde in Kürze etwas mehr dazu schreiben. Aber vielleicht reicht es dem einen oder anderen ja schon.

mherger
2006-05-21, 00:11
Hallo Emissary

Vielen Dank für den Code! Eigentlich war ich ja hauptsächlich an der
Discovery-Methode für die Server interessiert. Ich verwende selber ja
nicht 100% Java, sondern einen Ableger (ewesoft.com). Und bisher versuchte
ich die Methode zu portieren, die in Softsqueeze verwendet wird
(http://svn.slimdevices.com/trunk/softsqueeze/src/org/titmuss/slimprotolib/).
Doch scheiterte ich daran, dass diese Methode die lokale MAC in den UDP
Broadcast reinpackt - und an diese Information kommt Ewe nicht ran.

Du aber verwendest einfach einen "Fantasiewert" (127x6). Hast du eine
Ahnung, wozu dieser überhaupt gebraucht wird, wenn man sowieso einfach was
reinsetzen kann? Ich habe nun mal Softsqueeze's Methode genommen (weil ich
die schon portiert hatte) und einfach wie bei dir die MAC-Adresse gefaked
- und siehe da, ich kriege die Liste der Server zurück! Softsqueeze
verwendet zu diesem Zweck einen Listener-Thread, der auf Antworten hört
und füllt ein Hash mit den Namen.

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
StringEditor Plugin (http://www.herger.net/slim/)

Emissary
2006-05-21, 05:13
Mh, ehrlich gesagt habe ich mir nur ein wenig den Code vom SlimServer angesehen, und ihm dann daß geschickt, was er haben will.

Hier ist der relevante Teil im Server-code. Dort wird die Mac auch nur benutzt, um eine schöne Debug-Ausgabe zu erzeugen :)



ub gotDiscoveryRequest {
my ($udpsock, $clientpaddr, $deviceid, $revision, $mac) = @_;

$revision=int($revision/16).'.'.($revision%16);

$::d_protocol && msg(" Got discovery request, deviceid = $deviceid, revision = $revision, MAC = $mac\n");

my $response;

if ($deviceid == 1) {
$::d_protocol && msg("It's a SLIMP3 (note: firmware v2.2 always sends revision of 1.1).\n");
$response = 'D'. pack('C', 0) x 17;
} elsif ($deviceid >= 2 || $deviceid <= 4) {
$::d_protocol && msg("It's a squeezebox\n");
$response = 'D'. serverHostname();
} else {
$::d_protocol && msg("Unknown device.\n");
}


$udpsock->send( $response, 0, $clientpaddr);

$::d_protocol && msg("sent discovery response\n");
}


Das mit dem Listener ist interessant. Leider habe ich hier nur einen Server und ich forsche mehr als das ich ein bestimmtes Ziel damit verfolge :)

Freut mich trotzdem, daß es dir weitergeholfen hat.

Emissary

mherger
2006-05-21, 05:42
> Mh, ehrlich gesagt habe ich mir nur ein wenig den Code vom SlimServer
> angesehen, und ihm dann daß geschickt, was er haben will.
>
> Hier ist der relevante Teil im Server-code. Dort wird die Mac auch nur
> benutzt, um eine schöne Debug-Ausgabe zu erzeugen :)

Das hat man also davon, wenn man die Dokumentation liest :-)

'd' - Discovery request

Field Value/Description
0 'd' as in "discovery"
1 reserved
2 Device ID, '1' for SLIMP3
3 Firmware rev, eg 0x11 for version 1.1
4..11 reserved
12..17 MAC address

> Das mit dem Listener ist interessant. Leider habe ich hier nur einen
> Server und ich forsche mehr als das ich ein bestimmtes Ziel damit
> verfolge :)

Ich kann nicht forschen ohne Ziel. Ich habe meist ein grossartiges Ding im
Kopf, bevor ich weiss, ob man dies überhaupt realisieren kann oder nicht...

> Freut mich trotzdem, daß es dir weitergeholfen hat.

Auf jeden Fall! Meine SlimRemote findet nun selber einen Server, wenn der
voreingestellte nicht zur Verfügung steht. Und der Benutzer kann in den
Einstellungen einen verfügbaren Server auswählen - obwohl wohl kaum einer
mehr als einen verwendet. Ich habe auch nur zwei am Laufen, weil einer
funktionieren muss und ich am anderen entwickle. Aber wenn ein neuer
Benutzer das Programm verwenden kann, ohne sich um jedwelche Einstellungen
zu kümmern, dann ist das natürlich schon noch sexy :-)

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
StringEditor Plugin (http://www.herger.net/slim/)

mherger
2006-05-21, 06:25
Noch was ist mir aufgefallen: in Utilities hast du beinahe denselben Code
wie in ServerDiscovery noch einmal. Absicht oder versehen?

--

Michael

-----------------------------------------------------------
Help translate SlimServer by using the
StringEditor Plugin (http://www.herger.net/slim/)

Emissary
2006-05-22, 00:03
Argh, das kommt davon, wenn man seinen Code neu strukturiert und nicht genug aufpasst :)

In Utilities gehört er nicht mehr rein.

Zu der großen Idee, die man vorher hat: Meine war eigentlich, ein Slimserver-Tool zu schreiben, das neben den üblichen Browse-Funktionen auch solche Sachen wie PDF-Exports von Songlisten , usw. kann. Wollte damit ein bisschen mehr in Sachen User Interface und so experimentieren. Durch die Arbeit komme ich da aber erstens nicht ganz so oft und zweitens mit dem nötigen Elan zu, wie ich gerne würde :)

mherger
2006-05-22, 04:39
if ($deviceid == 1) {
$::d_protocol && msg("It's a SLIMP3 (note: firmware v2.2 always sends revision of 1.1).\n");
$response = 'D'. pack('C', 0) x 17;
} elsif ($deviceid >= 2 || $deviceid <= 4) {
$::d_protocol && msg("It's a squeezebox\n");
$response = 'D'. serverHostname();
} else {
$::d_protocol && msg("Unknown device.\n");
}


Diese Verzweigung ist noch ganz interessant. "Unknwon device" gibt's wohl nur in ganz, ganz seltenen Fällen - dafür um so mehr Squeezeboxen :-).