2016-08-25 1 views
0

J'ai le code ci-dessous utilisé pour la transmission d'iBeacon à partir d'une application Android.Obtention du transfert de données par paquets depuis iBeacon android

Beacon beacon = new Beacon.Builder() 
         .setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2") 
         .setId2(Integer.toString(minor1)) 
         .setId3(Integer.toString(minor2)) 
         .setManufacturer(0x0000) 
         .setTxPower(-59) 
         .setDataFields(Arrays.asList(new Long[] {0l})) 
         .build(); 
       BeaconParser beaconParser = new BeaconParser() 
         .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"); 
       BeaconTransmitter beaconTransmitter = new BeaconTransmitter(getApplicationContext(), beaconParser); 
       beaconTransmitter.startAdvertising(beacon); 
      } 
     }); 

Serait-il possible pour moi d'obtenir les données transmises dans des paquets? Comment puis-je obtenir ces données? Merci!

Répondre

0

Si vous voulez simplement obtenir les octets du paquet à transmettre, vous pouvez le faire comme ceci:

Beacon beacon = new Beacon.Builder() 
        .setId1("6fb0e0e9-2ae6-49d3-bba3-3cb7698c77e2") 
        .setId2(Integer.toString(minor1)) 
        .setId3(Integer.toString(minor2)) 
        .setManufacturer(0x0000) 
        .setTxPower(-59) 
        .setDataFields(Arrays.asList(new Long[] {0l})) 
        .build(); 
BeaconParser beaconParser = new BeaconParser() 
        .setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24"); 
byte[] bytes = p.getBeaconAdvertisementData(beacon); 

Utilisation de la code ci-dessus, le tableau d'octets ressemblera à ceci:

02 15 6f b0 e0 e9 2a e6 49 d3 bb a3 3c b7 69 8c 77 e2 ... 

Notez que ce tableau d'octets n'est pas le plein paquet qui est transmis sur l'air, seulement la partie des données du fabricant de celui-ci. Le paquet transmis sur l'air est préfixé d'un octet de type PDU et d'un octet de longueur, et est également préfixé d'une unité PDU flags. Ces préfixes, cependant, sont les mêmes pour chaque paquet transmis, et sont ajoutés automatiquement par les API de transmission Androids BLE, de sorte qu'ils ne sont pas inclus dans les octets retournés par getBeaconAdvertisementData().

+0

Salut @davidgyoung. Vraiment merci pour votre aide. J'apprécie vraiment cela! – Helmi

0

En supposant que vous allez recevoir les données transmises sur un appareil Android, vous pouvez utiliser la même bibliothèque pour cela.

Voici comment le flux serait,

@Override 
public void onCreate(Bundle bundle){ 
    ... 
    beaconManager = BeaconManager.getInstanceForApplication(this); 
    beaconManager.getBeaconParsers().add(new BeaconParser(). 
      setBeaconLayout("m:2-3=0215,i:4-19,i:20-21,i:22-23,p:24-24")); 
    beaconManager.bind(this); 
    ... 
} 


@Override 
public void onBeaconServiceConnect() { 

    /** 
    * Start Monitoring the relevant region. 
    * */ 

    try { 
     beaconManager.startMonitoringBeaconsInRegion(new Region("Generic_Region", null, 
       null, null)); 
    } 
    catch (RemoteException e){ 
     e.printStackTrace(); 
    } 

    beaconManager.addMonitorNotifier(new MonitorNotifier() { 

     /** 
     * Start ranging for Beacons when a region is entered. 
     * */ 

     @Override 
     public void didEnterRegion(Region region) { 
      try { 
       beaconManager.startRangingBeaconsInRegion(region); 
      } catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
     } 

     /** 
     * Stop ranging for Beacons on region exit. 
     * */ 
     @Override 
     public void didExitRegion(Region region) { 
      try { 
       beaconManager.stopRangingBeaconsInRegion(region); 
      } 
      catch (RemoteException e) { 
       e.printStackTrace(); 
      } 
      Log.i(TAG, "SERVICE : I no longer see a beacon"); 
     } 

     @Override 
     public void didDetermineStateForRegion(int state, Region region) { 
      Log.i(TAG, "SERVICE : I have just switched from seeing/not seeing beacons: " + state); 
     } 
    }); 


    beaconManager.addRangeNotifier(new RangeNotifier() { 

     @Override 
     public void didRangeBeaconsInRegion(Collection<Beacon> collection, Region region) { 




      } 
    }); 

} 
+0

va-t-il me montrer les données au format paquet binaire? Parce que c'est ce dont j'ai besoin maintenant – Helmi

+0

Comme vous pouvez le voir La méthode RangeNotifier fournit essentiellement une collection de balises dans la région surveillée qui sont actuellement à portée. Chaque balise de cette collection contient en effet des données auxquelles vous pouvez accéder. [Ici] (https://altbeacon.github.io/android-beacon-library/javadoc/org/altbeacon/beacon/Beacon.html) est plus d'informations sur Beacon et le type de données que vous pouvez obtenir. –