当前位置: 首页 > 知识库问答 >
问题:

在Android Oreo中发布32位服务UUID

聂季同
2023-03-14

我有一个小应用程序,它只执行一个可播放的广告。该应用程序运行在带有Android 8.0的Nexus 5x上

以下是启动BLE广告的代码:

private fun startAdvertising() {
    val serviceUuid = ParcelUuid.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB")

    val data = AdvertiseData.Builder()
            .setIncludeTxPowerLevel(false)
            .setIncludeDeviceName(false)
            .addServiceUuid(serviceUuid)
            .build()

    val settings = AdvertiseSettings.Builder()
            .setAdvertiseMode(AdvertiseSettings.ADVERTISE_MODE_LOW_LATENCY)
            .setTxPowerLevel(AdvertiseSettings.ADVERTISE_TX_POWER_HIGH)
            .setConnectable(true)
            .build()

    bluetoothLeAdvertiser!!.startAdvertising(settings, data, advertiserCallback)
}

广告开始了,但有效载荷是错误的。在Android 8.0之前的设备上,使用第二台设备扫描此消息时,我们会收到正确的服务uuid:

32-bit Service-UUID: 0xDAB5D1DC

但是当我用Android 8.0在我的Nexus 5x上启动广告时,我会收到一个不正确的service-uuid:

32-bit Service-UUID: 0x0000D1DC

对于BLE扫描部分,我使用playstore的nrf Connect应用程序。

如果我宣传通用的128位服务UUID而不是32位服务,一切都按预期工作。

关于我的问题,Android 8.0有任何更改吗?

更新2017-08-28:

Nexus 6P上的相同问题。引发了一个问题:https://issuetracker.google.com/issues/65099899

共有2个答案

唐哲
2023-03-14

创建常量

 public static final UUID serviceUuid = UUID.fromString("DAB5D1DC-0000-1000-8000-00805F9B34FB");

和比

 val data = AdvertiseData.Builder()
        .setIncludeTxPowerLevel(false)
        .setIncludeDeviceName(true)
        .addServiceUuid(new ParcelUuid(Constants.serviceUuid))
        .build()
卓瀚
2023-03-14

仅使用ParcelUuid。fromString(“DAB5D1DC”)这将使您的数据包更小。你的问题可能是因为你的广告包太大了,我想最大是32字节。

 类似资料:
  • hprose 为发布服务提供了多个方法,这些方法可以随意组合,通过这种组合,你所发布的服务将不会局限于某一个函数,某一个方法,某一个对象,而是可以将不同的函数和方法随意重新组合成一个服务。 AddFunction 方法 AddFunction(name string, function interface{}, option ...Options) Service 该方法的用于发布一个函数(命名函

  • 更新时间:2019-05-30 16:03:18 服务开发、调试完成后,需发布到云端,才能被调用。 操作步骤 在服务开发平台,单击页面右上角发布。 在弹出对话框中,填入描述信息后,单击确定。 执行结果服务发布后,IoT Studio为该服务生成默认访问域名。您便可在其他应用开发时使用该服务,或将服务进行商业化使用。 选择页面正上方**发布 > 域名管理**,查看默认域名,或配置自定义域名。

  • AngularJS服务是一种能执行一个常见操作的单例,比如$http服务是用来操作浏览器的XMLHttpRequest对象的。 要使用AngularJS服务,你只需要在需要的地方(控制器,或其他服务)指出依赖就行了。AngularJS的依赖注入系统会帮你完成剩下的事情。它负责实例化,查找左右依赖,并且按照工场函数要求的样子传递依赖。 AngularJS通过“构造器注入”来注入依赖(通过工场函数来传

  • SOFARPC 的服务发布和引用的基本配置已经在「编程界面」章节中说明,这里主要介绍服务发布和引用的一些特性。 同一服务发布多种协议 在 SOFARPC 中,可以将同一个服务发布成多个协议,让调用端可以使用不同的协议调用服务提供方。 如果使用 Java API,可以按照如下的代码构建多个 ServerConfig,不同的 ServerConfig 设置不同的协议,然后将这些 ServerConfi

  • 问题内容: 我的问题是我取回了一些数据,但似乎无法显示它。 问题答案: 应该是您收到的内容的类型,但应该是您要发送的内容的哑剧类型,以下应该可以:

  • 我已经发布了带有endpoint的JAX-WSWeb服务。在开发过程中发布。是否存在(JAX-RS中)用于在jersey中发布RESTWeb服务的此类实用程序类?我参考了几篇文章,其中大部分都是基于在一些容器中发布web服务,如Jetty、Grizzly等。