HEX über Bluetooth versenden

  • 5 Antworten
  • Letztes Antwortdatum
J

Javist

Neues Mitglied
0
Hallo zusammen

So erstelle ich die Streams

PHP:
// Outputstream erstellen:
        try {
            stream_out = socket.getOutputStream();
            Log.d(LOG_TAG, "OutputStream erstellt");
        } catch (IOException e) {
            Log.e(LOG_TAG, "OutputStream Fehler: " + e.toString());
            is_connected = false;
        }
         // Inputstream erstellen
        try {
            stream_in = socket.getInputStream();
            Log.d(LOG_TAG, "InputStream erstellt");
        } catch (IOException e) {
            Log.e(LOG_TAG, "InputStream Fehler: " + e.toString());
            is_connected = false;
        }
Hier mit versende ich meine Hex-Werte

PHP:
  public void senden(View v) {
        byte[] message = {0x3e,0x02,0x00};
        //byte[] msgBuffer(message,0,3);
        if (is_connected) {
            Log.d(LOG_TAG, "Sende Nachricht: " + message);
            try {
                stream_out.write(message,0,3);
            } catch (IOException e) {
                Log.e(LOG_TAG,
                        "Bluetest: Exception beim Senden: " + e.toString());
            }
        }
    }
Hier mit Empfange ich:

PHP:
public void empfangen(View v) {
        byte[] buffer = new byte[16]; // Puffer
        int laenge; // Anzahl empf. Bytes
        int msg=0 ;
        try {
            if (stream_in.available() > 0) {
                 laenge = stream_in.read(buffer);
                Log.d(LOG_TAG,
                        "Anzahl empfangender Bytes: " + String.valueOf(laenge));
                 // Message zusammensetzen:
               for (int i = 0; i < laenge; i++)
                    msg = (char) buffer[i];
                 Log.d(LOG_TAG, "Message: "+ String.format("%02x",msg));
                Toast.makeText(this, String.format("%02x",msg), Toast.LENGTH_LONG).show();
             } else
                Toast.makeText(this, "Nichts empfangen", Toast.LENGTH_LONG)
                        .show();
        } catch (Exception e) {
            Log.e(LOG_TAG, "Fehler beim Empfangen: " + e.toString());
        }
    }
Im logcat sehe ich das er folgendes sendet :

