如何通过十六进制的蓝牙获取接收的字节?

时间:2017-01-26 15:19:07

标签: java android android-studio bluetooth spp

我正在尝试通过Android设备上的bt接收数据。当我从终端发送字节时(例如0x10 0x20 0x30 0x40)我没有得到任何响应(Toast没有弹出)。我不想用十六进制获取数据,而不是字符串。以下是处理程序的代码:

 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字符发送数据时才会弹出Toast,当以hex作为发送时没有任何反应。我无法调试它,因为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();

编辑2:我可以接收数字,但仅限于范围0x30-0x39 - 在ASCII中分配给字符1-9的数字。似乎处理程序中的代码仅在接收ASCII编号时执行

1 个答案:

答案 0 :(得分:0)

你用readBuf [0]调用makeText,它是byte类型,所以它传播到int,方法认为它是资源id(Lint应该在那里发出警告)。 相反,使用DatatypeConverter#printHexBinary(byte[])将字节数组转换为String,并将其传递给Toast方法。

由于Android API中不存在javax包,因此您可以使用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();
}