Ibeacon: installation framework estimote

mercredi 2 avril 2014

Dans cet article, je vous explique comment installer et utiliser les ibeacon de la marque estimote.

Avant toute chose, une explication sur les iBeacons:

iBeacon est est un nouveau protocole mis au point par Apple et qui repose sur la technologie Bluetooth 4.0 LE (basse consommation). Par ce Bluetooth, votre smartphone ou tablette peut entrer en relation avec des petits transmetteurs sans fil appelés “iBeacons” (ou Beacons).

Le signal émis par ces iBeacons permet une micro-localisation (extérieure/intérieure) qui peut être interprétée par une application mobile installée sur votre smartphone ou tablette.

Toute l’intelligence de l’échange entre votre appareil mobile et le transmetteur iBeacon se situe au niveau de l’application mobile qui va engager une interaction contextuelle à la détection d’un ou plusieurs iBeacons et au niveau du serveur Internet qui va éventuellement recueillir des informations propres à chaque utilisateur.
La portée de cette technologie se situe entre 10 cm et 30/50 mètres (en fonction de la configuration des lieux). Par rapport au NFC, il permet une portée beaucoup plus élevée.

Plus de technique:

Au niveau programmation, on localise un iBeacon au travers de 3 paramètres:

  • ProximityUUID
  • major
  • minor
Ces 3 paramètres peuvent être expliqués via un exemple concret:
Le proximity UUID serait le nom d’une multinationnale.
Le paramètre major définirait le pays dans lequel se trouve l’ibeacon et le minor la salle dans la succursale se trouvant dans le pays (major).

The proximity UUID pour les estimote beacon est toujours: B9407F30-F5F8-466E-AFF9-25556B57FE6D.
Il existe aussi une application estimote qui permet de localiser les ibeacons proche de vous et de récupérer leur major / minor.

Le framework du estimote SDK permet de nous retourner 3 paramètres:

  • proximity
  • Accuracy
  • RSSI

Il est très important de bien calibrer les ibeacons et son nombre dans l’environnement dans lequel il tournera. Tenir compte des murs,porte et autres devices qui peuvent interférer avec les ibeacons.
Le premier paramètre proximity, permet de nous donner une notion de proximité par rapport à l’ibeacon c’est à dire de dire si on est très proche ou très éloignés.
Ce paramètre peut nous retourner 4 valeurs:

  • Immediate (0-20 cm) (0-8″)
  • Near (20cm – 2 m) (8″- 6.5′)
  • Far (2 – 70 m) (6.5 – 230′)
  • Unknown

D’après mes recherches, il semblerait que ce soit souvent ce paramètre là qu’on utilise. On a pas une notion exacte d’ou se trouve l’utilisateur de l’application dans un plan mais une notion de certaine distance non mesurable par rapport au ibeacon.

Le paramètre RSSI quand à lui donne la puissance du signal par rapport au ibeacon en décibel.
Par exemple, plus on s’approche de l’ibeacon plus le RSSI sera élevé. Le RSSI sera moins élevé si on s’éloigne de l’ibeacon.
Le RSSI reste stable si on bouge pas.

La notion d’accuracy est très importante, on peut se baser sur le paramètre de proximité (far,near,immediate,etc…), mais le paramètre accuracy permet de définir le rayon du cercle du signal et donc si il est élevé, on a un grand risque d’erreur.

Pour plus de détail sur les estimotes: cliquez ici.
Tout d’abord, il faut télécharger le framework estimote ici.
Ensuite décompresser le zip et placer le dossier EstimoteSDK dans votre projet.
Vous devez vous assurez que la librairie libEstimoteSDK.a se trouve bien dans les frameworks chargés.
Vous devez aussi rajouter les framework suivants:

  • CoreBluetooth.framework
  • CoreLocation.framework
  • SystemConfiguration.framework
Voici ce que vous devriez avoir: estimote-frameworks

Assurez-vous aussi si ce n’est déjà fait, que dans la Build Settings section du projet, au niveau du paramètre Header Search Paths, qu’il contient la ligne « $(SRCROOT)/../EstimoteSDK/Headers » qui se charge d’aller chercher les fichiers .h et .m de notre librairie.

Dans le .h

On rajoute le Delegate au niveau de notre vue Controller qui se chargera de l’interaction des ibeacons pour avoir accès aux fonctions disponibles des estimotes.

#import "ESTBeaconManager.h"

@property (nonatomic, strong) ESTBeaconManager* beaconManager;
@property (nonatomic, strong) ESTBeacon* selectedBeacon;

On inclus de Manager des beacons et une instance de celui-ci avec une instance d’un Beacon qui sera le iBeacon sélectionné, qu’on a attrapé par rapport aux autres.

