'tschuldigung, auch wenn das eigentlich nicht hier rein soll. Aber im Java-Forum gibt es wohl nicht so viele Besucher. Deshalb noch mal als Kopie hier, der Admin möge mir bitte verzeihen:
wie bringe ich denn einen JSR-82-Server dazu, sich als SPP-Dienst (UUID 0x1101) einzutragen? Ohne einen browsbaren Eintrag im SDP findet nämlich keiner der gebräuchlichen BT-Stacks den Dienst, und im Einsatzfall ist auch keiner vorhanden, dem man BT-Adresse und RFCOM-Port übergeben kann, damit ein virtueller COM-Port auf dem Client-PC erstellt wird.
Was ich noch sagen wollte: Mit meinem Server kann ich, wenn ein Client verbunden ist, reproduzierbar das Handy zum Restart bewegen. Und nein, das ist nicht mein Fehler! Ich halte es für möglich, das der Garbage Collector nicht so richtig hinterherkommt und die JVM das gesamte System in den Abgrund reißt.
MfG
Andreas
madmax
26.04.2007, 22:03
Ich befürchte das liegt nicht am Forum, sondern am Thema...
Ich gestehe mal, das alles sagt mir so ziemlich nix, aber vielleicht findet sich ja jemand.
adfree
27.04.2007, 00:44
Ich schliesse mich mal madmax an. Das einzige was ich erkennen kann ist BT und SPP (Serial Port Profile).
Dazu fällt mir nur das hier ein:
http://forum.modopo.com/showpost.php?p=164345&postcount=142
Dann schaltest Du das Serial Port Profile erst ein am SXG75. :mrgreen:
jumphigh
27.04.2007, 15:06
Zur euren Erhellung:
Es wurde ja schon öfter gefragt, ob man das SXG 75 nicht als GPS-Maus über BT nutzen könnte. Bisher geht es ja nur über USB. Was soll ich sagen: Ja, das geht natürlich über Java, und mein Server ist fertig. Das Problem ist nur, dass die potentiellen Clients diesen Server nicht finden können, weil es sich, anders als im JSR-82 beschrieben, nicht so in die SDP-Datenbank (Service Discovery Protocol) einträgt, dass er gefunden werden kann. Man kann sich nur vom Client direkt verbinden, wenn man BT-Adresse und RFCOMM-Kanal (ein BT-Protokoll zur Emulation von RS-232), an dem der Server lauscht, kennt.
Das wäre nicht unbedingt ein Problem, denn mein Server kann diese Informationen leicht ausgeben. Leider unterstützen die mir zugänglichen BT-Stacks von WXP SP2, Widcomm und Broadcom (auf einem PocketPC) nicht, dass man eine virtuelle Schnittstelle per Hand einrichten kann, indem ich BT-Adresse und RFCOMM-Kanal angebe. Die können immer nur die entsprechenden Daten über eine SDP-Abfrage am Handy ermitteln und würden dann automatisch die entsprechenden Dienste installieren. Nur wie gesagt, bringe ich meinen Server nicht dazu, sich in die SDP-Datenbank einzutragen.
Im Moment wäre meine Lösung also nur unter einem Linux nutzbar, denn die dortigen BT-Stacks ließen sich bestimmt auf die manuelle Eingabe trimmen, falls sie es nicht schon eingebaut haben. Nur was will ich damit unter Linux, wo es keine Routenplaner gibt? :-)
MfG
Andreas
MTiN
27.04.2007, 17:27
ich kann dein Problem nicht richtig nachvollziehen, hab vor nem halben Jahr mal ein Bluetooth-Midlet geschrieben, welches dann auch zwischen zwei handys (C81) funktioniert hat ohne das ich nen speziellen Befehl aufrufen musste um den Dienst in der SDDB zu registrieren...ich such mal den Quelltext raus
Edit so hier isser, hab aber grad keine Zeit, musst dir das mal selber raussuchen ;)
/*
* ChatServer.java
*
* Created on 26. Dezember 2006, 21:41
*
*
* Diese Klasse ist leider nicht sehr ausführlich Kommentiert,
* ähnelt aber stark der TrainingClient/Server.java, welche ordentlich kommentiert ist!
*/
public class ChatServer
extends Form implements CommandListener, Runnable{
private UUID uuid = new UUID( //the uid of the service, it has to be unique,
"27012f0c68af4fbf8dbe6bbaf7aa432a", false); //it can be generated randomly
/**
* Creates a new instance of TestServerSPP
*/
public ChatServer(MatheFreakMidlet m) {
super("Chat (Server)");
midlet = m;
display = Display.getDisplay(midlet);
addCommand(new Command("Senden",Command.ITEM,1));
addCommand(new Command("Zurück",Command.EXIT,1));
setCommandListener(this);
public void commandAction(Command command, Displayable displayable) {
switch (command.getCommandType()){
case Command.ITEM:
sendMessage();
break;
case Command.EXIT:
if (connection!=null)
try
{connection.close();}
catch (IOException ex){log(ex.toString());}
if (server!=null)
try
{server.close();}
catch (IOException ex){ex.printStackTrace();}
MultiplayerMenu mm = new MultiplayerMenu(midlet);
mm.show();
break;
}
}
public void run() {
String name = "MatheFreak Chat"; //the name of the service
String url = "btl2cap://localhost:" + uuid.toString() +";name="+ name+";master=false;authenticate=false;authorize=false;encrypt=fal se;ReceiveMTU=48;TransmitMTU=48";
LocalDevice local = null;
//((Form)Display.getDisplay(this).getCurrent()).append("\nStart advertising service...");
server = (L2CAPConnectionNotifier)Connector.open( url );
// Retrieve the service record template
local.getRecord( server ).setAttributeValue( 0x0008, new DataElement( DataElement.U_INT_1, 0xFF ) );
// set ServiceAvailability (0x0008) attribute to indicate our service is available
// 0xFF indicate fully available status
// This operation is optional
// we read only as much as ReceiveMTU limited us
byte[] data = new byte[size];
String cmd = "";
//
//
while(connection!=null)
{
cmd = "";
while (!connection.ready())
{ try {Thread.sleep(50);} catch (InterruptedException ex) {ex.printStackTrace();} }
public void log(String msg){
StringItem message;
message = new StringItem(null, msg);
message.setLayout(Item.LAYOUT_2|Item.LAYOUT_LEFT|Item.LAYOUT _NEWLINE_BEFORE);
message.setFont(font);
this.insert(1,message);
}
}
adfree
27.04.2007, 17:37
Zur euren Erhellung:
Es ist leider immer noch sehr sehr dunkel...
Also war mein Link und Hinweis das Du den SPP am SXG75 erst aktivieren mußt Thema verfehlt?
Na jedenfalls da das JAVA nur ein BREW Applet ist. Welches da irgendwie emuliert wird oder wie auch immer. Darfst Du Dich mit den Einschränkungen von Qualcomm rumschlagen...
Es könnte durchaus schwer werden, alles mit JAVA auf SXG75, EF81, SL91 und Co. zu realisieren...
MTiN
28.04.2007, 18:36
da ist nichts schweres dran, soweit ich das verstehe schreibt er einfach ein Midlet, das über die Location API auf die GPS-Daten zugreift und diese dann vie Bluetooth verschickt. Wenn er das über das gleiche Profil wie Handelsübliche Bluetooth-GPS-Geräte macht, dann wird das SXG75 dann auch als Bluetooth Maus funktionieren. Und das ist alles wunderbar mit Java möglich, auch auf dem SXG75
jumphigh
28.04.2007, 22:50
Ja, genau richtig. Und es funktioniert auch wunderbar, zumal mir das Location-API die Daten sogar im NMEA-Format ausgeben kann. Nur leider ist es nutzlos, weil sich der verdammte Server eben nicht in die SDP-DB einträgt und so nicht gefunden wird.
Als Ausweg bleibt jetzt, dass der eigentliche GPS-Client einen eigenen SPP-Server-Port aufmacht, so dass sich das SXG als Client verbinden kann. So weit ich das überblicke, sollte das funktionieren, auch die mit bekannten Stacks erlauben das. Nur ist der Aufwand für mich höher, weil ich natürlich Service-Discovery auf dem SXG 75 betreiben muss, und dem User auch ermöglichen sollte, sich an mehreren Geräten anzumelden. Deshalb muss ich jetzt eine passende UI plus DB für die Verbindungsinfos basteln.
Ich möchte dich, lieber MTiN bitten, mir doch mal deinen gesamten Chatserver zukommen zu lassen. Dein Ausschnitt macht nichts anderes als ich, nur eben für das L2CAP-Protokoll. Aber es ist mir wirklich zu viel Mühe, jetzt noch ein passendes Midlet um deinen Code zu stricken. Deshalb schicke mir mal bitte den gesamten Code, auch JAR und JAD wären schon ausreichend. So könnte ich testen, ob sich dein Server einträgt. Aber ich fürchte wirklich, das ist ein Bug der Java-Implementierung auf dem SXG 75.
@adfree: Nein, dein Link war schon nicht verkehrt, aber soweit ich das aus den Posts dazu überblicke, hat das nichts mit dem Problem zu tun. Den der Server funktioniert, man kann sich problemlos mit ihm verbinden, da ist nichts gesperrt. Aber ich probiere auf jeden Fall die Menücustomization noch aus, wer weiß, was es da für Seiteneffekte gibt.
MfG
Andreas
MTiN
29.04.2007, 12:07
joar ich häng mal das Midlet an, aber so rein von der Theorie her müsste der Server wie gesagt automatisch in die Datenbank eingetragen werden...
hier nochmal der wichtige Quelltext:
local = LocalDevice.getLocalDevice();
local.setDiscoverable(DiscoveryAgent.GIAC);
server = (L2CAPConnectionNotifier)Connector.open( url );
local.getRecord( server ).setAttributeValue( 0x0008, new DataElement( DataElement.U_INT_1, 0xFF ) );
// set ServiceAvailability (0x0008) attribute to indicate our service is available
jumphigh
02.05.2007, 17:15
Deine Server tragen sich auch nicht in die SDP-DB ein. Scheint ein Bug der SXG-75-Firmware (SVN 26) zu sein.
MfG
Andreas
adfree
02.05.2007, 20:26
OT
Leider kann ich nichts zu Deinem Problem hilfreiches beitragen. Räusper... :oops:
Wärst Du bitte mal so nett? Es geht um den möglichen Speicher für JAVA (RecordStores) in brew/mod/java_ams/rms/...
Gibt es ein Midlet, welches die maximale Größe ermitteln könnte?
Ähm, wäre es möglich das Du sowas schreibst? Bitte?
Momentan habe ich eine 60 KB reserved.db gefunden... Behauptet wurde das max. 40 KB möglich wäre...
http://forum.modopo.com/java-symbian/t-17341-sxg75-telefonspeicher-fuer-javaprogramme-konfigurierbar.html