我有一个适用于 iOS/Android 的 Cordova 应用程序。应用程序的 Javascript 由网络服务器提供服务,这当然使应用程序的更新非常容易 - 除非是对 Cordova 插件的更改,否则不会发布 AppStore。
现在,该应用程序以几种不同的方式使用 BLE。
- BLE信标
- BLE 温度探头
- BLE pH 探头
- 其他 BLE 设备 - 未来发展
以上每个本质上都是我开发的 Cordova BLE 插件的“迷你”客户端 - 我不能使用 cordova-bluetooth-serial 因为这个插件只允许 1 个 Javascript 客户端。
iOS
在 iOS 下,解决方案很简单,因为应用程序可以根据需要创建尽可能多的 CBCentralManager 实例,并且在内部,iOS 会将这些请求“合并”到硬件,因此我的“BLE Beacons”Javascript 创建了一个新的“BluetoothScanner”对象,该对象在 iOS 中创建一个 CBCentralManager,它可以执行扫描并获取信标的广告数据包(仅限 Eddystone,它不会看到 iBeacon,因为 iOS 将这些转移到 CoreLocation - 我离题了)
安卓
在Android下,我希望一旦我通过以下方式获得了BluetoothAdapter单例实例
_bluetoothAdapter = bluetoothManager.getAdapter();
那个呼唤
_scanner = _bluetoothAdapter.getBluetoothLeScanner();
也会返回一个新实例,但它不会返回一个 Singleton 实例,这意味着我不能让单独的“迷你”客户端每个执行自己的扫描(使用自己的 ServiceUUID 过滤器),就像 iOS 支持的那样。
所以,我的问题是 - 有没有一种方法可以为每个“迷你”客户端动态创建一个服务,希望这些服务能够获得自己的 BluetoothLeScanner ?
我想在 Android 应用程序之间,他们每个人都有自己的 BluetoothLeScanner 单例实例,所以希望服务也能。
坦率地说,我并不完全了解 Android 进程空间,所以不知道这是否可能。
如果没有,那么我将不得不自己“虚拟化”BluetoothLeScanner,因此使用单例实例我将不得不将来自“迷你”客户端的扫描请求合并为匹配所有“迷你”客户端要求的请求,并可能过滤广告即时发送给“迷你”客户。
非常感谢任何帮助。