2017-01-26 2 views
0

Ich versuche, Daten über BT auf Android-Gerät zu erhalten. Wenn ich Bytes vom Terminal sende (zum Beispiel 0x10 0x20 0x30 0x40) bekomme ich keine Antwort (der Toast taucht nicht auf). Ich möchte Daten im Hexadezimalformat und nicht als String erhalten. Hier ist der Code von Handler:Wie bekomme ich Bytes per Bluetooth in Hexadezimalform?

mHandler = new Handler() { 

      public void handleMessage(android.os.Message msg) 
      {if(msg.what == MESSAGE_READ){ 

       try { 
        byte[] readBuf = (byte[]) msg.obj; 

        Toast.makeText(MainActivity.this, readBuf[0], Toast.LENGTH_SHORT).show(); 

      } catch (IllegalArgumentException e) { 

       e.printStackTrace(); 
      } 

       } 
      } 

     }; 

Ich bin mit Android Studio 2.2.3 Wie empfangenen Bytes in Hex-Form angezeigt werden?

Bearbeiten: anted mit der Funktion byteToHexString() Toast Pop-up nur wenn ich Daten als ASCII-Zeichen sende, geschieht nichts beim Senden als hex. Ich kann es nicht debuggen, weil Android Studio mein Gerät nicht sehen kann. Modified Code in Handler:

byte[] readBuf = (byte[]) msg.obj; 

        String readMessage = new String(readBuf, 0, msg.arg1); 
       String HexStr = null; 
        HexStr = byteToHexString(readBuf); 
        Toast.makeText(MainActivity.this,HexStr, Toast.LENGTH_SHORT).show(); 

Edit 2: Ich kann Zahlen erhalten, aber nur aus Bereich 0x30-0x39 - Zahlen Zeichen zugewiesen 1-9 in ASCII. Es scheint, als würde Code von Handler nur beim Empfangen von ASCII-Nummern ausgeführt

Antwort

0

Sie rufen makeText mit readBuf [0], die vom Typ Byte ist, so wird es nach int propagiert und die Methode denkt, es ist eine Ressource-ID (Lint sollte warne dort). Konvertieren Sie stattdessen das Byte-Array in String mit DatatypeConverter#printHexBinary(byte[]) und übergeben Sie das an Toast-Methode.

Da javax Pakete aus dem Android API fehlen, können Sie String#format verwenden %2x als Format Argument übergeben, und ein Byte Sie formatieren möchten (es wäre eine Schleife alle Bytes iterieren).

Wenn Sie jedoch auf Geschwindigkeit, dann ist dies so schnell wie es geht:

public static String byteToHexString(byte[] data) { 
    StringBuilder res = new StringBuilder(data.length*2); 
    int lower4 = 0x0F; //mask used to get lowest 4 bits of a byte 
    for(int i=0; i<data.length; i++) { 
     int higher = (data[i] >> 4); 
     int lower = (data[i] & lower4); 
     if(higher < 10) res.append((char)('0' + higher)); 
     else   res.append((char)('A' + higher - 10)); 
     if(lower < 10) res.append((char)('0' + lower)); 
     else   res.append((char)('A' + lower - 10)); 
     res.append(' '); //remove this if you don't want spaces between bytes 
    } 
    return res.toString(); 
} 
+0

Ich weiß nicht, was mache ich falsch, aber Android Studio kann nicht Symbol „DatatypeConverter“ lösen. Ich habe das java.lang.Object-Paket improvisiert. Ich habe verwendet: String HexStr = new String (DatatypeConverter.printHexBinary (readBuf)); Versucht, das Projekt zu säubern, Gradle-Dateien zu synchronisieren, Caches zu deaktivieren. – Juras

+0

Ich habe nicht überprüft, aber es ist durchaus möglich, dass es nicht Teil der Android-API ist, obwohl es Standard-Java ist. Ich werde die Antwort in ein paar Minuten entsprechend aktualisieren. – Luke

+0

@Juras überprüfen Sie es jetzt – Luke

Verwandte Themen