Dans le .m
    // Dans le ViewDidiLoad par exemple
    self.beaconManager = [[ESTBeaconManager alloc] init];
    // New iOS 8 request for Always Authorization, required for iBeacons to work!
    if([self.beaconManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
        [self.beaconManager requestAlwaysAuthorization];
    }
    self.beaconManager.delegate = self;
    self.beaconManager.avoidUnknownStateBeacons = YES;

On initialise le delegate et le manager des ibeacons.

    ESTBeaconRegion* region = [[ESTBeaconRegion alloc] initWithProximityUUID:ESTIMOTE_PROXIMITY_UUID identifier:@"EstimoteBeacon"];
    [self.beaconManager startMonitoringForRegion:region];
    [self.beaconManager requestStateForRegion:region];

On définit maintenant une région avec le proximityUUID des estimotes pour pouvoir les localiser et on demande à notre vue de Monitorer la région.

#pragma mark BeaconManager Delegate functions
-(void)beaconManager:(ESTBeaconManager *)manager
   didDetermineState:(CLRegionState)state
           forRegion:(ESTBeaconRegion *)region
{
    // DANS LA REGION
    if(state == CLRegionStateInside)
    {
        [manager startRangingBeaconsInRegion:region];
    }
}

On est dans la région des ibeacons, si c’est le cas on recherche les ibeacons de la région.

-(void)beaconManager:(ESTBeaconManager *)manager
      didEnterRegion:(ESTBeaconRegion *)region
{
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody = @"BienVenue !";
    notification.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}

Méthode appelée quand on rentre dans la région ou se trouve les ibeacons, idéal pour réveiller l’utilisateur par une notification qu’il s’approche de la zone des ibeacons.

-(void)beaconManager:(ESTBeaconManager *)manager
       didExitRegion:(ESTBeaconRegion *)region
{
    // present local notification
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    notification.alertBody = @"Au revoir et à bientôt";
    notification.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}

Méthode appelée quand on sort de la région ou se trouve les ibeacons, idéal pour remercier l’utilisateur par une notification quand il quite le magasin par exmeple.

-(void)beaconManager:(ESTBeaconManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(ESTBeaconRegion *)region
{
    //NSLog(@"NB Beacons:%i",beacons.count);
    if([beacons count] > 0)
    {
        self.selectedBeacon = [beacons objectAtIndex:0];
        // SI ON EST PROCHE D'UN iBEACON
        if(self.selectedBeacon.proximity == CLProximityNear || self.selectedBeacon.proximity == CLProximityImmediate){
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"major==%lf AND minor==%lf",[self.selectedBeacon.major floatValue],[self.selectedBeacon.minor floatValue]];
    NSArray *results = [[myAppDelegate ibeacons] filteredArrayUsingPredicate:predicate];
        }
    }
}

Ceci est la méthode principale qui détectent les ibeacons qui ont été détecté à proximité.
On peut donc en fonction de sa proximité, accuracy ou encore RSSI faire toutes les actions que l’on souhaite.Dans mon exemple, il détecte les ibeacons (attention il peut y en avoir plusieurs) et je garde le premier qui est d’après moi toujours le plus proche.
Dans ce cas-ci, j’utilise le paramètre de proximité pour savoir si le device est très proche de l’ibeacon.
Je le sauve en tant que ibeacon sélectionné.Et ensuite je recherche avec le minor et major de libeacon dans mon tableau d’objet l’ibeacon et les informations à afficher. Attention:cette méthode est appelé tout le temps qu’on recherche des ibeacons avec startMonitoringForRegion:region.

Il est possible dans Xcode de demander que la localisation tourne en background, ainsi que l’acceptation des notifications : background

Si on utilise le système de création de CLLocation pour déterminer si l’utilisateur rentre ou ressort d’une région, dans IOS, les régions associées à votre application sont suivies en tout temps, y compris lorsque votre application ne fonctionne pas. Si une limite de région est traversée et qaue votre application n’est pas en cours d’exécution, cette application est relancée dans le fond pour gérer l’événement. De même, si l’application est suspendue lorsque l’événement se produit, il est réveillé et donné un court laps de temps (environ 10 secondes) pour gérer l’événement. Intéressant dans ces cas là d’utiliser une LocalNotification pour remettre l’application en premier plan, car il y a une différence significative de la réactivité des balises si l’application est en premier ou arrière plan. Le délai de réponse pour l’utilisateur quand il rentre ou ressort d’une zone est aussi très importante, il y ales notifications locales qui peuvent être déclenchées en quelques secondes si votre application est au premier plan, ou ils peuvent apparaître une minute plus tard dans d’autre cas !

Apple donne aussi la possibilité de gérer les ibeacons estimote sans leur framework: cliquez ici

strong>Attention:Il est intéressant de savoir que les SDK de estimote son aussi dans le gestionnaire de librairie de cocoapods. Petite remarque aussi concernant la version supérieur à 1.3.0, il ne faut pas se fier à la région passé en argument mais plutôt avoir la région au niveau global de la vue et toujours utilisée celle-ci pour starter ou stopper le range ou monitoring.

Tags: estimote , ibeacon , IOS7