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

Android的BLE服务发现(BluetoothGatt#发现服务())和低能耗vs BR/EDR

吴星汉
2023-03-14

TLDR:是否预期通过DiscoverServices()获得的服务发现结果会根据基础传输(LE vs. BR/EDR)而有所不同?

我有一个混合模式蓝牙配件,作为蓝牙经典设备和蓝牙LE外设提供了独特的功能。

除非你使用隐藏的PeerBluetooth设备,否则Android很难发现该配件的蓝牙LE GATT服务。connectGatt(上下文、自动连接、gattCallback、BluetoothDevice.TRANSPORT_LE)API,允许您强制使用TRANSPORT_LETRANSPORT_BREDR

当我通过PeerBluetooth设备连接设备时。connectGatt(context,autoConnect,gattCallback)然后调用discoverServices()我只会发现通用服务UUID(并且只有在多次失败的连接尝试之后,神秘的状态133被传递到onConnectionStateChange)。

  • “00001800-0000-1000-8000-00805f9b34fb”(通用访问)
  • “00001801-0000-1000-8000-00805f9b34fb”(通用属性)

但是,当我调用隐藏的peerBluetoothDevice.connectGatt(上下文,自动连接,gattCallback,BluetoothDevice。TRANSPORT_LE),然后调用发现服务()我得到完整的预期服务发现响应:

  • “XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXX”(我的定制服务)

这是预期的Android框架行为吗(对此表示怀疑,因此隐藏了API)?用这种“混合模式”操作设计外围设备是不是很糟糕?

共有1个答案

夏和雅
2023-03-14

这个

BluetoothDevice.connectGatt(上下文,布尔自动连接,android.bluetooth.BluetoothGattCallback回调,int传输)

从API 23开始,该方法是公开的,因此似乎是避免上述问题的认可方法。

该方法似乎已经在android-5.0.0_r1版本中引入AOSP,并且出现在导致它在API 23中公开的每个版本中。因此,对于API级别为21和22的设备,通过反射调用应该是安全的。对于具有先前平台版本的设备,Android框架似乎没有提供缓解问题的工具。

 类似资料:
  • 服务发现服务[架构概述]。 { "cluster": "{...}", "refresh_delay_ms": "{...}" } cluster (required, object) 承载服务发现服务的上游群集的标准定义。该群集必须实现和运行SDS HTTP API的REST服务。 refresh_delay_ms (required, integer) 每次访问SDS群集的API延迟

  • Kubernetes中为了实现服务实例间的负载均衡和不同服务间的服务发现,创造了Serivce对象,同时又为从集群外部访问集群创建了Ingress对象。

  • 在单体架构时,因为服务不会经常和动态迁移,所有服务地址可以直接在配置文件中配置,所以也不会有服务发现的问题。但是对于微服务来说,应用的拆分,服务之间的解耦,和服务动态扩展带来的服务迁移,服务发现就成了微服务中的一个关键问题。 服务发现分为客户端服务发现和服务端服务发现两种,架构如下图所示。 这两种架构都各有利弊,我们拿客户端服务发现软件Eureka和服务端服务发现架构Kubernetes/SkyD

  • 如何包含Eureka服务器 要在项目中包含Eureka服务器,请使用组org.springframework.cloud和工件id spring-cloud-starter-eureka-server的启动器。有关 使用当前的Spring Cloud发布列表设置构建系统的详细信息,请参阅Spring Cloud项目页面。 如何运行Eureka服务器 示例eureka服务器; @SpringBoot

  • 我正在尝试一个非常简单的Istio设置Docker桌面库伯内特斯安装。 我有2个Spring Boot微服务,并在我的K8s“集群”中部署了这2个服务,没有任何复制。我的YAML文件中只有这两个服务的服务和部署。 我已经安装了 istio,我可以看到我的 pod 中有 2 个容器。一个是Spring靴应用程序,另一个是istio sidecar。 我像这样从服务2向服务1发出一个rest调用,它工

  • LbEndpoint LocalityLbEndpoints ClusterLoadAssignment ClusterLoadAssignment.Policy LbEndpoint LbEndpoint proto EndPoint是指Envoy可以将流量路由到的端口。 { "endpoint": "{...}", "metadata": "{...}", "load_balanc