sende Nachricht: [B@48262ec0

ich erhalte aber die FALSCHEN werte.

Er sende keinen reinen HEX-Werte. Wie muss ich das machen?

Besten Dank für die Hilfe
 
(vorherigen Inhalt gelöscht, war unsinn)

Deine Debugmeldung sagt nichts darüber aus, was gesendet wird, weil beim String aufbauen nicht der Inhalt der Bytearrays benutzt wird, sondern das was byte[] auf toString() liefert, nämlich die Objekt ID die du siehst.

Wichtig wäre zu sehen, was du wirklich eigentlich empfängst. Falls nix ankommt, bau mal ein flush() beim Senden ein.
 
Zuletzt bearbeitet:
Hallo, ich bekomme ff6c raus, hat mich zuerst riesig gefreut, ist aber der falsche wert es müsste 04fc sein..
Darum denke ich das er falsch sendet..? Bei dem Tool das ich habe muss ich Realtime einstellen, wäre das ein Lösungsansatz nur wie programmiere ich das, und Echtzeit senden er ja wenn ich den Button aktiviere.
Grüße

Der ursprüngliche Beitrag von 20:23 Uhr wurde um 22:06 Uhr ergänzt:

Hier etwas genau, aus dem log

12-18 22:01:07.406 13562-13562/com.example.. D/OBSERVER Sende Nachricht: [B@48265a98
12-18 22:01:07.406 13562-13562/com.example. D/BluetoothSocket.cpp writeNative
12-18 22:01:07.406 13562-13562/com.example. D/ASOCKWRP asocket_write
12-18 22:01:07.406 13562-13562/com.example. I/BLZ20_WRAPPER blz20_wrp_poll: nfds 2, timeout -1 ms
12-18 22:01:07.406 13562-13562/com.example. D/BLZ20_WRAPPER blz20_wrp_poll: transp poll : (fd 39) returned r_ev [POLLOUT ] (0x4)
12-18 22:01:07.406 13562-13562/ D/BLZ20_WRAPPER blz20_wrp_poll: return 1
12-18 22:01:07.406 13562-13562/com D/BLZ20_WRAPPER blz20_wrp_write: wrote 3 bytes out of 3 on fd 39



12-18 22:04:17.234 13562-13562/com.example. D/BluetoothSocket.cpp availableNative
12-18 22:04:17.234 13562-13562/com.example. D/BluetoothSocket.cpp readNative
12-18 22:04:17.234 13562-13562/com.example. D/ASOCKWRP asocket_read
12-18 22:04:17.234 13562-13562/com.example. I/BLZ20_WRAPPER blz20_wrp_poll: nfds 2, timeout -1 ms
12-18 22:04:17.234 13562-13562/com.example. D/BLZ20_WRAPPER blz20_wrp_poll: transp poll : (fd 39) returned r_ev [POLLIN ] (0x1)
12-18 22:04:17.234 13562-13562/com.example. D/BLZ20_WRAPPER blz20_wrp_poll: return 1
12-18 22:04:17.238 13562-13562/com.example. D/BLZ20_WRAPPER blz20_wrp_read: read 2 bytes out of 16 on fd 39
12-18 22:04:17.238 13562-13562/com.example. D/ Anzahl empfangender Bytes: 2
12-18 22:04:17.238 13562-13562/com.example. D/ Message: ffdc
 
Wieso du da (als zweites byte) 0xdc (oder 0x6c) bekommst, verstehe ich erstmal auch nicht.

Aber da sind noch so einige Klopper in dem Code versteckt. Dein erstes Byte ist nicht 0xff! Du überschreibst nämlich in deiner Schleife mit jedem byte msg komplett. Und die 0xff kommen nur davon, dass das byte negativ ist und bei der Umwandlung nach char erst auf 16bit aufgeblasen wird. Aber es koennte sein, dass die 0x04 schon korrekt übertragen wird und du es lediglich nicht siehst. Es würde bei der Fehlersuche schon erheblich helfen, wenn im Log auf beiden Seiten genau die bytes stehen, die durch den Äther gehen.

Und nen potentiellen Buffer Overflow hast du auch. Es könnten mehr als 16 byte kommen.

Das mit der Echtzeit ist ein Böhmisches Dorf für mich und von was für einem "Tool" redest du da. :confused2:
 
Zuletzt bearbeitet:
Hallo, danke für die Antwort.
Wie bringe ich dem Log bei das er jedes Bit zeigt?
 
Hallo, also das funktioniert

PHP:
 public void empfangen(View v) {
        byte[] buffer = new byte[1025]; // Puffer
        int laenge; // Anzahl empf. Bytes
          ;
        try {
            if (stream_in.available() > 0) {
                //if (is_connected) {
                int msg=0;
                laenge = stream_in.read(buffer);
                Log.d(LOG_TAG,
                        "Anzahl empfangender Bytes: " + String.valueOf(laenge));
                 // Message zusammensetzen:
                for (int i=0;i<laenge;i++) {
                    msg+= buffer[i];//;
                     Log.d(LOG_TAG, "Message: " + String.format("%x",msg));
                    Toast.makeText(this, String.format("%x", msg), Toast.LENGTH_LONG).show();
                }
                }else
                Toast.makeText(this, "Nichts empfangen", Toast.LENGTH_LONG)
                        .show();
            }catch(Exception e){
                Log.e(LOG_TAG, "Fehler beim Empfangen: " + e.toString());
            }
 
    }

aber beim zweiten wert steht wieder ffffffc8 , eine Idee wie ich die ff wegbekommen, laufen die in der Wartezeit in buffer??

Der ursprüngliche Beitrag von 01:19 Uhr wurde um 01:42 Uhr ergänzt:

;D habe es geschafft ;D! sage nur string..
 
Zurück
Oben Unten