Forum: Mikrocontroller und Digitale Elektronik Bitte um Hilfe-->Bluenicecom Programmieren


von Tim (Gast)


Lesenswert?

Hallo Leute
Ich habe jetzt ein Problem mit Bluenicecom 3. Ich möchte die Datei 
zwischen Bluenicecom und meinm Handy transportieren. Die Transportion 
zwischen PC und Bluenicecom funktioniert gut. Aber beim Handy geht es 
nicht. Ich habe mit j2me programmiert. Bluenicecom arbeitet im 
Slavemodul. Und dann habe ich ein Client im Handy herstellt. Der Client 
sucht nach Bluenicecom und verbindet mit ihm. Bis hier sind alles OK. 
Danach habe ich wieder zwei Threads geschrieben. Ein ist für inputstream 
und ander ist für outputstream. Also zuerst sendet das Handy einen 
Befehl nach Bluenicecom und dann sollt das Handy eine Nachricht vom 
Bluenicecom empfangen. Hier gibt es aber Problem, das Thread für 
inputstream funktioniert nicht. Ist dies Prinzip richtig? Kann jemand 
helfen? Vielen Dank im voraus!

von Michael K. (mad_axe)


Lesenswert?

Vielleicht solltest du mal ein bisschen Code posten. Das ganze sollte 
funktionieren, denn ich habe es beim dem BNC4 genauso gemacht. Ist das 
Modul auch wirklich mit dem Handy verbunden, das heißt die Connection in 
Java ist auch richtig offen (einfach mal auf dem Handy ein paar debug 
ausgaben einbauen).

Bin die Woche über leider nicht zu Hause, deswegen habe ich auch keinen 
Code hier von mir.

Gruß
Micha

von Tim (Gast)


Lesenswert?

Hallo Micha
Danke für die Antwort. Ich glaube, dass das Modul wirklich mit dem Handy 
verbunden ist. Weil das Handy hat schon gefragt ob die Verbindung mit 
dem Bluenicecom zuverlässig ist. Und ich habe auch schon mal probiert 
das Handy mit einem PC zu verbinden und es hat geklappt.

