2016-05-06 9 views
0

私はAltBeaconとこれらのパラメータを使って遊んでいます。私の目標は、できるだけ早く(最速で)コールバックdidRangeBeaconsInRegion()を持つことです。RangedBeacon.setSampleExpirationMillisecond、setForegroundScanPeriodとsetForegroundBetweenScanPeriodの間のAltBeaconの相関

レンジングでは、平均を使用して距離を計算し、コールバックを行うことを理解しています。私は距離に興味がありませんが、rssi。それは、rssiが1で変化するなら、それは大丈夫です。私の現在のコードでは

、私は現在使用します。

RangedBeacon.setSampleExpirationMilliseconds(1000); 
try 
{ 
    mBeaconManager.setForegroundScanPeriod(700l); 
    mBeaconManager.setForegroundBetweenScanPeriod(0l); 
    mBeaconManager.updateScanPeriods(); 
} 
catch(RemoteException ex) 
{ 
    ... 
} 

私のアプリがフォアグラウンドにすべての時間です。 Nexus 5Xで動作します。

私は、setSampleExpirationMilliseconds()の値が小さいほど、コールバックがよくなることを確認しました。 setForegroundBetweenScanPeriodは0に設定されています。これは常にサービスが常にスキャンされることを意味します。

私の会場には、約30個のビーコンが配置されています。上記のコードの設定では、毎回異なるビーコンセットをコールバックします。

私はビーコンのすぐ隣に立っていても、ビーコンは1秒以下で聞こえません。私がコールバックを取得すると、通常は他の遠いビーコンのためです。私が次回立っている特定のビーコンを聞くのに30秒かかることがあります。

設定したビーコンは20msごとに鳴り響きますので、その700msの間に私はそれらを見なければなりません。

私がsetForegroundScanPeriodを5000に上げると(私は近くのビーコンを得るためにスキャン時間が長くなることを願っています)、私はコールバックが少なくなります。コールバック間の遅延は約10秒です。ですから、値が小さいほどコールバックが速いことを意味します。

私の質問:

  1. なぜ私は取得しないコールバック(20msの時、それらはすべてチャープ)内のすべてのビーコン?コールバックはどのように呼び出されますか?それは十分な情報を持っているとき、またはそれはある種の間隔を持っていますか?それを制御するのは何ですか?

  2. setSampleExpirationMillisecondssetForegroundScanPeriod、とsetForegroundScanPeriod間の任意の関係がありますか?一緒にうまく働かせる方法は?

  3. 私のアプリでは、1秒未満で近くのビーコン(3フィート以下)を聞く必要があります。これを達成するためにパラメータを設定するにはどうすればよいですか?

このような長い質問をお読みいただきありがとうございます。任意の洞察力を感謝します。

@davidgyoung多分あなたは光を放つことができますか?

答えて

1

Androidビーコンライブラリは、検出されたすべてのビーコンパケットのコールバックを提供するのではなく、設定された間隔で定期的なコールバックを提供してビーコンがまだ周囲にいることを知らせるように設計されています。デフォルトでは、この間隔は否や、走査期間中に検出されたビーコンのリストがdidRangeBeaconsInRegionコールバックを介してリストに戻される走査期間が終了するよう

setForegroundScanPeriod(1100l); 
setForegroundBetweenScanPeriod(0l); 

によって構成されている前景、1100ミリ秒です。

スキャン期間を短く設定すると、コールバックを高速化できます。コールバックを500msごとに取得するには、setForegroundScanPeriod(500l);これは、各スキャン期間の終了時にBLEスキャンを停止して再開するという欠点があります。 (1回のスキャンサイクルで、一意のBluetooth MACアドレスごとに1つのパケットしか検出できないAndroid携帯電話モデルでは、停止と再起動が必要です)。しかし、スキャンを停止して再開すると、その正確な時刻に送信されているパケット - パケットの途中でブルートゥースの無線機を止めるのと同じです。これにより、欠落したパケット検出の割合が高くなり、スキャン期間が短くなります。

ビーコンが20msごとに送信されている場合は、このケースで問題ありません。500msのスキャン間隔で、検出を確実にするために十分なサンプルがあります。

setSampleExpirationMillisecondsのパラメータは、あなたがしようとしているものとはほとんど関係ありません。これは、デフォルトのRunningAverageRssiFilterを使用する場合の距離推定に使用されます。この設定は、距離推定の目的で平均RSSI測定値をどのくらい長く取るかを決定します。デフォルトでは、RSSIサンプルの20秒分を保持します。getDistance()メソッドの結果はBeaconに影響します。

+0

こんにちはDavidさん、 ありがとうございました。私はいつも 'setSampleExpirationMilliseconds'がコールバックのレートに影響を与えると考えていたので、はるかに明確です。 'setForegroundScanPeriod(500l)'を設定しようとしましたが、コールバックレートは信頼できません(ただし、一般的には* 700msより速いです)。コールバックの中には500ms遅れているものもあれば、100ms遅れているものもあれば、1秒かかるものもあります。 Androidスタジオのlogcatの遅延が考えられます。 'setForegroundScanPeriod(500l)'が500msごとに呼び出されることは保証されていますか? – Caten

+0

また、ライブラリがスキャンを再開すると判断するものは何ですか?私が使用しているほとんどすべてのデバイスが複数のパケットを処理するのに十分近代的であることを知っているので、いくつかのパケットが見つからない可能性のあるスキャンを停止して再起動することはありませんか? – Caten

+0

コールバックが正規ではないと聞いて驚いています。私はこれを見たことがない。 500lに設定すると、500msごとに呼び出され、10ms以内に遅延されます。妥当な機能要求であるにもかかわらず、スキャンの停止を無効にするAPIはライブラリにありません。カスタムバージョンを使用するには、それを自分で修正する必要がある場合は、些細な変更です。 – davidgyoung

関連する問題