iBeacon. Mythen und Wirklichkeit


    (Bild von developer.apple.com )

    Was ist das?


    Mitte 2013 sagte Apple auf einer Konferenz für Entwickler plötzlich, dass sie eine neue Technologie für die Indoor-Navigation vorbereitet hätten, dass sie angefangen hätten, Karten von Museen, Einkaufszentren und anderen interessanten Orten zu erstellen, und im Allgemeinen sei alles cool. Nachdem sie das Wort eines großen Unternehmens geglaubt hatten, begannen viele, "Lösungen" für die Indoor-Navigation anzubieten, aber nur wenigen gelang es, etwas Praktikables zu finden. Es stellte sich heraus, dass es in der Realität ziemlich schwierig ist, diese Technologie anzuwenden.

    Ich habe mich auch aktiv an der Technologieforschung beteiligt. Bereitstellung eines Beacon-Netzwerks bei GeekPicnic- Veranstaltungenin Moskau und St. Petersburg testen die Fähigkeiten der Technologie. Danach habe ich eine Bibliothek geschrieben, die mit einer kleinen Anzahl von Leuchttürmen sehr gut Innenstandorte bestimmen kann.

    In dem Artikel werde ich kurz beschreiben, was iBeacon ist, welche Aufgaben ich mit dieser Technologie lösen musste, was möglich war, was nicht sehr ist.

    Was ist iBeacon ? Dies ist eine Protokolluntermenge von Bluetooth Low Energy, mit der Sie Folgendes erfahren:

    • UUID, Major, Minor für das Leuchtfeuer
    • Signalstärke von einem Leuchtfeuer

    Es sieht so aus:

    fb0b57a2-8228-44 cd-913a-94a122ba1206 Major 1 Minor 2

    Sie können iBeacon auf iPhones verwenden, beginnend mit 4S, iPads, beginnend mit der dritten Generation, iPad Mini, iPod Touch (ab der fünften Generation). Android-Unterstützung sollte auf bestimmten Geräten gesucht werden, und die Betriebssystemversion sollte 4.3 oder höher sein. Sie können auch Macintosh-Computer verwenden.

    Praxiserfahrung


    Wenn wir mögliche Verwendungen der Technologie in Betracht ziehen, ist es sehr schön ausgefallen:

    • Navigation
    • Bewegungen verfolgen (Waren, Mitarbeiter),
    • Sicherheitsüberprüfungen
    • werbung.

    In der Praxis hat sich herausgestellt, dass nicht alles so einfach ist.

    Die Hauptenttäuschung ist, dass die Navigation extrem ungenau ist. Im nächsten Abschnitt werde ich zeigen, wie Sie mit Beacons angemessen navigieren können. Im Allgemeinen sind Beacons jedoch schlecht für die Navigation ausgelegt.

    Im Allgemeinen wird beim Arbeiten mit Bicons eine Benachrichtigung angezeigt, wenn sich ein Benutzergerät dem Gerät nähert. Sofort möchte ich alle Baken hintereinander fangen. Um die Benachrichtigung zu verarbeiten, müssen Sie jedoch die entsprechende Anwendung schreiben und die Parameter eines bestimmten Beacons eingeben (oder eines bestimmten Beacon-Typs, hierfür werden in der Regel UUIDs verwendet, die für alle erforderlichen Beacons gleich sind). Das heißt, Sie können es nicht einfach nehmen und aufhängen, z. B. ein Werbebake, damit es hängt und alle vorbeiziehenden Zeichen aufzeichnet. Sie müssen die Installation der Anwendung erzwingen, die nur die Beacons abhört, für die sie konfiguriert ist (Sie können sie auch nicht auf All-All-All einstellen, da Sie mit startMonitoringForRegion keine unbegrenzte Anzahl von Regionen hinzufügen können):

    NSString *uuid = @"B9407F30-F5F8-466E-AFF9-25556B57FE6D";
    CLBeaconRegion *region = [[CLBeaconRegion alloc] 
        initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:uuid] 
                   identifier:[NSString stringWithFormat:@"beacon_%@", uuid]];
    region.notifyEntryStateOnDisplay = YES;
    _locationManager startMonitoringForRegion:region];
    [_locationManager startRangingBeaconsInRegion:region];

    Das Sägen ist auch nicht einfach. Die Reaktionsgeschwindigkeit des Geräts (Smartphone) liegt zwischen einer Sekunde und einigen Minuten. Das heißt, der Benutzer kann am Beacon vorbeigehen und einige Minuten laufen. Erst danach wird eine Benachrichtigung angezeigt.

    Leuchtfeuer selbst - Pause. Wenn Sie eine Menge davon kaufen (und dies ist mehr oder weniger eine Notwendigkeit für fast alle Anwendungsfälle), müssen Sie sparen, daher fallen die Beacons aus und sie müssen ersetzt werden. Nichts ist einfacher, aber nach dem Ersetzen muss die Korrespondenz einem bestimmten Daten-Beacon (Werbetext oder Koordinaten) neu zugewiesen werden. Infolgedessen kann die Entwicklung nicht nur mit der Anwendung und den Beacons erfolgen. Wir müssen einen Server erstellen, der die Informationskorrespondenz zu den Handys speichert, und die Anwendung muss die Daten regelmäßig aktualisieren.

    Rückkehr zum realen Gebrauch. 2015 fanden zwei GeekPicnic-Veranstaltungen in Moskau und St. Petersburg statt. Dies sind Outdoor-Events, bei denen viele verschiedene Sprecher, interessante Artefakte, Autos und Kunstobjekte zusammenkommen. Die Veranstaltung wird zwei Tage lang von 25.000 Personen besucht.

    Bei jeder Veranstaltung (die im Freien und in mehreren Pavillons stattfindet) gibt es Dutzende interessante Objekte. Das Suchen auf der Karte ist nicht sehr praktisch. Daher wurde beschlossen, Beacons zu verwenden, um sie und Benachrichtigungen anzuzeigen, wenn sich der Benutzer ihnen nähert. Ich habe eine Anwendung für das iPhone geschrieben, meine Kollegen haben sie dann für Android wiederholt.


    Das Arbeitsschema selbst stellte sich als ungefähr wie folgt heraus:

    • Überall auf der Veranstaltung hängen Bicons
    • Die mobile Anwendung fungiert als Scanner und benachrichtigt den Besucher, dass er sich einem interessanten Ort nähert
    • Daten über die Verbindung von Baken und Texten von interessanten Orten werden auf dem Server gespeichert und in der mobilen Anwendung aktualisiert, wenn sie können (es gibt viele Besucher und die Kommunikation mit dem Server direkt auf der Veranstaltung ist nicht sehr gut).

    Um ein „Abprallen“ und eine große Anzahl von Benachrichtigungen zu vermeiden, wurden Daten für alle umliegenden Mobiltelefone gespeichert und die nächstgelegene wurde gefunden. Sie sollte „im Wesentlichen am nächsten“ sein, während sich mehrere Mobiltelefone ungefähr in der gleichen Entfernung befinden. Die Benachrichtigung wird nicht weitergeleitet.

    Ich musste auch das Problem des Energieverbrauchs lösen. Um zu verhindern, dass sich die Navigation unmittelbar nach der Installation der Anwendung einschaltet, wurde erstens das Beacon-Scannen nur an bestimmten Tagen und zweitens nur in einem bestimmten Bereich (innerhalb weniger Kilometer vom Veranstaltungsort) aktiviert. Es war lustig, diese beiden Bedingungen zu testen. Ich musste ein Auto mit aktiviertem Debugging fahren und die Aktivität des Smartphones beobachten (außerdem in verschiedenen Zuständen, aktiv, Schlafmodus).

    Infolgedessen hat alles geklappt, und meine Kollegen und ich haben unschätzbare Erfahrungen bei der Implementierung eines großen Projekts mit Beacons gesammelt.

    Indoor-Navigation


    Kommen wir zur Technik. Wenn die Leute über Navigation sprechen, meinen sie normalerweise, einen Ort anhand der Entfernung zu mehreren Punkten zu finden (so funktioniert GPS, indem sie einen Ort auf Zelltürmen triangulieren, und genau das sagen Filme normalerweise). Der Algorithmus ist einfach:

    • Wir wissen, wo sich mehrere Referenzbaken befinden. Dieser Satellit, Türme oder Fahrräder - es spielt keine Rolle. Am wichtigsten ist, dass Punkte definiert und ziemlich genau sind.
    • irgendwie bestimmen wir den abstand zu mindestens drei punkten. In der realen Welt sind drei nicht genug, sie versuchen, mehr zu verwenden. Die Genauigkeit dieser Berechnungen hängt auch von der Genauigkeit dieser Abstände ab.
    • Bei diesen Entfernungen wird der Standort des Empfängers (Benutzers) berechnet.

    Jeder, der dies mit Beacons versuchte, erkannte schnell die Sinnlosigkeit der Idee. Die Position der Baken kann genau gemessen werden, aber die Entfernung zu ihnen wird durch die Leistung des Bakensignals gemessen. Diese Leistung ist stark abhängig von Luftdruck, Luftfeuchtigkeit und dem Vorhandensein verschiedener Hindernisse (einschließlich Menschen und anderer Tiere). Sehr - das heißt mehrmals. Natürlich versucht die Software, dies durch die Anwendung von Filtern und verschiedenen Algorithmen auszugleichen, aber das ist nicht wichtig. Der Algorithmus funktioniert unter solchen Bedingungen in der Tat nicht (führt zu äußerst ungenauen Ergebnissen).

    Als ich ein wenig nachdachte, fiel mir ein, dass es noch eine andere Option gibt. Anders als beim „normalen“ Algorithmus wird nicht der genaue Standort des Benutzers angegeben, sondern nur angezeigt, in welchem ​​Bereich er sich befindet. Für einen Innenbereich reicht dies jedoch häufig aus.

    Der Algorithmus wird Fingerabdruck, Fingerabdruckort genannt. Im Allgemeinen sieht es so aus:

    • wir ordnen die Leuchtfeuer irgendwie "adäquat" an,
    • wir rennen durch den raum und erinnern uns, wie das bild auf leuchtfeuern aussieht (die stärker sind, die schwächer sind) und machen „drucke“ des bildes von leuchtfeuern an verschiedenen orten.
    • Nachdem die Fingerabdrücke abgenommen wurden, bewegt sich der Benutzer und das Smartphone vergleicht den aktuellen Fingerabdruck mit denen in seinem Speicher. Nachdem wir die nächstgelegene ausgewählt haben, wissen wir, in welchem ​​Bereich sich der Benutzer befindet.
      Damit der Algorithmus erfolgreich funktioniert, musste ich basteln. Das Ergebnis war aber sehr gut.

    Der unverständliche Moment war, wie man Abzüge speichert. Kapazitäten können nicht direkt sein (sie schweben sehr). Ich habe die relative Kraft ausprobiert, es ist viel besser geworden.

    Kraftschwimmen macht sich bemerkbar, auch wenn Sie nur an einer Stelle drehen. Wir stehen, wenden uns und das Bild ändert sich dramatisch. Deshalb fing ich an, mehrere Abzüge an einem Ort zu machen. Die Drucke selbst waren wie folgt:

    @property (nonatomic) NSString *uuid;
    @property (nonatomic) CLBeaconMajorValue major;
    @property (nonatomic) CLBeaconMajorValue minor;
    @property (nonatomic) CGFloat relativeDistance; // 0-1 (normalized by the  powerful)
    @property (nonatomic) CGFloat relativePowerDispersion; // 0-1 (normalized by the most powerful)

    Ich habe diese Parameter für jedes sichtbare Leuchtfeuer an einem bestimmten Punkt übernommen, und alle Parameter für alle Leuchtfeuer wurden zu einem Abdruck.

    Ich wollte natürlich auch, dass der Punkt auf der Karte nicht nur springt, sondern sich auf der Karte bewegt. Dazu musste ich den Fingerabdruck interpolieren, verstehen, zwischen welchen Bereichen / Punkten sich der Benutzer befindet, und natürlich das resultierende Ergebnis filtern. Die Entfernung zwischen dem aktuellen Fingerabdruck und den Fingerabdrücken der Regionen wurde wie folgt berechnet:

    for (Fingerprint *f in in _regions[regionName].fingerprints) {
        CGFloat newDistance = [f normalizedDistanceToFingerprint:aBeaconsFingerprint];
        CGFloat distance = (CGFloat) (result[regionName] == nil ? 
            FLT_MAX : 
            [result[regionName] doubleValue]);
        distance = MIN(newDistance, distance);
        result[regionName] = @(distance);
    }

    Und in der Tat ist der Abstand zwischen den Drucken wie folgt:

    - (CGFloat)normalizedDistanceToFingerprint:(NSMutableDictionary *)aBeaconsFingerprint {
        // if we do not have a beacon in region fingerprint — add DISTANCE_PENALTY_FOR_ABSENT_BEACON
        // if we do not have any beacons, result is "FLT_MAX"
        CGFloat result = 0;
        BOOL resultIsNotInfinite = NO;
        NSArray *regionBeaconIds = [_beaconsFingerprint allKeys];
        NSArray *testingBeaconIds = [aBeaconsFingerprint allKeys];
        for (NSString *beaconId in regionBeaconIds) {
            if (![testingBeaconIds containsObject:beaconId]) {
                result += DISTANCE_PENALTY_FOR_ABSENT_BEACON;
            } else {
                result += fabs(
                        fabs(((Fingerprint *) _beaconsFingerprint[beaconId]).relativeDistance) -
                        fabs([aBeaconsFingerprint[beaconId] doubleValue]));
                resultIsNotInfinite = YES;
            }
        }
        for (NSString *testingBeaconId in testingBeaconIds) {
            if (![regionBeaconIds containsObject:testingBeaconId]) {
                result += DISTANCE_PENALTY_FOR_ABSENT_BEACON;
            }
        }
        return resultIsNotInfinite ? result : FLT_MAX;
    }

    Es ist sehr gut gelaufen. Diese Lösung erfordert ein System zum Ersetzen eines ausgefallenen Beacons (das erneute Erstellen aller Abzüge ist eine schlechte Entscheidung, es kann viel Zeit in Anspruch nehmen). Und wenn es genügend kompetent platzierte Handys gibt (es ist am besten, sie zum Beispiel näher an der Decke aufzuhängen, aber dies ist nicht die einzige Empfehlung) - und die Genauigkeit ist gut (± einige Meter).

    Schlussfolgerungen


    Jetzt hat die Begeisterung für die iBeacon-Technologie nachgelassen. Aber die Aufgaben sind nirgendwo hingegangen. Indoor-Navigation ist weiterhin erforderlich. Benötigen Sie noch die Möglichkeit, Besucher des Ladens über neue Produkte zu informieren. Und das können Sie jetzt nicht nur mit Werbebannern, sondern auch mit solchen Baken.

    Natürlich ist ihre tatsächliche Verwendung nicht so einfach, und viele Aufgaben müssen gelöst werden, damit alles so funktioniert, wie es sollte. Die wichtigste Schlussfolgerung aus mehr als einem Jahr Arbeit mit Technologie ist, dass es mit gewissen Vorbehalten machbar ist. Und dann müssen Sie prüfen, ob es für eine bestimmte Anwendung geeignet ist oder nicht. Leider hat die Silberkugel noch nicht funktioniert.

    Jetzt auch beliebt: