蓝牙数据在Android设备上被拆分

the*_*itz 1 android split bluetooth

我正在将数据从一台设备发送到另一台设备(Samsung Tab和Sony Xperia)。一切正常,直到我达到994字节的长度。那时,它将其分成2个990和4个字节的消息。因此,当然,反序列化会失败。我不确定拆分是在发送方还是在接收方。

这是为什么?一口气可以发送的数量上限吗?

如果是这样,我该如何拼凑?如果我知道990是一个固定数字,那么我可以通过组合将其轻松实现,但是设备之间是否有所不同?

我给它提供了一个2000字节的缓冲区来接收,因此应该有足够的空间。

我正在使用蓝牙示例中的代码。

================================================== ====================

根据以下TJD:

目前,我发送这样的对象:

公共类BTMessage实现了Serializable {

/**
 * 
 */
private static final long serialVersionUID = -2037775782014806765L;
public int what;
public Object objectToSend;
public int playerId;
public int currentPlayerId;
public BTMessage(int what, int playerId, int currentPlayerId, Object objectToSend){
    this.what = what;
    this.playerId = playerId;
    this.currentPlayerId = playerId;
    this.objectToSend = objectToSend;
}
Run Code Online (Sandbox Code Playgroud)

objectToSend是一个可序列化的对象。

然后,我将其序列化为字节数组并发送。

BTMessage btMessage = new BTMessage(what,playerId,currentPlayerId,objectToWrite);
write(toByteArray(btMessage));
Run Code Online (Sandbox Code Playgroud)

在另一端,我将相反的过程。

问题是添加长度并不总是有帮助,因为在反序列化接收到的消息时,它还会想反序列化“ objectToSend”。由于消息不完整,我仍然遇到相同的问题。

我唯一能想到的就是将其更改为:

public class BTMessage implements Serializable {
/**
 * 
 */
private static final long serialVersionUID = -2037775782014806765L;
    public int len;
public int what;
public byte[] objectToSend;
public int playerId;
public int currentPlayerId;
public BTMessage(int len, int what, int playerId, int currentPlayerId, byte[] objectToSend){
            this.len = len;
    this.what = what;
    this.playerId = playerId;
    this.currentPlayerId = playerId;
    this.objectToSend = objectToSend;
}
Run Code Online (Sandbox Code Playgroud)

然后,我将分两个步骤进行序列化。首先,我将要发送的对象序列化为字节数组。然后,我将通过序列化创建的字节数组实例化为“ BTMessage”,并将其作为“ objectToSend”进行序列化。现在上面是:

byte[] message = toByteArray(objectToWrite);
BTMessage btMessage = new BTMessage(message.length,what,playerId,currentPlayerId,message);
write(toByteArray(btMessage));
Run Code Online (Sandbox Code Playgroud)

在另一端,我将反序列化收到的消息。然后,我将检查长度并执行另一次读取,直到获得完整长度。只有这样,我才能反序列化发送的完整对象(objectToSend)。

这是要走的路吗?

TJD*_*TJD 5

您是否正在使用RFCOMM发送数据?如果是这样,则您不能依赖任何有关数据包大小的假设。RFCOMM抽象类似于串行端口,在串行端口您只是发送字节流。RFCOMM数据中没有数据包的概念。

您可能会发现自然而然地通常将小数据包混在一起,但是空中的分段大小将始终取决于每个蓝牙芯片特有的内部参数而变化。没有可控制的设置来可靠地保留您期望的数据包大小。

您应该执行与串行端口数据相同的操作,在数据中覆盖自己的数据包头,以便另一端可以重新组装。这就像在每个数据包的其余部分之前发送额外的两个字节长度的值一样简单。然后,接收器将获得一个自我描述的数据流。