Articles of android bluetooth

蓝牙LE ScanFilters无法在Android M上运行

以下代码适用于运行Android 5.1.1(Build LMY48M)的Nexus 9,但不适用于运行Android 6.0的Nexus 9(Build MPA44l) List filters = new ArrayList(); ScanSettings settings = (new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER)).build(); ScanFilter.Builder builder = new ScanFilter.Builder(); builder.setManufacturerData((int) 0x0118, new byte[]{(byte) 0xbe, (byte) 0xac}, new byte[]{(byte) 0xff, (byte)0xff}); ScanFilter scanFilter = builder.build(); filters.add(scanFilter); mBluetoothLeScanner.startScan(filters, settings, new ScanCallback() { … }); 在Android 5.x上,当看到与扫描filter匹配的制造商广告时,上述代码产生回调。 (参见下面的示例Logcat输出。)在带有MPA44l的Nexus 9上,没有收到回调。 如果您注释掉扫描filter,则会在Nexus 9上成功收到回叫。 09-22 00:07:28.050 1748-1796/org.altbeacon.beaconreference D/BluetoothLeScanner﹕ […]

Android上的蓝牙低功耗专用与公共地址

蓝牙低功耗设备由其地址唯一标识(在Android API中,他们将其称为MAC地址,并将其表示为冒号分隔的hex值,例如11:aa:22:bb:33:cc)。 但要唯一识别BLE地址,您需要知道它是公共地址还是私人地址。 实质上,识别地址需要49位,而不是48位。 随机地址可以是静态随机地址,不可解析私有地址或可解析私有地址,这些types在两个最重要的字节(分别为11,00和10)中由位模式分隔。 但是我没有看到只要通过查看地址中的48位就可以将公共地址和随机地址分开的任何地方。 那么这在Android API中如何运作? 当他们不知道您指定的地址是公开的还是随机的时,他们如何知道要连接的设备? 有问题的API例如是getRemoteDevice函数。 它说: Valid Bluetooth hardware addresses must be upper case, in a format such as “00:11:22:33:AA:BB”. The helper checkBluetoothAddress(String) is available to validate a Bluetooth address. A BluetoothDevice will always be returned for a valid hardware address, even if this adapter has never seen that device. […]

Android蓝牙和WakeLock关系

我正在开发一个在后台运行的Android应用程序,并支持蓝牙配件。 我想在后台不断收听蓝牙设备尝试打开手机sockets。 我的问题是,是否有可能在不经常保留部分唤醒锁的情况下实现这一点,因为这显然会产生严重的电池后果。 所以我想知道的是蓝牙对手机入睡的影响。 打开蓝牙sockets时手机是否保持清醒状态? 如果设备尝试连接,蓝牙芯片是否会自动唤醒Android? 我试图做一些测试来回答这些问题,但很难分清唤醒锁的发生情况; 此外,我不知道我是否可以依赖于我观察到的行为或者是否可以在其他设备上进行更改。

如何确定Android设备是否支持蓝牙低功耗

似乎Nexus 7第一代不支持蓝牙低功耗,至少当我从教程中完全按照步骤进行操作时 http://developer.android.com/guide/topics/connectivity/bluetooth-le.html 我有以下代码的应用程序完成: if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { Toast.makeText(this, R.string.ble_not_supported, Toast.LENGTH_SHORT).show(); finish(); } 当然,我检查,蓝牙启用。 所以问题是,如何确定设备是否支持蓝牙低功耗标准? 更新:我正在使用android 4.3

如何检测BLE设备何时不在范围内?

我使用LeScanCallback(不能使用更新的扫描方法,因为我正在开发api 18.并不重要,因为android 5.0+ apis也不提供此function)来检测何时检测到附近的BLE设备: private BluetoothAdapter.LeScanCallback bleCallback = new BluetoothAdapter.LeScanCallback() { @Override public void onLeScan(BluetoothDevice bluetoothDevice, int i, byte[] bytes) { discoveredDevices.add(bluetoothDevice); } }; 我没有与设备配对或连接,因为这不是必需的,我只是想看看附近有哪些设备。 我正在尝试提供一项服务,每隔5分钟左右,就会调用一个网络服务器来更新当时附近的设备。 棘手的部分是Android设备将移动,所以现在附近的蓝牙设备可能不会在5分钟内。 在这种情况下,我需要从discoveredDevices删除它。 理想情况下,我希望在蓝牙设备处于范围之前接收回调,但现在不再。 但是这个回调不存在。 (我知道android.bluetooth.device.action.ACL_CONNECTED和android.bluetooth.device.action.ACL_DISCONNECTED广播,但是当你连接到蓝牙设备时,这些是我不想要的。) 一个选项是每隔5分钟进行一次新扫描,但是你无法判断所有附近的设备何时被发现,所以你必须进行定时扫描,例如扫描5秒,然后将收集的数据发送到网络服务。 这听起来很脏并且有风险,因为您无法确定所有附近的设备是否在规定的时间内被发现,因此我非常希望避免这样做。 还有另一种方法吗? 编辑 一些设备不断报告附近蓝牙设备的发现,即使它们之前已经被发现过。 如果该function是通用的,我可以解决我的问题,但这是特定于设备的。 例如,我的手机的蓝牙适配器仅发现附近的设备一次。 我测试过的其他一些设备不断报告相同的附近设备,但不是所有设备都这样,所以我不能不依赖它。

Android BLE,读写特性

