java - android - 蓝牙适配器 - 消息处理程序缓冲区限制

标签 java android bluetooth buffer

我正在使用本教程构建一个使用蓝牙进行连接的多人游戏:

https://developer.android.com/samples/BluetoothChat/index.html

由于我发送的是 JSON 格式的长字符串(长度超过 5500),消息处理程序方法不会返回我发送的整个字符串,而是将它们拆分为 989 个字符的长字符串(其长度始终为 989 个字符).问题是,当我尝试解析 JSON 字符串时,显然会抛出错误,因为文本不完整。当我在控制台中打印出字符串时,它会将它们打印成由 989 个字符分隔的多行。

另请注意,缓冲区长度设置为 1024,但当我增加限制时,结果不会有所不同,并且始终为 989 个字符。

byte[] buffer = new byte[1024];

知道发生了什么事吗?这是消息处理程序方法。请注意,从主机设备发送的消息看起来很好(它没有拆分),但是当客户端接收到它时,它会拆分成多个字符串。

private static final Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
            case BluetoothService.MESSAGE_STATE_CHANGE:
                switch (msg.arg1) {
                    case BluetoothService.STATE_CONNECTED:
                    case BluetoothService.STATE_CONNECTING:
                    case BluetoothService.STATE_LISTEN:
                    case BluetoothService.STATE_NONE:
                        break;
                }
                break;
            case BluetoothService.MESSAGE_WRITE:
                // BYTE LENGTH IS OK IN HERE!
                byte[] writeBuf = (byte[]) msg.obj;
                String writeMessage = new String(writeBuf);
                break;
            case BluetoothService.MESSAGE_READ:
                // BYTE LENGTH IS 1024 IN HERE!
                byte[] readBuf = (byte[]) msg.obj;
                message = new String(readBuf, 0, msg.arg1);
                break;
        }
    }
};

最佳答案

数据通过 Bluetooth套接字被抽象为一个流,但在传输层被分解成数据包,最大大小约为 1000 字节。在发送方,您可以获取输出流并写入 5 KB 的数据 block ,但传输层会在无线发送之前将其分成多个数据包。当接收器读取其输入流时,每次调用 read() 都会返回一个数据包的数据。传输层不会重组数据包,您的代码需要这样做。这意味着您需要设计一些方案,例如包含消息长度的消息 header ,接收方可以知道何时停止组装数据包并将完整的消息交给消费处理。

此问题未在 BluetoothChat 示例应用程序中解决,因为它(静默地)假定所有聊天消息都将小于数据包大小,因此不需要消息重组。

关于java - android - 蓝牙适配器 - 消息处理程序缓冲区限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157297/

相关文章:

Android 4.2以下如何设置layoutDirection为RTL

android - 扫描蓝牙 LE 设备时出现问题(无回调)

Ubuntu蓝牙鼠标无法连接

java - Spring 4 : MappingJackson2HttpMessageConverter does not support application/javascript for jsonp

Java 强制转换异常(不是类强制转换异常)

java - @ManyToMany 关系中表的 JPA 2.0 CriteriaQuery

Android:动态地将多个 View 添加到线性布局

android - 如何从 Android 主题中提取颜色值 (#rgb)?

java - 将 Chrome Selenium 驱动程序添加到 Ubuntu

Android Bluetooth BLE 我可以修改哪些连接的配置参数