问题标签 [bluetooth-peripheral]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
914 浏览

android - 我可以请求将 MTU 从外围设备更改为 android 设备(即使在较旧的 API 中)?

我有一个硬件作为外围设备,我想读取它的所有内存,它有 1081344 字节。使用 23 字节的标准大小(20 字节对数据有用 -> 请参阅编辑以了解它是如何工作的)读取所有内存需要一分钟多的时间,所以我想提高吞吐量。为此,我可以使 MTU 更大,正如我在这篇有用的文章 ( https://punchthrough.com/blog/posts/maximizing-ble-throughput-part-2-use-larger-att-mtu ) 中看到的那样。听说用较大的 MTU 传输不稳定。是不是太不稳定以至于不值得使用,或者不管不稳定,它都能提供更好的吞吐量?

问题是android仅从API 21提供requestMtu方法。我想知道是否可以从外围更改MTU而无需在android端实现任何回调或函数(这样它可以在18之后的任何API上工作)。从这个答案(Requesting MTU with Bluetooth Low Energy connection on Android 4.3-4.4 (API 18-20))看来是可能的,但我不确定我是否应该在android端做一些实现。

如果 android 不接受这个请求,是否有另一种方法可以在不依赖 API 21 的新功能的情况下更改 MTU?这个答案(Change the MTU or Packet Size for Bluetooth in Android?)让我相信这是可能的,但我不清楚它是如何完成的。

如果我可以向外围设备请求 MTU 大小(固件开发人员向我确认这是可能的),外围设备能否知道它是否成功?我认为使用它就足够了,因为我可以通过特性与我的外围设备进行通信,它可以告诉我请求是否被接受。我只是想知道是否可以相信 android 会接受并发送成功响应,或者在 21 之前的 API 上是否存在 23 字节 MTU 的限制。

由于在硬件上实现它需要一些时间,我想知道它是否值得尝试,或者是否绝对行不通。

编辑:外围设备现在一次更新一个包含 20 个字节的包的特性,并向我的中心发送更改通知。因此,块的划分是在服务器端完成的。我想要的是使这些块更大。

0 投票
1 回答
3182 浏览

android - Android Bluetooth Peripheral: Connection terminated by peer (Status 19)

Developed an application which acts as peripheral and connects with other device (central only).

It's working fine in devices having OS version 6.0, but getting some issues in Nougat 7.0.

I've collected some logs, enabling "Bluetooth HCI snoop log" in developer option.

Collected Logs:


Peripheral Service (Code):


0 投票
1 回答
1384 浏览

android - Android Things BLE 外设加密读写权限

关于使用蓝牙低功耗外围设备设置引脚的文档并不多。在我的 Gatt 服务中,我设置了并在尝试写入我设置的蓝牙写入特性时在我的日志中BluetoothGattCharacteristic.PERMISSION_WRITE_ENCRYPTED_MITM接收到一条消息。GATT_INSUFFICIENT_PERMISSION我想知道为外围设备启用加密的过程是什么。

谢谢

0 投票
0 回答
715 浏览

bluetooth-lowenergy - Android BLE 作为外设多重广告问题

我正在将 Android BLE 用作连接到以 Nordic NRF51 为中心的自定义设备的外围设备。该项目需要 Android 外围设备连接到两个 NRF51 中央设备。

Android 正在宣传两种不同的广告 UUID,一种用于左侧,另一种用于右侧 Nordic NRF51 设备。理想情况下,我希望两个 Nordic Central 同时连接到 Android。

我有两个主要问题。

首要问题。Android可以很好地获得两个连接。当 Android 发送通知或 Android 作为中央写入请求的结果返回回复时,会出现此问题。当两个 Central 都连接时,通常通知和发送回复都有效。我确认北欧中央没有收到通知,也没有收到回复。有没有人在 Android 作为同时支持多个连接的外设方面有经验?我已经尝试了两个 BluetoothGattServer 实例(每个设备一个)以及一个 BluetoothGattServer 实例,并且基于连接的设备,我可以判断该事件是针对哪个 Central 并正确处理它。它正在向写入请求发送通知或发送回复,有时它不会从 Android 发送。我在 GattServerCallback 事件处理程序上使用同步方法。

第二期。由于第一个问题,我现在一次只宣传一个 UUID。这个想法是在两个广告 UUID 之间切换,因此一次只有一个连接。现在的问题是切换广告。大约 1 次 3 次,当我开始用第一个 UUID 及其名称(LFDroid)做广告时,它似乎实际上是在短暂(1 或 2 秒)用它的名称(RTDroid)宣传第二个 UUID,然后宣传所请求的内容。请注意,第二个 UUID 广告在上一次切换时停止。几乎看起来当我要求做广告时,它开始用最后公布的 UUID 和名称做广告,然后迅速公布所请求的内容。现在这会导致问题,因为两个 Nordic Centrals 都看到了广告并进行了连接。

任何建议,将不胜感激。

0 投票
1 回答
542 浏览

android - 具有蓝牙 LE 外设功能的 Android 设备的市场份额?

我正在开发一个使用蓝牙 LE 技术的应用程序。我正在尝试在两个设备之间建立双向通信,起初认为蓝牙 LE 是完美的选择。

但后来我越了解它,我就越失望,因为似乎没有足够的设备支持外围功能,尽管这是很久以前引入的。

我知道在大多数情况下中心角色是可能的,但是为了让我的应用程序正常工作,我需要确保有足够的设备支持(并将支持)外围角色。

但我真的不确定情况是什么,因为我找不到任何具有支持外围功能的设备列表的知名来源。由于生态系统的分散性,我不知道这是否是硬件供应商计划放弃的东西,或者覆盖范围是否会增加。

任何人都可以分享一些见解吗?

  • 编辑:我已经阅读了另一个建议作为副本的答案(支持 Android 5 BLE 外围模式的芯片组/设备)以及我在 Stackoverflow 上可以找到的关于该主题的几乎所有内容。但是我还没有找到一个明确的列表,列出哪些设备支持这个功能,以及这个功能的未来是什么。不知道我是否应该依赖这个 API 非常令人沮丧,因为虽然他们说这取决于硬件供应商,但没有硬件供应商在他们的设备规格中包含这些信息,这就是我问这个问题的原因。
0 投票
1 回答
403 浏览

bluetooth-lowenergy - 访问相同 BLE 外设的 iOS 应用:如何区分?

我必须遵循以下场景:我的应用程序从 BLE 外围设备(血糖仪)请求并接收数据。用户可能安装了另一个应用程序(来自另一个开发人员),该应用程序也与外围设备通信。我注意到我的应用程序接收到由其他应用程序发起的请求的特征通知。这会导致我的应用两次接收一些数据。

有什么方法可以区分对我的请求的响应和由另一个应用程序引起的响应?或者我该如何处理?

0 投票
0 回答
574 浏览

android - 电话(作为外围角色)在 JustWorks 配对模式下不显示配对对话框

我正在编写一个通过 BLE 连接到物理设备的 Android 应用程序。Android 应用程序将充当外围角色,而设备是中心。设备 I/O 功能也设置为 NoInputNoOutput ( ble_cmd_sm_set_parameters(0, 8, sm_io_capability_noinputnooutput))

建立连接的流程是:

  • 打开 Android 应用程序,然后通过以下方式打开蓝牙 Gatt 服务器连接bluetoothManager.openGattServer()
  • 将 BluetoothGattService 添加到该 BluetoothGattServer 中(这里该服务包含一些具有属性指示和通知、权限读取和写入的特性)
  • 添加所有服务后,开始发送广告
  • 触摸设备上的一个按钮,让它开始扫描外围设备。
  • 当检测到手机时,设备会向手机发送配对信号。
  • 接收到该信号,理论上,Android 设备将显示一个带有 2 个按钮 PAIR 和 CANCEL 的配对对话框以确认配对(这是 JustWorks 模式而不是 Passkey,因为它不需要我们使用键盘输入密钥)。
  • 然而,在几款 Android 设备上进行测试后,有些设备具有该对话框,例如 Moto Z (Android 6)、Moto G (Android 6),而其他设备则没有,例如 Galaxy S7、Galaxy Tab S2(均为 Android 7)。我使用WireShark捕获和分析这些设备的蓝牙包,并实现前者有Sent Pairing Request: AuthReqSecure Connection Flag = 1后者有Secure Connection Flag = 0(有关安全连接标志的更多信息,请参阅蓝牙配对第4部分

从 Android Studio logcat 读取输出时(如果是三星设备),我得到这些日志: 01-31 15:21:53.322 D/BluetoothAdapter: isSecureModeEnabled 01-31 15:21:53.322 D/BtConfig.SecureMode: isSecureModeOn:false 01-31 15:21:53.325 D/BluetoothAdapter: STATE_ON 01-31 15:21:53.325 D/BluetoothLeAdvertiser: start advertising 不确定 SecureMode 是否与我们提到的 SecureConnection 相同。

据我了解,该配对是带有 JustWorks 模式的 BLE 安全连接。但似乎并非所有 Android 设备都支持它(您能确认我的想法吗?)。或者,我们如何强制后面的设备也有配对对话框?

一件重要的事情是,我有一个具有相同连接流程和相同物理设备的 iOS 应用程序,它确实显示了配对对话框。

0 投票
1 回答
60 浏览

bluetooth-lowenergy - 蓝牙低功耗广告

据我了解,作为外围设备,当您宣传数据包时,会包含 RSSI 值。与中央设备建立连接后,外围设备是否可以读取该 RSSI 值?

0 投票
0 回答
954 浏览

android - Android BLE 外设立即断开连接

我编写了一个可以宣传和设置 gatt 服务器的 android 应用程序(外围设备)。当我使用其他 android 设备(Central)连接到它时,例如使用nRFConnectapplication 或LightBlue,Peripheral 端在收到连接回调后立即断开连接。

这是我设置 gatt 服务器的代码:

我的BluetoothGattServerCallback

这是我的外围设备日志:

关于如何宣传和设置 gatt 服务器并没有什么晦涩难懂的,但我很困惑!我无法BLE Connection Parameters通过 Android Peripheral API 或任何其他低级配置设置,所以一切都在这里!

有任何想法可以帮助我吗?

0 投票
1 回答
59 浏览

java - 蓝牙低功耗广告服务器 Android

我正在创建一个充当外围设备并发送低功耗蓝牙广告的 android 应用程序。我正在使用 BluetoothGattServer 设置服务器以供客户端设备连接。我的主要目标是从客户端读取 RSSI 值。我是否可以使用 BluetoothGattCallback 而不是 BluetoothGattServerCallback 和 BluetoothGattServer,以便我可以实现和使用 readRemoteRssi?