2017-12-10 7 views
0

Ich lerne Android App-Entwicklung, während eine App erstellen, die mit dem physischen Netz in Wechselwirkung tritt. Ich möchte basierend auf AltBeacon Spezifikation und fügen kleine Nutzlast in Form von Zeichenfolge oder Bytes werben. Ich stieß auf Beacon.Builder Javadoc, aber es ist nicht gut geschrieben. Welche Funktion sollte ich aus dem obigen Javadoc verwenden oder gibt es noch etwas anderes?unter Verwendung AltBeacon Format

Mein Ziel ist es mit meiner app und übertragen bestimmte Zeichenfolge zu werben. Wenn das andere Gerät meine App hat, sollte es eine Benachrichtigung mit dieser Zeichenfolge anzeigen. All mein Code wurde von this genommen.

+0

Jemand könnte diese nützliche setDataFields finden, und setExtraDataFields scheint möglicherweise zusätzliche Nutzlast aufzunehmen, aber sie können nur 6 Byte Nutzlast oder Größe von Java lang halten. – potatoPC

Antwort

0

Standard-Bluetooth-Bake-Layout (IBeacon, AltBeacon, Eddystone-UID) ist so konzipiert, eine eindeutige numerische Kennung zu übertragen, keinen String. (Eddystone-URL ist ein bisschen eine Ausnahme, da es eine codierte URL-Zeichenfolge übertragen soll.)

Es ist jedoch sicherlich möglich, eine in einer Beacon-Übertragung codierte Zeichenfolge zu übertragen. Nur verstehen, dass es ein paar Einschränkungen gibt:

  1. Die Menge an Speicherplatz ist begrenzt. In Beacon-Übertragungen stehen nur etwa 20 Byte nutzbarer Speicherplatz zur Verfügung, bei Verwendung einer Codierung wie ASCII 20 Zeichen und bei Verwendung von UTF-8 möglicherweise weniger, je nach Zeichen.

  2. Sie benötigen eine bestimmte Anzahl von übereinstimmenden Bytes, um (mit einiger begründeter Sicherheit) herauszufinden, ob die Werbung "Ihre" ist und als String überhaupt dekodiert werden soll. Wenn Sie einen zwei Byte langen übereinstimmenden Wert verwenden, erhalten Sie eine Wahrscheinlichkeit von 1 zu 65536, versehentlich den Beacon eines anderen Benutzers als Zeichenfolge zu dekodieren.

  3. Wenn Sie unter iOS empfangen und dekodieren möchten, können Sie iBeacon nicht wirklich verwenden, da eine 16-Byte-UUID zum Abgleichen verwendet werden muss und zwei wenige Bytes übrig bleiben, die die Zeichenfolge enthalten.

Hier ist ein Beispiel dafür, wie Sie diese mit einem modifizierten AltBeacon Layout tun konnten, mit einer ersten zwei Byte passenden Kennung 0x8b9c verwendet sicherzustellen, dass es Ihr Leuchtfeuer ist, und die zweite 18-Byte-Kennung verwendete eine zum Speichern codierte Zeichenfolge. Der Code-Snippet, das zeigt einen ASCII-Zeichenfolge zu übertragen, die maximal 18 Zeichen lang:

public static final Identifier MY_MATCHING_IDENTIFIER = Identifier.fromInt(0x8b9c); 
... 
mBeaconManager.getBeaconParsers().clear(); 
BeaconParser customBeaconParser = new BeaconParser().setBeaconLayout("m:2-3=beac,i:4-5,i:6-23,p:24-24,d:25-25"); 
mBeaconManager.addBeaconParser(customBeaconParser); 
String stringToTransmit = "Only 18 chars fit!"; 
byte[] stringToTransmitAsAsciiBytes = stringToTransmit.getBytes(StandardCharsets.US_ASCII); 
Beacon beacon = new Beacon.Builder().setId1(MY_MATCHING_IDENTIFIER.toString()) 
      .setId2(Identifier.fromBytes(stringToTransmitAsAsciiBytes, 0, 18, false).toString()) 
      .setTxPower(-59).build(); 
mBeaconTransmitter = new BeaconTransmitter(this, customBeaconParser); 
mBeaconTransmitter.startAdvertising(beacon); 

Und hier ist es empfängt:

@Override 
public void didRangeBeaconsInRegion(Collection<Beacon> beacons, Region region) { 
    for (Beacon beacon : beacons) { 
     if (beacon.getId1().equals(MY_MATCHING_IDENTIFIER)) { 
      byte[] bytes = beacon.getId2().toByteArray(); 
      String receivedString = null; 
      try { 
       receivedString = new String(bytes, 0, bytes.length, "ASCII"); 
      } catch (UnsupportedEncodingException e) { 
       Log.d(TAG, "Cannot decode ASII"); 
      } 
      Log.d(TAG, "I just received: "+receivedString); 
     } 
    } 
} 

EDIT: sicher, dass Sie die Beacon-Parser klar, wie gezeigt Ansonsten wird Ihr Code versuchen, den Standard-Beacon-Parser zu verwenden. Siehe Codeänderungen oben.

+0

Wenn ich also MD5-Hash verwende und statt 32 Zeichen 16 Zeichen verwalte, kann ich das mit größerer Genauigkeit erreichen, während ich zwei weitere Bytes als eindeutige Anfangsbytes bekomme. Es wird noch schwieriger, eine doppelte Übereinstimmung zu erhalten. Die Wahrscheinlichkeit wäre dann 1 von 256^4. Ist es korrekt – potatoPC

+0

@davidyoung gibt es keine ClearBeaconParsers Methode in BeaconManager. Bitte überprüfen Sie die Dokumentation http://altbeacon.github.io/android-beacon-library/javadoc/index.html – potatoPC

+0

Sorry, Verwendung: 'mBeaconManager.getBeaconParsers().clear(); 'Ich habe eine experimentelle V3-API verwendet, die die zuvor gezeigte neue Syntax verwendet. Ich habe meine Antwort aktualisiert. – davidgyoung

Verwandte Themen