10

iPhone 5S で Bluetooth LE を使用しており、次のことを行っています。

  • 私は bluetooth 周辺機器を持っており、3 つの bluetooth アドバタイジング チャネル (37、38、および 39) すべてで 20 ミリ秒ごとにアドバタイズするように構成しました。

  • Info.plist で UIBacgroundModes = bluetooth-central を使用してアプリを構成しました

  • 以下のようなscanForPeripheralsWithServicesを開始しました

コード:

NSDictionary *options = @{
    CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier",
    CBCentralManagerScanOptionAllowDuplicatesKey:[NSNumber numberWithBool:YES]
};
self.manager = [[CBCentralManager alloc] initWithDelegate:self queue:nil options:options];    
[self.manager scanForPeripheralsWithServices:[NSArray arrayWithObject:[CBUUID UUIDWithString:@"<uuid removed>"]] options:options];

現在の状態は次のとおりです。

  • フォアグラウンド モードでは、周辺機器を起動すると (1 秒以内に) アプリがすぐに広告メッセージを受け取ります。

  • バックグラウンド モードでは、アプリは周辺機器を起動してから 10 秒以内に広告メッセージを受信することがありますが (不良であっても許容できます)、非常に長い時間 (数分以上) 広告を受信しないことがよくあります。アプリケーションのために働きます。

質問は:

スキャン アプリがバックグラウンドにあるときに、iOS が Bluetooth 4.0 LE 周辺機器をスキャンしている速度を上げることは、何らかの方法で可能ですか? これを行うパブリック API はないと思うので、Apple によって公開されていないプライベート API を探しています。これは社内向けのエンタープライズ アプリ用であるため、プライベート API は完全に問題ありません。

4

1 に答える 1

6

バックグラウンド モードでは、スキャンの動作が異なります。

  • すべてのペリフェラルは、最初に観測されたときにのみ報告されます (バックグラウンド モードで接続しないと、RSSI を介して近接を追跡できません)。

  • 範囲内にない周辺機器への接続要求を開始でき、周辺機器が使用可能になると接続が完了します。これを積極的にスキャンする必要はありません (最初の検出を除いて、接続する UUID がわかります)。

おそらく、バックグラウンドでスキャンする代わりに接続要求を送信することで問題を解決できます。このようにして、iOS はユーザーが特定の周辺機器に本当に興味を持っていることを認識し、これが発見時間に影響を与えると想像できます。

目的によっては、iPhone をペリフェラル モードにして、現在の LE ペリフェラルをセントラル モードで使用することにより、接続を逆にする別の方法があります。ハックのように見えますが、あなたのケースの問題を解決するなら:なぜですか:)

プライベート API について: 申し訳ありませんが、スキャン パラメータに影響するものはわかりません。

于 2013-10-26T10:47:19.933 に答える