Articles of bluetooth lowenergy

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堆栈是多么不稳定……

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+上的BLE设备配对

有没有人有一个完整的工作示例,说明如何以编程方式与在Android 4.4或更高版本上使用密码输入(即6位数PIN)或数字比较的BLE( 非蓝牙经典)设备配对? 通过’以编程方式’我的意思是我告诉Android PIN – 用户不会被提示。 在SO上有很多类似的问题,但它们要么a)关于Bluetooth Classic,b)old(在setPin()和createBond()是公开的),或者c)没有答案。 我的理解如下。 您连接到设备并发现其服务。 您尝试阅读“受保护”特征。 设备返回身份validation错误。 Android以某种方式启动配对,你告诉它PIN。 您现在可以阅读该特征。 我已经使用在nRF51-DK上运行的mBed创建了一个设备,并赋予它一个特性。 我设置了安全参数,如下所示: ble.securityManager().init( true, // Enable bonding (though I don’t really need this) true, // Require MitM protection. I assume you don’t get a PIN prompt without this, though I’m not 100% sure. SecurityManager::IO_CAPS_DISPLAY_ONLY, // This makes it us the […]

android ble慢慢连接

嗨,我正在编写一个Android应用程序来连接到BLE外围设备。 Android 4.4.2,Galaxy Nexus。 我在设备上有一个LED指示连接状态。 问题是从connectGatt()调用到接收onConnectionStateChange的持续时间STATE_CONNECTED的持续时间是如此不一致。 有时候它很快,但大部分时间需要5秒或更长时间。 关闭/打开蓝牙没有任何影响。 我在PC上使用TI BLE Dongle尝试了TI BTool ,它总是能够非常快速地建立连接。 我也尝试使用iPhone 5S,速度也很快。 任何人都遇到过这个问题吗? 我们有机会改善这个吗?

Android 4.0中的蓝牙智能(4.0)/ GATT支持?

我正试图find使用现代Android智能手机的蓝牙4.0(AKA蓝牙智能)设备的方法,即 – HTC One V. 据我所知,由于API限制,即使在带有蓝牙4.0硬件的Android 4.0中也存在使用GATT配置文件的一些问题。 我看到摩托罗拉发布了自己的BT LE API,但不确定它是否适用于其他厂商。 我的目标是通过适当的硬件为所有智能手机提供普遍支持。 任何解决方案的建议都非常感谢。 阿列克谢 PS:是的,我看过用于HDP的Android API,但它似乎只用于’经典’蓝牙设备(不像BT LE那样低功耗)。

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: […]

Android蓝牙接受()/连接()与已配对的设备

我无法通过蓝牙连接两个Android设备,只有在配对之前才会发生这种情况。 我正在运行一个作为服务器,另一个作为客户端。 这里是服务器端的一系列事情: 检查各种蓝牙状态(适配器可用,已启用等)。 使用我select的预定义的UUID调用listenUsingRfcommWithServiceRecord()。 请求使设备可发现 由于可被发现asynchronous发生,我调用accept()并等待传入​​的连接。 在客户端: 检查各种蓝牙状态(适配器可用,已启用等)。 对于getBondedDevices()中的每个设备,我将getName()与服务器名称进行比较。 如果有匹配,请跳到步骤6。 开始BT发现 对于每个发现的设备(请注意,来自2a的配对设备不会在此显示),请将设备名称与服务器名称进行比较。 如果有匹配,请转到步骤6。 取消发现 在步骤2中find的设备上,使用与服务器端使用的相同的预定义UUID调用createRfcommSocketToServiceRecord()。 调用connect()并等待它返回一个连接的套接字。 当客户端和服务器从未配对过时,上述过程对我来说工作得非常好。 但是,在Android注册到设备列表后,它们将不可避免地在connect()/ accept()阶段超时。 我一直在寻找一个解决scheme几天,并尝试了很多东西,包括这一个: 连接到已经配对的蓝牙设备 reflection方法也不适用于我。 看起来connect()会立即返回,但是当我尝试getOutputStream()时,我得到一个exception。 在accept()方面,它甚至不logging有人试图连接。 我认真地需要一些帮助或指示,让设备build立连接,一旦他们以前配对。 这里是关于设备的一些信息: 我正在testing两台LG G2X手机上的服务器和客户端。 他们两个都运行在Android 2.3.3上,对应于API级别10。 再次,上述工作后我手动解除设备设置。 提前谢谢你。 我在Android和蓝牙上大概有两个星期的时间,所以如果你看到任何缺失的步骤或最佳做法,请将它们指出来。

Android BLE近距离通知

我一直在开发一个与BLE设备交互的应用程序。 一切都很好,我可以扫描,连接和使用服务。 我一直在阅读所有的文档,我没有看到任何让开发者select收听BLE设备的选项。 基本上我想在设备进入BLE设备的范围时触发广播接收机。 我知道我可以不断地扫描这个,但电池使用太高,我希望这个被调用,即使当我的应用程序不被使用。 这个function是不支持的还是我错过了讨论这个文档的一部分?

在Nexus 4上使用Android 4.3进行低功耗蓝牙服务发现

我试图用我的nexus 4(android 4.3)使用BLE模块(bluegiga BLE112)。 我可以连接,获取设备的名称,连接到GATT,但服务发现失败。 以下是如何做最初的gatt连接(似乎成功工作: dev.connectGatt(getBaseContext(), true, btGattCB); 这是GATTcallback: private BluetoothGattCallback btGattCB = new BluetoothGattCallback() { @Override public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) { super.onConnectionStateChange(gatt, status, newState); if(newState == BluetoothProfile.STATE_CONNECTED){ Log.i(TAG, "Gatt Connected"); gatt.discoverServices(); } else if(newState == BluetoothProfile.STATE_DISCONNECTED){ Log.i(TAG, "Gatt Disconnected"); } } @Override public void onServicesDiscovered(BluetoothGatt gatt, int status){ Log.i(TAG,"Status […]

让三星Android设备作为iBeacon做广告

有没有人使用三星的蓝牙LE API作为一个iBeacon三星Android设备做广告? 这应该是可能的,但我没有访问设备来尝试它。 如果有人用三星Android设备作为任何其他蓝牙LE外设做广告,我也想知道。 编辑:这是现在Android L上可能。请参阅这里。