1

外部アクセサリ フレームワークを使用して Bluetooth アクセサリに接続すると、遅延の問題が発生します。データを送信すると、コンソールに次のカスタム出力が表示されます。

if( [stream hasSpaceAvailable] )
{
   NSLog( @"Space avail" );
}
else {
    NSLog(@"No space");
}
while( [stream hasSpaceAvailable] && ( [_outputBuffer length] > 0 ) )
{
    /* write as many bytes as possible */
    NSInteger written = [stream write:[_outputBuffer bytes] maxLength:[_outputBuffer length]];
    NSLog( @"wrote %i out of %i bytes to the stream", written, [_outputBuffer length] );
if( written == -1 )
    {
        /* error, bad */
        Log( @"Error writing bytes" );
        break;
    }
    else if( written > 0 )
    {
        /* remove the bytes from the buffer that were written */
        Log( @"erasing %i bytes", written );
        [_outputBuffer replaceBytesInRange:NSMakeRange( 0, written ) withBytes:nil length:0 ];
    }
}

これにより、即時パック バッファがペイロードである次の出力が得られます。

immediate pack buffer-> 040040008
Space avail
wrote 10 out of 10 bytes to the stream
immediate pack buffer-> 040010005
No space
immediate pack buffer-> 030040007
No space
wrote 20 out of 20 bytes to the stream
immediate pack buffer-> 030010004
No space
immediate pack buffer-> 040000004
Space avail
wrote 20 out of 20 bytes to the stream
immediate pack buffer-> 030000003
Space avail
wrote 10 out of 10 bytes to the stream
immediate pack buffer-> 040040008
Space avail
wrote 10 out of 10 bytes to the stream

hasSpaceAvailableメソッドが false を返し、true を返すまでデータを強制的にバッファリングすることを意味する "No Space" が継続的に書き込まれていることに注意してください。

1) 私が知る必要があるのは、なぜ起こっているのかということです? BT ハードウェアからの Ack を待っていますか? もしそうなら、どうやってこのブロックを解除しますか?

2) すぐに送信し、基本的にバッファリングせずにリアルタイムでデータをストリーミングするにはどうすればよいですか?

3) このブロッキングを無効にする隠し API メソッドはありますか?

デバイスにデータを送信する際に遅延や遅延が発生することはあり得ないため、これは実際の問題です。ハードウェアが iPhone コマンドと同期するためには、データをすぐに送信する必要があります。助けてください。

4

3 に答える 3

2

ほとんどのハードウェア(次のパケットを開始する前に現在のパケットの送信を終了する)では不可能であり、通常の「ストリーム」パラダイム(データを順番に受信する必要があるため、帯域幅が制限されている)では不可能です。 )。

また、送信元と宛先が一致しない限り、遅延をゼロにすることは物理的に不可能です。

実際の問題は、パケットの長さが10バイトしかない場合でも、基になるストリームが一度に1つのパケットしかキューに入れないことです。どうしてか分かりません; おそらくそれは非常に単純なプロトコルとして意図されているためです。

このようなキューを処理する通常の方法は、適切なデリゲートコールバックに登録し、ストリームに空き容量があるときにできるだけ多くのデータを送信することです。次にデータを送信しようとするときを待つのではありません。あなたはやっている)。

于 2011-06-29T22:47:41.413 に答える
-1

私は同じ問題に直面していますが、シナリオは異なります。

シナリオ: iPhone アプリは、初めて接続したときに PED と通信できます。しかし、PED のバッテリーが切れるか、スイッチをオフにしてからオンにすると、アクティブなセッションと有効な出力ストリームにもかかわらず、アプリは PED と通信できません。出力ストリームは、何も書き込む仕様がないことを示しています。

解決策: PED が切り替わるとアプリに通知され、その時点で EASession を強制終了し、PED が接続されたときに再度作成するようにアプリを作成します。それが最善の解決策であるかどうかはわかりません。何か別の解決策があれば提案してください。

于 2014-07-30T11:17:51.057 に答える