我正在研究一个蓝牙传感器设备,我需要形成一对一的数据广播。根据规范,外设可能只有一个主器件,并且由于我正在设计的芯片和堆栈的限制,主器件只能有三个从器件。从我的理解来看,Android无法成为BLE从属,所以让我的设备成为主人不是一个选择。
BT4规格和制造商文档都谈论另一种操作模式,简称广播模式。在广播模式下,从不进行连接,应用数据作为广告分组的一部分被发送。这将完全符合我的需求,因为许多Android / iOS手机可以同时扫描每个数据包。广告分组以突发方式多次发送,所以我怀疑数据的接收几乎是可靠的。如果一个数据包在这里和那里丢失,可以容忍。
在哪里有趣的是,我想要这些数据包携带现场传感器数据,以10-20Hz的速度更新。从我在网络上发现的例子中,BLE在这种模式下主要用于“iBeacon”类型的实现,它们正在广播静态数据。我没有找到关于如何在Android堆栈中过滤广告数据包的任何信息。它可能是每个蓝牙硬件地址返回一个结果,或者它可以是地址和数据的独特组合。第二个选项将适用于此应用程序。如果启动和停止扫描重置过滤器,我也可以做一些工作。
Android文档不提供扫描方法中的设备过滤如何工作。我已经能够找到一个网站上的一个帖子,试图解决这个同样的问题,这有一个未解决的回应:BLE: Multiple discovery of the same peripheral during scan.在iOS中,我的同事告诉我,有一个参数可以传递给扫描功能,使这个可能。
我试图从Android源代码中的startLeScan()调用中跟踪代码,但代码是相当复杂的,使用抽象使得很难识别包含它的对象的实现。我得到的最远的是从BluetoothManagerService类方法getBluetoothGatt()返回的IBluetoothGatt对象。该对象接收到开始扫描的请求。目前正在github上进行修改,正在实施。该对象正在从一个消息的结果中转移,所以我怀疑可能是电话/驱动程序的结果。能够进一步追踪它超出我的专长。
我想解决的另一个问题是扫描可以快速打开和关闭。扫描是功率密集的操作,但是数据的广播将在相当精确的实时定时器周期性地发生。因此,如果可以打开和关闭扫描,使广播和扫描同步,扫描仪将在90%的时间内关闭扫描,这将是一个很好的优化。这可能需要通过实验测试。
我还在进行可行性研究,看看我们的Android配件是否可行。我现在的手机还没有运行4.3版本,所以我没有办法通过实验测试/骇客。