问题标签 [android-ble]

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 投票
3 回答
2335 浏览

android - BluetoothGattServer cancelConnection 不取消连接

我有暴露 BLE 服务器的 Android 应用程序。我与BluetoothGattServer#connect 连接。它有效 - 我的应用程序使用STATE_CONNECTED调用BluetoothGattServerCallback#onConnectionStateChange。完成客户端后,我尝试使用BluetoothGattServer#cancelConnection断开与我的应用程序的连接。

但是我没有接到BluetoothGattServerCallback#onConnectionStateChange的电话,并且似乎连接仍然处于活动状态,因为我的 BLE 客户端没有开始做广告(当没有任何连接时它会这样做)。

在 logcat 我只看到:

有趣的是,一旦我完全关闭 BT ,我的应用程序就会使用STATE_DISCONNECTED调用BluetoothGattServerCallback#onConnectionStateChange 。

谷歌跟踪器中的类似问题:6346163464

0 投票
2 回答
3539 浏览

android - BluetoothDevice 总是在 getName() 上返回 null

我在 Android 4.4、5 和 6 中一直面临这个问题。

我正在执行 BLE 蓝牙设备扫描,之后我可以访问它们的地址 (getAddress()) 和其他数据。但是如果我调用 device.getName() 它每次都返回 null。

该文档没有帮助,它只说如果“出现问题”则返回 null:https://developer.android.com/reference/android/bluetooth/BluetoothDevice.html#getName()

我访问失败的其他帖子:

https://code.google.com/p/android/issues/detail?id=34411

android BluetoothDevice.getName() 返回 null

ble 设备 bluetoothdevice.getname() 返回 null

PS:我在 Android API 级别 21+ 中使用不推荐使用的方法,所以这与问题无关。

知道这里可能出了什么问题吗?

0 投票
2 回答
528 浏览

android - 如何有效地同时从两个 BLE 设备读取温度?

首先,我使用RxAndroidBLE库来管理我的 BLE 连接。

我有两个SensorTag 设备,我想同时读取这两个设备的温度。例如,我想每 500 毫秒准确读取两个设备的温度,并在两个 TextView 中显示给用户。

我的应用程序当前成功连接到两个 BLE 设备,如下所示:

现在我正在寻找每 500 毫秒同时读取两者温度的最佳方法。

现在,我正在做这样的事情:

这段代码位于每 500 毫秒调用一次的可运行文件中。

我觉得这是一种非常低效的方法。有人可以让我知道是否有更好的方法来做到这一点?

0 投票
1 回答
6962 浏览

android - onCharacteristicWrite() 被调用,但它并不总是写

我有一个带有蓝牙低功耗芯片的定制硬件。我已经设置了一个包含 500 个 u32 的数组,这样数组 [n] == n。我正在开发一个可以连接到设备的 android 应用程序,请求数组的长度,然后一次请求数组中的数据点。

android 应用程序似乎大部分工作正常。它连接到设备,请求长度,并在收到上一条数据后继续请求下一条数据。但是,在数组的中途(从 2 到 450 个元素的任何地方 - 似乎不一致),它会编写另一个命令,并且会一直执行到 onCharacteristicWrite(),但它永远不会收到响应。我的 BLE 外围设备连接到 CoolTerm,它甚至从未收到命令。以下是我的代码和日志中的片段:

BLE服务:

我省略了与描述符写入、连接状态更改等相关的回调中不必要的部分。广播数据时,它在 MainActivity 的这一部分中接收:

调用 writeCharacteristic 的代码:

我相当肯定发送命令太快没有问题。它实际上非常慢,我是故意这样做的,这样我就可以在继续进行项目的下一部分之前更轻松地进行测试。

我的调试日志之一的片段:

和我相应的 CoolTerm 日志片段:

请注意,在我的外围日志中,它似乎没有收到对数据点 53 的请求。作为参考,onCharacteristicWrite 调试中的第一个十六进制字节是命令。命令 02 只是意味着我在接下来的 2 个字节包含的任何索引处请求一个数据点。

我注意到在 Android 日志中,没有用于请求数据点 51 的 onCharacteristicWrite 日志。这似乎每次都在它停止获取数据之前发生,但我不确定这是否重要或只是一个日志缓冲区问题。

我已经运行了很多测试,试图注意到任何模式,并且我注意到当设备未连接到调试电缆时,它似乎获得了更多数据点。在这一点上,我唯一的想法是,也许我遇到了异步中断回调的问题,但我不知道该怎么做。有人对为什么在调用 onCharacteristicWrite 后它似乎没有实际写入数据有任何想法吗?

谢谢

编辑:

我按照 Emil 的建议打开了蓝牙记录。我玩了wireshark并弄清楚发生了什么。我再次尝试了我的应用程序,它运行到索引 102 直到它停止,此时我断开了设备的连接。我在Wireshark中挖掘了数据包,发现我的设备确实收到了102的数据,但它没有发送103的请求。我仔细检查了我的android日志,onCharacteristicWrite内部的一条Log语句说它发送了命令02 67 00,这是对 103 的请求。因此,似乎正在调用 onCharacteristicWrite,但实际上并未写入特征。

经过更多的凝视和思考,我很确定 1)onCharacteristicWrite 被不正确地调用,因为数据从未被写入,或者 2)不知何故,异步正在中断它并阻止它传输。我不知道会做什么。

