当前位置: 首页 > 面试题库 >

如何通过蓝牙一起读取所有字节?

包翔
2023-03-14
问题内容

我有一个使用蓝牙从其他设备接收一些数据(字节)的应用程序。一切进展顺利,但是我在接收所有字节时遇到了一个小问题。收到字节后,我将它们显示在Toast上只是为了对其进行测试。当另一台设备一起发送10个字节(例如:“
ABCDEFGHIJ”)时,程序将仅获取第一个字节“ A”并将其显示在Toast上,然后转到第二个迭代并读取其他9个字节并显示“
BCDEFGHIJ”在吐司上。这是我的代码:

byte[] buffer = new byte[1024]; // Read 1K character at a time.
int bytes = 0; // Number of bytes.

while(true)
{
    try
    {
        // Read from the InputStream.
        bytes = bInStream.read(buffer);

        // Send the obtained bytes to the MainActivity.
        mainActivityHandler.obtainMessage(MainActivity.MESSAGE_READ, bytes, -1, buffer).sendToTarget();
    }
    catch(IOException e)
    {
        connectionLost();
        break;
    }
}

在MainActivity中,我有:

// The Handler that gets information back from the BluetoothManager.
private final Handler handler = new Handler()
{
    @Override
    public void handleMessage(Message msg)
    {
        switch(msg.what)
        {
            case MESSAGE_READ:
                byte[] readBuf = (byte[]) msg.obj;

                // construct a string from the valid bytes in the buffer.
                String readMessage = new String(readBuf, 0, msg.arg1);
                Toast.makeText(MainActivity.this, readMessage, Toast.LENGTH_SHORT).show();
                break;

            // ...
        }
    }
};

如何一起接收所有字节?


问题答案:

嗯,最可能的罪魁祸首是您发送邮件的方式。您的接收没有问题,它将接收与写入一样多的字节(最多1024个字节)。

如果您无法控制消息的发送方式,则可能一次可以读取一个字节,然后在遇到预定义的终止符时向您发送处理程序消息。例如:“
ABCDEFGHIJ#”,其中#是终止符。

String msg = "";
byte ch;
while((ch=mInStream.read())!='#') {
    bytes++;
    msg+=ch;
}


 类似资料:
  • 我需要使用Web Bluetooth API在Web应用程序中读取Leica Disto D2的距离测量值。我的目标是最近的Android设备,所以Chrome/Samsung浏览器应该支持它。

  • 我制作了一个android应用程序来扫描蓝牙设备,并向我的服务器发送一个HTTP请求,这样我就可以检测它们是开着还是关着。我已经用我的带有蓝牙适配器的台式电脑测试过了,效果很好。当检测到电脑上的蓝牙功能时,它显示电脑是打开的,当我关闭电脑上的蓝牙功能时,它是关闭的。现在,我需要使用这个应用程序的设备有:雅伯投影仪、Bose SoundLink和JBL耳机,但我遇到了一些问题。 首先,投影仪似乎无法

  • ap.getBLEDeviceServices(OPTION | deviceId, CALLBACK) 获取蓝牙设备所有 service(服务)。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id,参考 device 对象 CALLBACK 参数说明 名称 类型 描述 services Array service 对象,详见下表 service对

  • ap.getBLEDeviceCharacteristics(OPTION | deviceId, CALLBACK) 获取蓝牙设备所有 characteristic(特征值)。 OPTION 参数说明 名称 类型 必填 描述 deviceId String 是 蓝牙设备 id,参考 device 对象 serviceId String 是 蓝牙特征值对应 service 的 uuid CALLB

  • 我写了一个通过蓝牙发送/接收文件的应用程序,但我想把这个应用程序设置为默认的应用程序发送和接收文件! 移动设备向我的手机发送文件时的说明;我的应用程序获取文件,并与它一起工作之后,保存在我想要的时间和地点。

  • ap.getBluetoothDevices(OPTION | services | service, CALLBACK) 获取所有已发现的蓝牙设备,包括已经和本机处于连接状态的设备。可直接传入一个数组作为 OPTION.services 参数。也可直接传入一个字符串作为 OPTION.services 的第一项。 OPTION 参数说明 名称 类型 必填 描述 services Array 否