我目前正在开发Android BLE,并且在Android BLE堆栈中遇到很多问题.. 我的开发工具是三星Galaxy J和Android 4.3。 我想知道如何从BLE中读取特征并写入特征(就像我validation了我收到的数据,然后我使用BLE发送另一个数据) 我有严重的问题了解Android BLE回调如何工作,我不明白这5个function……而且手册不清楚,任何人都可以用简单的forms解释好的灵魂??? onCharacteristicWrite onCharacteristicRead onCharacteristicChanged onDescriptorRead onDescriptorWrite 我目前的情况是,我设法读取onCharacteristicChanged()回调中的数据,然后我validation了收到的数据我试图通过使用发送数据 characteristics.setValue(data) gatt.writeCharacteristic(characteristics) 但是,Android BLE堆栈没有调用onCharacteristicsWrite(),事实上,Android只是挂在那里.. 我尝试谷歌关于Android BLE,没有太多的信息,只有一堆抱怨BLE堆栈是多么不稳定……

蓝牙未连接4.4.2

我有一个蓝牙设备已连接到我在4.4.2之前尝试的所有Android版本。 现在,它没有连接Galaxy Tab 4或S3。 Tab 3与4.1.2连接良好。 尝试初始化BluetoothSocket时,似乎在AcceptThread出现此问题。 我正在使用的代码基于sdk中的聊天示例。 我的接受代码 private class AcceptThread extends Thread { // The local server socket private BluetoothServerSocket mmServerSocket; public boolean successInit = false; public AcceptThread() { closeAllConnections(); BluetoothServerSocket tmp = null; // Create a new listening server socket while(!successInit) { try { tmp = mAdapter.listenUsingRfcommWithServiceRecord(NAME, MY_UUID); successInit= true; Log.i(“TAG”, “Socket […]

通过蓝牙将多个设备连接到一个设备

我想创建一个游戏,您必须通过蓝牙将多个设备(4+)连接到主设备(例如平板电脑)。 将有两个应用程序,一个主要的应用程序将所有数据从手机发送到手机。 这有可能吗?

Android 4.3:BLE:startLeScan()的过滤行为

我正在开发一个蓝牙传感器设备,我需要对其进行一对多的数据广播。 根据规范,外设可能只有一个主机,由于我设计的芯片和堆栈的限制,主机只能有三个从机。 据我所知,Android无论如何都不能成为BLE奴隶,因此将我的设备作为主人不是一种选择。 BT4规范和制造商文档都讨论了另一种操作模式,称为广播模式。 在广播模式中,永远不会建立连接,并且应用数据作为广告包的一部分被发送。 这完全符合我的需求,因为许多Android / iOS手机可以同时扫描每个数据包。 广告数据包以突发方式多次传输,因此我怀疑数据接收最可靠。 如果数据包在此处丢失,则可以容忍。 这有趣的是,我希望这些数据包携带实时传感器数据,以10-20Hz的速率更新。 从我在网上find的例子来看,这种模式下的BLE主要用于“iBeacon”types的实现,它们在那里广播静态数据。 我找不到有关如何在Android堆栈中过滤广告数据包的任何信息。 它可能是每个蓝牙硬件地址返回一个结果,或者它可能是地址和数据的唯一组合。 第二个选项适用于此应用程序。 如果启动和停止扫描重置filter,我也可以做一些工作。 Android文档没有提及扫描方法中的设备过滤如何工作。 我已经能够在网上find一个试图解决同样问题的post,它有一个未解决的响应: BLE:在扫描过程中多次发现同一个外设 。 在iOS中,我的同事通知我,有一个参数可以传递给扫描function,使其成为可能。 我试图从Android源代码中的startLeScan()调用回溯代码,但代码非常复杂,并且使用抽象使得很难识别包含它的对象的实现。 我得到的最远的是从BluetoothManagerService类方法getBluetoothGatt()返回的IBluetoothGatt对象。 该对象接收开始扫描的请求。 它正在github上的当前版本上的BluetoothManagerService.java的第790行进行实例化。 该对象是从消息的结果转换而来的,所以我怀疑结果可能是电话/驱动程序特定的。 能够进一步追踪它是我的专业知识。 我想解决的另一个问题是可以快速打开和关闭扫描。 扫描是一项功耗密集型操作,但数据广播将在相当精确的实时计时器上定期发生。 因此,如果可以打开和关闭扫描,这将是一个很好的优化,使得广播和扫描同步,扫描仪关闭其他90%以上的时间。 这可能需要通过实验进行测试。 我还在进行可行性研究,看看我们的Android配件是否可行。 我目前的手机还没有运行4.3版,所以我无法通过实验测试/黑客攻击。

Android 4.4.4 Moto G蓝牙LE重新连接问题

我有一个应用程序,在运行Android 4.3的三星S3上效果很好,但是我在运行4.4.4的Moto G上遇到了问题 我的BLE外围设备在应用程序使用期间连接和断开多次。 这工作正常,但有时有一个点,应用程序/手机不再重新连接到外设。 所有的gatt命令都在主线程上运行,例如。 final BluetoothGatt gat = gatt; Handler handler = new Handler(Looper.getMainLooper()); handler.post(new Runnable() { @Override public void run() { // This code will be executed on the main thread if (Looper.myLooper() == Looper.getMainLooper()) { Log.e(TAG, "mGattCallback disconnect2: NOW ON MAIN THREAD :)"); } gat.disconnect(); } }); 和外设断开罚款。 当发生这种情况,我不能重新连接到外设了,我得到这样的日志负载: 04-07 16:57:56.798: […]