2017-01-26 17 views
0

Я пытаюсь получить данные через bt на устройстве Android. Когда я отправляю байты из терминала (например, 0x10 0x20 0x30 0x40), я не получаю никакого ответа (Toast не всплывает). Я не хочу получать данные в шестнадцатеричном виде, а не как строку. Вот код из обработчика:Как получить полученные байты через bluetooth в шестнадцатеричном формате?

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(); 
      } 

       } 
      } 

     }; 

Я использую Android Studio 2.2.3 Как отображать полученные байты в шестнадцатеричном виде?

Редактировать: afted с использованием функции byteToHexString() Тост появляется только тогда, когда я отправляю данные как символы ASCII, при отправке в качестве шестнадцатеричного кода ничего не происходит. Я не могу отладить его, потому что Android Studio не может видеть мое устройство. Модифицированный код в обработчик:

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: Я могу получить номера, но только из диапазона 0x30-0x39 - номера, присвоенные символов 1-9 в ASCII. Кажется, что код из обработчика выполняется только при получении ASCII-номеров

ответ

0

Вы вызываете makeText с помощью readBuf [0], который имеет тип байта, поэтому он распространяется до int, и метод считает, что это идентификатор ресурса (Lint должен предоставьте там предупреждение). Вместо этого преобразуйте массив байтов в String с помощью DatatypeConverter#printHexBinary(byte[]) и передайте это методу Toast.

Поскольку javax пакеты отсутствуют в Android API, вы можете использовать String#format проходя %2x как формат аргумента, и один байт вы хотите форматировать (это будет цикл перебора всех байтов).

Если вы заботитесь о скорости, однако, это так же быстро, как он получает:

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

Я не знаю, что я делаю неправильно, но Android-студия не может разрешить символ «DatatypeConverter». Я получил пакет java.lang.Object. Я использовал: String HexStr = new String (DatatypeConverter.printHexBinary (readBuf)); Пробовал также проект очистки, синхронизация файлов Gradle, Invalidate caches. – Juras

+0

Я не проверял, но вполне возможно, что он не является частью Android API, несмотря на стандартную Java. Я обновлю ответ в течение нескольких минут. – Luke

+0

@ Juras проверить это сейчас – Luke