/ / Agregue datos personalizados mientras hace publicidad utilizando el formato AltBeacon - Android, Bluetooth-lowenergy, beacon, altbeacon

Agregue datos personalizados mientras hace publicidad utilizando el formato AltBeacon - Android, Bluetooth-lowenergy, beacon, altbeacon

Estoy aprendiendo el desarrollo de aplicaciones para Android mientras construyo una aplicación que interactúa con la web física. Quiero hacer publicidad basada en la especificación AltBeacon y agregar una pequeña carga útil en forma de cuerda o bytes. Me encontré con Beacon.Builder Javadoc pero no está bien escrito. ¿Qué función debo usar del javadoc anterior o hay algo más disponible?

Mi objetivo es hacer publicidad usando mi aplicación y transmitir cierta cadena. Si el otro dispositivo tiene mi aplicación, debería mostrar una notificación con esa cadena. Todo mi código ha sido tomado de esta.

Respuestas

0 para la respuesta № 1

Diseños de balizas bluetooth estándar (iBeacon,AltBeacon, Eddystone-UID) están diseñados para transmitir un identificador numérico único, no una cadena. (Eddystone-URL es una pequeña excepción, ya que está diseñado para transmitir una cadena de URL codificada).

Sin embargo, es ciertamente posible transmitir una cadena codificada en una transmisión de baliza. Solo entiende que hay algunos límites para esto:

  1. La cantidad de espacio es limitada. Solo se dispone de unos 20 bytes de espacio utilizable en las transmisiones de balizas, que son 20 caracteres si se usa una codificación como ASCII, y posiblemente menos dependiendo de los caracteres si se usa utf-8.

  2. Necesita un cierto número de bytes coincidentes paraaveriguar (con cierta certeza razonable) si el anuncio es "suyo" y debe decodificarse como una cadena en absoluto. El uso de un valor coincidente de dos bytes le daría una probabilidad de 1 en 65536 de descodificar accidentalmente la baliza de otra persona como una cadena.

  3. Si desea recibir y decodificar en iOS, realmente no puede usar iBeacon, porque se debe usar un UUID de 16 bytes para la coincidencia, dejando dos bytes para mantener la cadena.

Aquí hay un ejemplo de cómo puedes hacer esto usandoun diseño AltBeacon modificado, con un primer identificador de coincidencia de dos bytes de 0x8b9c utilizado para asegurarse de que es su baliza, y el segundo identificador de 18 bytes utilizado para almacenar una cadena codificada. El fragmento de código que muestra la transmisión de una cadena ASCII que tiene una longitud máxima de 18 caracteres:

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);

Y aquí lo está recibiendo:

@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);
}
}
}

EDITAR: Asegúrese de borrar los analizadores de baliza como se muestra arriba, de lo contrario su código intentará usar el analizador de baliza predeterminado. Ver cambios en el código de arriba.