首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用AltBeacon库以Gatt服务UUID格式扫描和发布

使用AltBeacon库以Gatt服务UUID格式扫描和发布
EN

Stack Overflow用户
提问于 2020-07-03 04:31:00
回答 1查看 86关注 0票数 0

我已经编写了一段代码来在GattService UUID中发布广告,尽管我仍然不能确定应该通过哪种解析器来运行它,以便只接受以相同格式发布并且是有效的发布模式的结果。

要在Gatt服务UUID中公布的代码:

代码语言:javascript
复制
public void startGattServiceAdvertising() {
    BluetoothAdapter defaultAdapter = BluetoothAdapter.getDefaultAdapter();
    if (defaultAdapter == null) {
        return;
    }
    String uniqueId = "Hello world";
    if (uniqueId.isEmpty()) {
        return;
    }
    defaultAdapter.setName(uniqueId);
    BluetoothLeAdvertiser advertiser = defaultAdapter.getBluetoothLeAdvertiser();
    AdvertiseSettings.Builder settingsBuilder = new AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_BALANCED)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_LOW)
            .setConnectable(true);

    String userId = "4539c428-0c3c-4606-b701-98bde9c39a82";
    ParcelUuid pUuid = new ParcelUuid(UUID.fromString(userId));

    LogHelper.d("Parcel: ", "UUID: " + pUuid.getUuid());
    AdvertiseData data = new AdvertiseData.Builder()
            .setIncludeDeviceName(false)
            .addServiceUuid(pUuid)
            .setIncludeTxPowerLevel(false).build();

    LogHelper.d("Parcel: ", "Service UUID: " + data.getServiceUuids().toString());
    if (advertiser != null) {
        try {
            advertiser.startAdvertising(settingsBuilder.build(), data, getAdvertiseCallback());
        } catch (Exception e) {
            e.printStackTrace();
            // Adding common exception just to retry this if anything goes wrong in the first time
            // (Chinese devices facing some legacy data issue)
            //Some OEM shows Advertising data too large exception,so not sending txPowerLevel
        }
    }
}

这是我正在寻找的广告方式,我也能够在其他设备上检测到同样的情况,我唯一关心的是我需要在库端进行更改以验证这一特定格式,就像AltBeacon库通过调用fromScanData(..)方法对其他格式所做的那样。为了让检测到的信标通过解析器成功运行,我是否需要在扫描端做一些额外的广告,或者应该做哪些更改。

EN

回答 1

Stack Overflow用户

发布于 2020-07-03 04:50:13

所显示的代码只是发出一个标准的BLE128位服务UUID通告,该通告恰好在服务UUID字段中放置了一个用户id。

这很好--但它无法让您在接收端确定这是“您的”广告之一,还是不是来自硬件设备的广告。例如,Apple Watch将发出使用此相同格式的特定128位服务UUID。因此,如果你的Android应用程序扫描此广告时遇到Apple Watch,它会认为这是一个特定的用户id。

像iBeacon,AltBeacon和Eddystone这样的标准信标格式至少有三个部分,第一个部分解决了这个问题:

  1. 一组静态字节,其值永远不会更改,用于指示它确实是此类型的信标
  2. 作为其他信标标识符的动态字节集
  3. 用于距离估计的测量功率字段(可选)

您显示的格式缺少fist组件。因此,您无法判断它是否是您的信标类型

需要注意的一点是,如果需要iOS互操作性,请注意使用服务广告。虽然iOS可以扫描和传输这些广告,但它不能在后台传输这种格式。此外,它根本不能附加服务数据,这使得上面的点(1)是不可能的。出于同样的原因,Eddystone格式根本不能在iOS上做广告。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62704591

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档