Essayer de comprendre un concept de base sur la façon dont la distanciation avec ibeacon (balise / le bluetooth) peut fonctionner. Y a-t-il une vraie documentation sur la mesure exacte qu'un ibeacon peut mesurer. Disons que je suis à 300 mètres … Est-il possible pour un ibeacon de le détecter?
L'estimation de la distance fournie par iOS est basée sur le rapport entre la puissance du signal iBeacon (rssi) et la puissance de l'émetteur étalonné (txPower). Le txPower est la force de signal mesurée connue dans rssi à 1 mètre de distance. Chaque iBeacon doit être étalonné avec cette valeur txPower pour permettre des estimations de distance précises.
Lorsque nous avons créé la bibliothèque Android iBeacon, nous avons dû créer notre propre algorithm indépendant, car le code source iOS CoreLocation n'est pas disponible. Nous avons mesuré un tas de mesures rssi à des distances connues, puis nous avons fait la meilleure courbe pour correspondre à nos points de données. L'algorithm que nous avons trouvé est montré ci-dessous en tant que code Java.
Notez que le terme "précision" ici est iOS parler de la distance en mètres. Cette formule n'est pas parfaite, mais elle correspond à peu près à ce que fait iOS.
protected static double calculateAccuracy(int txPower, double rssi) { if (rssi == 0) { return -1.0; // if we cannot determine accuracy, return -1. } double ratio = rssi*1.0/txPower; if (ratio < 1.0) { return Math.pow(ratio,10); } else { double accuracy = (0.89976)*Math.pow(ratio,7.7095) + 0.111; return accuracy; } }
Remarque: Les valeurs 0,89976, 7,7095 et 0,111 sont les trois constantes calculées lors de la résolution d'une courbe d'ajustement à nos points de données mesurés. YMMV
J'étudie minutieusement la question de la précision / rssi / proximité avec iBeacons et je pense vraiment que toutes les ressources sur Internet (blogs, posts dans StackOverflow) se trompent.
davidgyoung (réponse acceptée,> 100 upvotes) dit:
Notez que le terme "précision" ici est iOS parler de la distance en mètres.
En fait, la plupart des gens le disent mais je ne sais pas pourquoi! La documentation rend très clair que CLBeacon.proximity:
Indique la précision horizontale d'un sigma en mètres. Utilisez cette propriété pour différencier les balises ayant la même valeur de proximité. Ne l'utilisez pas pour identifier un location précis pour la balise. Les valeurs de précision peuvent fluctuer en raison d'interférences RF.
Permettez-moi de répéter: une précision sigma en mètres . Toutes les 10 premières pages de google sur le sujet ont un terme "one sigma" seulement en citant des docs, mais aucune d'entre elles n'parsing le terme, ce qui est essentiel pour comprendre cela.
Très important est d'expliquer ce qui est réellement une précision sigma . Les URL suivantes commencent par: http://en.wikipedia.org/wiki/Standard_error , http://en.wikipedia.org/wiki/Uncertainty
Dans le monde physique, quand vous faites des mesures, vous obtenez toujours des résultats différents (à cause du bruit, de la distorsion, etc.) et très souvent les résultats forment une dissortingbution gaussienne. Il y a deux parameters principaux décrivant la courbe gaussienne:
un sigma est une autre façon de décrire comment étroite / large est la courbe gaussienne.
Il dit simplement que si la moyenne de mesure est X, et qu'un sigma est σ, alors 68% de toutes les mesures seront entre X - σ
et X + σ
.
Exemple. Nous mesurons la distance et obtenons une dissortingbution gaussienne en conséquence. La moyenne est de 10m. Si σ est 4m, cela signifie que 68% des mesures étaient entre 6m et 14m.
Lorsque nous mesurons la distance avec des balises, nous obtenons une valeur d'étalonnage RSSI et 1 mètre, ce qui nous permet de mesurer la distance en mètres. Mais chaque mesure donne des valeurs différentes, qui forment une courbe gaussienne. Et un sigma (et la précision) est la précision de la mesure, pas la distance!
Cela peut être trompeur, car lorsque nous déplaçons la balise plus loin, un sigma augmente parce que le signal est pire. Mais avec différents niveaux de puissance de balise, nous pouvons get des valeurs de précision totalement différentes sans changer la distance. Plus la puissance est élevée, less il y a d'erreur.
Il y a un billet de blog qui parsing en profondeur le sujet: http://blog.shinetech.com/2014/02/17/the-beacon-experiments-low-energy-bluetooth-devices-in-action/
L'auteur a une hypothèse selon laquelle la précision est réellement la distance. Il prétend que les balises de Kontakt.io sont défectueuses parce qu'il a augmenté la puissance à la valeur maximale, la valeur de précision était très faible pour 1, 5 et même 15 mètres. Avant d'augmenter la puissance, la précision était assez proche des valeurs de distance. Personnellement, je pense que c'est correct, parce que le niveau de puissance plus élevé, le less d'impact de l'interférence. Et c'est étrange pourquoi les balises Estimote ne se comportent pas comme ça.
Je ne dis pas que j'ai 100% raison, mais en plus d'être développeur iOS, j'ai un diplôme en électronique sans fil et je pense que nous ne devrions pas ignorer le terme «un sigma» des docs et j'aimerais commencer la discussion.
Il est possible que l'algorithm d'Apple pour la précision ne recueille que des mesures récentes et parsing leur dissortingbution gaussienne. Et c'est comme ça que ça règle la précision. Je n'exclus pas la possibilité qu'ils utilisent info accéléromètre pour détecter si l'user se déplace (et à quelle vitesse) afin de réinitialiser les valeurs de distance de dissortingbution précédentes, car ils ont certainement changé.
La puissance de sortie d'iBeacon est mesurée (étalonnée) à une distance de 1 mètre. Supposons que c'est -59 dBm (juste un exemple). L'iBeacon inclura ce numéro dans le cadre de sa publicité LE.
Le dispositif d'écoute (iPhone, etc.) mesurera le RSSI de l'appareil. Supposons, par exemple, que c'est, disons, -72 dBm.
Puisque ces nombres sont en dBm, le rapport de la puissance est en fait la différence en dB. Alors:
ratio_dB = txCalibratedPower - RSSI
Pour convertir cela en un rapport linéaire, nous utilisons la formule standard pour dB:
ratio_linear = 10 ^ (ratio_dB / 10)
Si nous supposons la conservation de l'énergie, alors la force du signal doit tomber comme 1 / r ^ 2. Alors:
power = power_at_1_meter / r^2
. Résoudre pour r, nous obtenons:
r = sqrt(ratio_linear)
En Javascript, le code ressemblerait à ceci:
function getRange(txCalibratedPower, rssi) { var ratio_db = txCalibratedPower - rssi; var ratio_linear = Math.pow(10, ratio_db / 10); var r = Math.sqrt(ratio_linear); return r; }
Notez que si vous êtes à l'intérieur d'un bâtiment en acier, il se peut qu'il y ait des reflections internes qui font que le signal décroisse plus lentement que 1 / r ^ 2. Si le signal traverse un corps humain (eau), le signal sera atténué. Il est très probable que l'antenne n'ait pas le même gain dans toutes les directions. Des objects métalliques dans la pièce peuvent créer des motifs d'interférence étranges. Etc, etc … YMMV.
iBeacon utilise Bluetooth Low Energy (LE) pour restr au courant des locations, et la distance / scope de Bluetooth LE est de 160ft ( http://en.wikipedia.org/wiki/Bluetooth_low_energy ).
Les distances à la source des packages de publicité au format iBeacon sont estimées à partir de l'atténuation du trajet du signal calculée en comparant la puissance du signal reçu mesurée à la puissance d'émission revendiquée que l'émetteur est censé coder dans datatables publicitaires.
Un schéma basé sur la perte de path comme celui-ci est seulement approximatif et est sujet à variation avec des choses comme des angles d'antenne, des objects intermédiaires, et vraisemblablement un environnement RF bruyant. En comparaison, les systèmes réellement conçus pour la mesure de distance (GPS, radar, etc.) reposent sur des mesures précises du time de propagation, même dans les mêmes cas en examinant la phase du signal.
Comme le fait remarquer Jiaru, 160 pi est probablement au-delà de la fourchette prévue, mais cela ne signifie pas nécessairement qu'un package ne passera jamais , seulement que l'on ne devrait pas s'attendre à ce qu'il fonctionne à cette distance.
C'est possible, mais cela dépend de la puissance de sortie de la balise que vous recevez, des autres sources radio à proximité, des obstacles et d'autres facteurs environnementaux. La meilleure chose à faire est de l'essayer dans l'environnement qui vous intéresse.
Avec plusieurs téléphones et balises au même endroit, il sera difficile de mesurer la proximité avec une grande précision. Essayez d'utiliser l'application Android «b et l bluetooth le scanner» pour visualiser les variations de force du signal (distance) pour plusieurs balises et vous découvrirez rapidement que des algorithms complexes et adaptatifs peuvent être nécessaires pour fournir une mesure de proximité cohérente. .
Vous allez voir beaucoup de solutions demandant simplement à l'user de "s'il vous plaît tenir votre téléphone ici", afin de réduire la frustration des clients.