【问题标题】:Bluetooth data being split on Android device在 Android 设备上拆分蓝牙数据
【发布时间】:2012-01-26 16:40:39
【问题描述】:

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

这是为什么呢? 一次发送有没有上限?

如果是这样,我怎样才能把它拼凑起来? 如果我知道 990 是一个固定数字,那么我可以通过组合它们轻松地做到这一点,但它是否因设备而异?

我给它一个 2000 字节的缓冲区来接收,所以应该有足够的空间。

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

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

根据以下 TJD:

目前我发送这样一个对象:

公共类BTMessage实现可序列化{

/**
 * 
 */
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;
}

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

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

BTMessage btMessage = new BTMessage(what,playerId,currentPlayerId,objectToWrite);
write(toByteArray(btMessage));

在另一端,我将过程颠倒过来。

问题是添加长度并不总是有帮助,因为在反序列化接收到的消息时,它还需要反序列化“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;
}

然后我将分两步进行序列化。首先,我将要发送的对象序列化到字节数组中。然后我将实例化“BTMessage”,将序列化创建的字节数组传递为“objectToSend”,然后序列化。 上面现在是:

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

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

这是要走的路吗?

【问题讨论】:

  • 可能会增加MTU,不知道crazydaks.com/…
  • 我看过了——对我来说是中文的!

标签: android bluetooth split


【解决方案1】:

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

您可能会发现自然小数据包通常会集中在一起,但无线传输的分段大小总是会根据每个蓝牙芯片特定的内部参数而变化。没有可供您控制的设置可以可靠地保留您预期的数据包大小。

您应该像对待串行端口数据那样做,在数据中覆盖您自己的数据包标头,以便对方可以重新组装。这可以像在每个数据包的其余部分之前发送一个额外的两个字节长度值一样简单。然后接收方得到一个自描述的数据流。

【讨论】:

  • 我还没有看到它将消息连接在一起 - 只是拆分它们。我已经在消息的开头有一个描述符,所以我可以添加长度。但是,在我拥有它之前,我将不得不阻止它反序列化。我在上面添加了可能的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
相关资源
最近更新 更多