最终编辑:

尽管据我从规范中了解,onCharacteristicWrite 只应该在可靠、成功的写入正在进行时被调用,但我决定检查 writeCharacteristic 的返回值。我应该在几个小时前检查一下。你知道吗,它在最后一个请求中返回 false。

我认为即使返回为 false 也调用 onCharacteristicWrite 的事实是一个错误。我读过使用 onCharacteristicWrite 调用来写入下一块数据是安全的。要么他们错了,要么这里发生了一些奇怪的事情。无论哪种方式,我想检查这些函数调用返回值是个好主意。

0 投票
1 回答
952 浏览

java - Android BLE:消息长度问题

我正在使用 BLE 开发一个 android 应用程序。此应用程序的要求是更新具有各种输入的特定硬件中的电压变化。

所以我将字符作为 8 位输入写入 BLE。每个位值都包含其自己的表示。硬件会根据每个请求做出响应并提供各种输出组合。输出包含 24 个字节的信息。每个字节位置代表不同的值。例如:位置 1 和 2 代表电流,3 和 4 代表电压等。我的问题是,我将输出分为 4 个部分。每条消息包含 6 个字节。是否有可能在一条消息中获得相同的信息?

执行

响应进入 Gatt 回调

用特征数据作为一个意图}

0 投票
0 回答
594 浏览

android - onCharacteristicChanged 被多次调用而不改变特征值

我正在开发一个 android 蓝牙低功耗应用程序,我在其中以单一特性从外围设备获取数据。我已经在onCharacteristicChanged方法内部启用了关于这个特征和过程特征值的通知。但是即使特征值没有改变,这个方法也会被多次调用。我将日志放入此方法中,并注意到程序至少进入此方法 4-5 次。我认为只有在特性值有更新时才会调用此方法。为什么会被多次调用?

0 投票
2 回答
2782 浏览

android - 排队 Android Gatt 操作

我制作了一个连接到 ble 设备并从中接收数据的应用程序。我在提示和观察部分关注了这个链接“ http://toastdroid.com/2014/09/22/android-bluetooth-low-energy-tutorial ”,它对所有 GATT 操作进行排队。我怎么做?

0 投票
0 回答
59 浏览

android - android ble停止工作?

我有一个连接到 ble 设备的 android 应用程序。当按下设备上的按钮时,设备会向应用程序发送数据。有时应用程序和设备显示它们已连接,但是当我按下设备上的按钮时,没有数据传输到手机。为什么会发生这种情况,我该如何解决?

0 投票
2 回答
11078 浏览

android - Android 停止查找 BLE 设备:onClientRegistered() - status=133 clientIf=0

我正在开发一个应用程序,我可以在其中找到和配置 BLE 设备。我正在使用标准的 Android BLE API,但最近我遇到了一些奇怪的问题。

当我打开我的应用程序时,BLE 扫描工作正常。我正在使用以下方式进行扫描:

在 Logcat 中,我收到以下消息(我想这对这个问题很重要):

在我的应用程序中,我还可以从我的 BLE 设备中读取某些特性(例如电池状态)。我使用以下方法连接到设备以在单独的片段中读取此特征:

特征被正确读取。在onCharacteristicRead回调中,我还断开并关闭 Gatt:

每次我打开一个片段来读取一个特性(无论它是否是同一个设备)clientIf值都会增加。我可以在 LogCat 中看到:

一切正常,直到clientIf值等于 10。BLE 扫描停止查找任何设备,我无法连接到我的任何设备以读取任何特征等。LogCat 无限显示这些消息:

修复它的唯一方法是杀死应用程序并重新启动它或通过手动关闭和打开蓝牙来重新启动蓝牙。我只在某些设备上遇到过这个问题,例如 Xperia Z1 (Android KitKat) 和 Galaxy S4 (Android Lollipop)。我无法在运行 Android Marshmallow 的 Xperia Z3 Compact 上重现此问题...

我能做些什么吗?我已经尝试了多种“解决方案”,例如 - 从 UI 线程调用所有 BLE 方法并关闭/断开 GATT,但没有任何帮助。我该如何解决?

0 投票
2 回答
6844 浏览

android - 从 BluetoothGattCharacteristic 读取失败

我试图读取存储在BluetoothGattCharacteristic. 以下是我的BluetoothGattCallback代码,大部分操作都在其中发生:

因此,要从特征中读取,我正在尝试使用该gatt.readCharacteristic()方法,该方法采用特征并返回一个指示操作成功与否的布尔值。在这里,这个方法正在返回false(打印“res was false”),表明它失败了。

没有打印错误消息。阅读特征的正确方法是什么?为什么这个方法会返回false

编辑: 按照 Inferno 的建议,继续下载所需的源代码,然后在BluetoothGatt readCharacteristic()方法中设置断点:

这是readCharacteristic()android-23..\BluetoothGatt 中的方法

(characteristic.getProperties() & BluetoothGattCharacteristic.PROPERTY_READ)正在返回 0,因此false立即返回。现在根据调试器characteristic.getProperties()返回的值是8,而BluetoothGattCharacteristic.PROPERTY_READ静态 int 值是0x02

据我了解,0x08 & 0x02== 0。由于PROPERTY_READ是硬编码的值,我认为从characteristic.getProperties(). 这里可能出了什么问题?