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:
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.
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.
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.
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