2012-01-26 7 views
1

あるデバイスから別のデバイスにデータを送信しています(Samsung TabとSony Xperia)。 長さが994バイトに達するまではすべて問題ありません。 その時点で、990と4バイトの2つのメッセージに分割されます。もちろん、非直列化は失敗します。 分割が送信側または受信側にあるかどうかはわかりません。AndroidデバイスでBluetoothデータが分割されています

なぜですか? 一度に送信できる最大値はありますか?

もしそうなら、どのようにまとめてもいいですか? 990が固定数であることを知っていたら、それらを組み合わせて簡単に行うことができましたが、それはデバイスによって異なりますか?

私はそれをとてもたくさんの部屋があるはずに受け取るために、2000バイトのバッファを与えています。

私はBluetoothの例のコードを使用しています。

============================================== ========================以下TJDを1として

:現時点では

私はこのようなオブジェクトを送信:

パブリッククラス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がserialiazbleオブジェクトで実現します。

次に、それをバイト配列にシリアル化して送信します。

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

もう一方で、手順を逆にします。

問題は、それはまた、「objectToSend」をデシリアライズしたいと思うでしょう受信したメッセージをデシリアライズするときの長さを追加すると、常に、以来、役に立たないだろうということです。メッセージが不完全なので、私はまだ同じ問題に終わる。その後、私は2つの段階でシリアライズを行うだろう

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)); 

、Iは、受信したメッセージをデシリアライズであろう。私は長さをチェックし、全長になるまで別の読み取りを行います。 その後、私は送信されたオブジェクト全体を逆シリアル化します(objectToSend)。

これは方法ですか?

+0

MTUを増やしてもいいかもしれないhttp://crazydaks.com/increasing-thruput-of-android-bluetooth-opp-ftp-applications.html – L7ColWinters

+0

私はそこに見えました。 – theblitz

答えて

4

RFCOMMを使用してデータを送信していますか?そうであれば、パケットサイズに関する仮定に頼ることはできません。 RFCOMM抽象化はシリアルポートに似ています。シリアルポートでは、単にバイトストリームを送信しています。 RFCOMMデータにはパケットの概念はありません。

自然に小さなパケットは通常一緒に束ねられますが、大気中のセグメンテーションサイズは、各Bluetoothチップ固有の内部パラメータによって常に異なります。予想されるパケットサイズを確実に維持するように制御する設定はありません。

シリアルポートのデータに対して行うべきことを行う必要があります。データ内に独自のパケットヘッダーをオーバーレイして、相手側が再構成できるようにしてください。これは、各データパケットの残りの部分の前に余分な2バイトの長さの値を送信するのと同じくらい簡単かもしれません。次いで、受信機は自己記述的なデータストリームを得る。

+0

私はそれが一緒にメッセージに参加するのを見ていない - ちょうどそれらを分割します。私はすでにメッセージの冒頭に記述子を持っていますので、長さを追加することができます。しかし、私はそれをすべて得る前に、非直列化からそれを防ぐ必要があります。上記のコードを追加しました。 – theblitz

関連する問題