Hier ist der Code für Kommunikation:
    //get URL from funktion servicesDiscovered
    ServiceRecord rec = serviceRecord[i];
    String url =
     rec.getConnectionURL(ServiceRecord.NOAUTHENTICATE _NOENCRYPT, 
false);

    //bluetooth connect
    private void btConnect(final String url){
        StreamConnection stream;
        try {
            stream = (StreamConnection) Connector.open(url);
            DataOutputStream out = stream.openOutputStream();
            InputStream in = stream.openInputStream();
            startWriteThread(out);
            startReadThread(in);

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

ich glaube bis jetzt sind alles richtig. Wenn der Satz "stream 
=(StreamConection) Conector.open(url)" durchgeführt wird, fragt das 
Handy ob die Verbindung zuverlässig ist.

Hier sind zwei Thread für Read und Write:
StartWriteThread ist noch ok. Aber StartReadThread ist abstürzt bei dem 
Satz "in.read".

   private void startWriteThread(final OutputStream out) {
        Thread writer = new Thread() {
        public void run() {
        // semaphor available
        available = true;
        try {
                cl_frm.append("write start.\n");
                String str = "h";
                byte[] byte_arr = str.getBytes();
                out.write(byte_arr);
                out.flush();
                cl_frm.append("write finish\n");
                available = false;
        } catch (Exception e) {
                Alert alert_btConnect_1 = new Alert("Problem","btConnect 
write stream error",null, AlertType.INFO);
                alert_btConnect_1.setTimeout(5000);
                cl_display.setCurrent(alert_btConnect_1);
        } finally {
                cl_frm.append("Bluetooth write stream closed.");
                    try {
                        out.close();
                    } catch (IOException e) {
                        Alert alert_btConnect_2 = new 
Alert("Problem","btConnect write stream close error",null, 
AlertType.INFO);
                        alert_btConnect_2.setTimeout(5000);
                        cl_display.setCurrent(alert_btConnect_2);
                    }
                }
        }

        };
        writer.start();
    }


    private void startReadThread(final InputStream in) {
        Thread reader = new Thread() {
        public void run() {
            while(available == true){}
            try {
                cl_frm.append("i do try\n");
                byte[] byte_arr = null;
                int i;
                while(true){
                    cl_frm.append("i do the while\n");
      !!!!!!!!// Das Problem ist hier!!!!!!! in.read() abstürzt.
                    try{in.read();} catch (IOException ex) 
{cl_frm.append("can't read");break;}

//                    int ia = in.read();  // geht auch nicht
//                    cl_frm.append("get"+ia+" \n");

//                    if (ia == -1) {
//                        cl_frm.append("Stop!!!");
////                        break;
//                    }
                }
                available = false;

            } catch (Throwable e) {
                Alert alert_btConnect_1 = new Alert("Problem","btConnect 
read stream error",null, AlertType.INFO);
                alert_btConnect_1.setTimeout(5000);
                cl_display.setCurrent(alert_btConnect_1);
            } finally {
                 cl_frm.append("Bluetooth read stream closed.");
                    try {
                        in.close();
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
                Alert alert_btConnect_2 = new Alert("Problem","btConnect 
read stream close error",null, AlertType.INFO);
                alert_btConnect_2.setTimeout(5000);
                cl_display.setCurrent(alert_btConnect_2);
            }
        }
    };
        reader.start();
    }
}

Micha, weißt du vielleicht wo das Problem ist?
Gruß und vielen Dank im voraus!
Tim

von Michael K. (mad_axe)


Lesenswert?

Hi,

also theoretisch sieht das schonmal gut aus.
Ich schreibe mal aus dem Kopf wie ich das gemacht habe (bin am WE wieder 
@home und könnte dann direkt in den Code schauen).

Also probiere es erstmal ganz einfach:
1. Du brauchst keine Service Record zum probieren nehmen. Nimm als URL 
einfach eine btspp url ... musste mal google, war irgendwie sowas wie 
btspp://23:23:43:43: usw .. wobei die zahlen vorne die Adresse des BT 
Moduls sind (wie die mac adresse bei einer Netzwerkarte) (die werte für 
noauthenticate usw kommen da auch noch mit dazu)
Das schließt schonmal dort einen Fehler aus.

2. Ich habe immer eine Schleife drin
DataOutputStream out;
while(out == null)
{
          out  = stream.openOutputStream();
}
In der eleganten Version läuft das über einen Thread, im Test steht 
solange "Bitte warten" auf dem Bildschirm bis die Verbindung steht.

Die Meldung am Handy meint erstmal nur, ob das Handy eine Verbindung zum 
Modul aufbauen darf, sagt aber nichts darüber aus ob die Connection 
steht.
Das ganze dann auch für den InputStream machen.

Dann im MC einfach das eingelesen Byte gleich wieder zurückschicken, 
dort erstmal noch keine Prüfungen etc machen.
Wenn der Loop dann funktioniert, dann stehen die alle weiteren Wege 
offen.

Fazit aus meiner Erfahrung, erstmal alles ganz Simple machen (ohne 
Threads etc).
Wenn du dann weißt das die Verbindung klappt kannste das immer noch 
schön ausbauen.

Achso noch etwas:
Du schreibst :
>> Aber StartReadThread ist abstürzt bei dem
>> Satz "in.read".
Das deutet schonmal auf ein nicht offene Verbindung hin, in wird wohl 
noch null sein.

Wenn noch etwas unklar fragen, Codebeispiele von mir wenn dann wie 
gesagt erst am WE.

Gruß
Micha

von Tim (Gast)


Lesenswert?

Hallo Micha
Danke sehr für die Tipps. Ich probiere mal.

Gruß
Tim

von Tim (Gast)


Lesenswert?

Hallo Micha
Es hat nicht geklappt. Kannst du mir zeigen wie du die Verbindung 
aufgebaut hast? Es wäre nett wenn du den Code mir schicken könntest. 
Meine email ist tim_de09@yahoo.de Vielen Dank!

Gruß
Tim

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.