相关疑难解决方法(0)

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

我正在开发一种蓝牙传感器设备,我需要对其进行一对多的数据广播.根据规范,外设可能只有一个主机,由于我正在设计的芯片和堆栈的限制,主机只能有三个从机.据我所知,Android无论如何都不能成为BLE奴隶,因此将我的设备作为主人不是一种选择.

BT4规范和制造商文档都讨论了另一种操作模式,称为广播模式.在广播模式中,从不进行连接,并且应用数据作为广告包的一部分被发送.这完全符合我的需求,因为许多Android/iOS手机可以同时扫描每个数据包.广告数据包以突发方式多次传输,因此我怀疑数据接收最可靠.如果数据包在此处丢失,则可以容忍.

这有趣的是,我希望这些数据包携带实时传感器数据,以10-20Hz的速率更新.从我在网上找到的例子来看,这种模式下的BLE主要用于"iBeacon"类型的实现,它们在那里广播静态数据.我找不到有关如何在Android堆栈中过滤广告数据包的任何信息.它可能是每个蓝牙硬件地址返回一个结果,或者它可能是地址和数据的唯一组合.第二个选项适用于此应用程序.如果启动和停止扫描重置过滤器,我也可以做一些工作.

Android文档没有提及扫描方法中的设备过滤如何工作.我已经能够在网上找到一个试图解决同样问题的帖子,它有一个未解决的响应:BLE:在扫描期间多次发现相同的外设.在iOS中,我的同事通知我,有一个参数可以传递给扫描功能,使其成为可能.

我试图从Android源代码中的startLeScan()调用回溯代码,但是代码非常复杂,并且使用抽象使得很难识别包含它的对象的实现.我得到的最远的是从BluetoothManagerService类方法getBluetoothGatt()返回的IBluetoothGatt对象.该对象接收开始扫描的请求.它正在当前版本的github上的BluetoothManagerService.java的第790行进行实例化.该对象是从消息的结果转换而来的,所以我怀疑结果可能是电话/驱动程序特定的.能够进一步追踪它是我的专长.

我想解决的另一个问题是如何快速打开和关闭扫描.扫描是一项功耗密集型操作,但数据广播将在相当精确的实时计时器上定期进行.因此,如果可以打开和关闭扫描,这将是一个很好的优化,使得广播和扫描同步,扫描仪关闭其他90%以上的时间.这可能需要通过实验进行测试.

我还在进行可行性研究,看看我们的Android配件是否可行.我现在的手机还没有运行4.3版,所以我无法通过实验测试/黑客攻击.

android android-sensors bluetooth-lowenergy android-bluetooth

27
推荐指数
5
解决办法
2万
查看次数

Android BLE连接时间间隔

我正在使用Android BLE API在Nexus 4上开发BLE应用程序.我有几个疑问/疑惑:

1)有没有办法设置/覆盖BLE中央设备的连接或通知间隔.我发现对于Android,默认连接间隔固定为7.5毫秒.有没有办法更改此连接/通知延迟间隔设置.

资料来源:http://processors.wiki.ti.com/index.php/Bluetooth_SensorTag?DCMP = lprf-stdroid&HQS = lprf-stdroid-pr-wiki1 #Supported_Android_devices

2)在连接到远程设备时,我面临着在随机时间间隔之后断开连接的问题.有许多人面临连接丢弃问题,说明当Android使用Android 4.3 API进行BLE连接时,android是不稳定的.这有什么解决方案吗?

编辑

我在这里观察到的另一个问题是,当需要时间重新连接时,它会随着一些L2CAP日志而来......跟随日志

Trying to create a new connection laststate_ BOND_NONE
D/BluetoothGatt( 9620): connect() - device: 1C:BA:81:11:CA:36, auto: true
D/BluetoothGatt( 9620): registerApp()
D/BluetoothGatt( 9620): registerApp() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510
D/BtGatt.GattService( 3208): registerClient() - UUID=1adsds0911-4sdsc-41dc-8ac0-0sdsdf550510
D/BtGatt.btif( 3208): btif_gattc_register_app
D/BtGatt.btif( 3208): btgattc_handle_event: Event 1000
D/BtGatt.btif( 3208): btif_gattc_upstreams_evt: Event 0
D/BtGatt.GattService( 3208): onClientRegistered() - UUID=1a9a0911-4d5c-41dc-8ac0-0284ef550510, clientIf=5
D/BluetoothGatt( 9620): onClientRegistered() - status=0 clientIf=5
D/BtGatt.GattService( 3208): clientConnect() - address=1C:BA:8C:1E:CA:36, isDirect=true
D/BtGatt.btif( …
Run Code Online (Sandbox Code Playgroud)

android connection-pooling l2cap bluetooth-lowenergy

27
推荐指数
4
解决办法
4万
查看次数