通过使用Altbeacon格式在广告时添加自定义数据



我正在学习Android应用程序开发时,构建与物理网络交互的应用程序。我想根据AltBeacon规范进行广告宣传,并以 String bytes 的形式添加小有效载荷。我遇到了信标。BuilderJavadoc,但写得不好。我应该从上述Javadoc使用哪个功能,或者还有其他可用的功能?

我的目标是使用我的应用程序做广告并传输某些字符串。如果另一个设备具有我的应用,则应显示该字符串的通知。我所有的代码都从中获取。

标准蓝牙信标布局(iBeacon,altbeacon,eddystone-uid)旨在传输唯一的数字标识符,而不是字符串。(Eddystone-url有点例外,因为它旨在传输编码的URL字符串。)

但是,当然可以传输在信标传输中编码的字符串。只需了解这一点:

  1. 空间量受到限制。信标传输中只有大约20个字节的可用空间,如果使用utf-8,则使用诸如ASCII之类的编码,可能是20个字符。

  2. 您需要一定数量的匹配字节来找出广告是"您的",并且应该完全作为字符串解码。使用两个字节匹配值将为您提供65536中的1个机会,将别人的信标不小心解码为字符串。

  3. 如果您想在iOS上接收和解码,则不能真正使用iBeacon,因为必须使用16个字节UUID进行匹配,并剩下两个字节来保留字符串。

这是一个示例,说明了如何使用修改后的altbeacon布局进行此操作,其中前两个字节匹配标识符的0x8B9C标识符用于确保它是您的信标,而第二个18个字节标识符用于存储编码的字符串。表示最大长18个字符的ASCII字符串的代码段:

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

编辑:确保您清除信标解析器,如上所示,否则您的代码将尝试使用默认的信标解析器。请参阅上面的代码更改。

最新更新