我有一个适用于iOS/Android的Cordova应用程序。 该应用程序的Javascript由网络服务器提供,这当然使应用程序的更新非常容易 - 除非是对Cordova插件的更改,否则不会发布AppStore。
现在, 该应用程序以几种不同的方式使用 BLE.
- BLE信标
- BLE温度探头
- 直视线pH探头
- 其他BLE设备 - 未来发展
以上每个本质上都是我开发的 Cordova BLE 插件的"迷你"客户端 - 我不能使用 cordova-bluetooth-serial ,因为这个插件只允许 1 个 Javascript 客户端。
苹果
在iOS下,解决方案很简单,因为应用程序可以根据需要创建任意数量的CBCentralManager实例,并且在后台iOS会将这些请求"合并"到硬件,因此我的"BLE信标"Javascript创建了一个新的"蓝牙扫描仪"对象,该对象在iOS中创建CBCentralManager,它可以执行扫描并获取信标的广告数据包(仅限Eddystone, 它不会看到iBeacon,因为iOS将这些转移到CoreLocation - 我离题了)
人造人
在Android下,我希望一旦我通过以下方式获得蓝牙适配器单例实例
_bluetoothAdapter = bluetoothManager.getAdapter();
那个召唤
_scanner = _bluetoothAdapter.getBluetoothLeScanner();
也会返回一个新实例,但它不会返回一个单例实例,这意味着我不能像 iOS 支持的那样让单独的"迷你"客户端每个执行自己的扫描(使用自己的 ServiceUUID 过滤器)。
所以,我的问题是 - 有没有办法为每个"迷你"客户端动态创建一个服务,希望这些服务能够获得自己的蓝牙LeScanner?
我想在Android应用程序之间,他们每个人都有自己的蓝牙LeScanner单例实例,所以希望服务也会。
坦率地说,我还没有完全跨越Android进程空间,所以不明白这是否可能。
如果没有,那么我将不得不自己"虚拟化"蓝牙LeScanner,因此使用单例实例,我将不得不将来自"迷你"客户端的扫描请求合并到符合所有"迷你"客户端要求的请求中,并可能动态过滤广告到"迷你"客户端。
任何帮助非常感谢。
我不确定它是否是单例会有什么不同,但蓝牙LeScanner是一个单例,只需在 https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/bluetooth/BluetoothAdapter.java 查看源代码即可。
您当然也可以同时创建多个扫描仪,就像iOS一样。只需每次使用不同的 scanCallback 对象调用 startScan。