外部アクセサリ フレームワークを使用して 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 コマンドと同期するためには、データをすぐに送信する必要があります。助けてください。