Стандартные схемы расположения маяков Bluetooth (iBeacon, AltBeacon, Eddystone-UID) предназначены для передачи уникального числового идентификатора, а не строки. (Eddystone-URL является исключением, поскольку он предназначен для передачи закодированной строки URL-адреса.)
Однако, безусловно, можно передать строку, закодированную в передаче маяка. Просто поймите, что у этого есть несколько ограничений:
Количество места ограничено. При передаче радиомаяка доступно только около 20 байтов полезного пространства, что составляет 20 символов при использовании кодировки, такой как ASCII, и, возможно, меньше в зависимости от символов при использовании UTF-8.
Вам нужно определенное количество совпадающих байтов, чтобы определить (с некоторой разумной уверенностью), является ли реклама «вашей» и должна ли вообще быть декодирована как строка. Использование двухбайтового значения соответствия даст вам шанс 1 из 65536 случайно декодировать чей-то еще маяк в виде строки.
Если вы хотите получать и декодировать на iOS, вы не можете использовать iBeacon, потому что для сопоставления должен использоваться 16-байтовый UUID, оставляя два нескольких байта для хранения строки.
Вот пример того, как вы могли бы сделать это, используя модифицированный макет AltBeacon, с первым двухбайтовым совпадающим идентификатором 0x8b9c, используемым, чтобы убедиться, что это ваш маяк, и вторым 18-байтовым идентификатором, используемым для хранения закодированной строки. Фрагмент кода, показывающий передачу строки ASCII длиной не более 18 символов:
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);
А вот и получаю:
@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);
}
}
}
РЕДАКТИРОВАТЬ: Убедитесь, что вы очистили парсеры маяков, как показано выше, иначе ваш код попытается использовать синтаксический анализатор маяков по умолчанию. См. Изменения кода выше.
person
davidgyoung
schedule
10.12.2017