0

我有一个适用于 iOS/Android 的 Cordova 应用程序。应用程序的 Javascript 由网络服务器提供服务,这当然使应用程序的更新非常容易 - 除非是对 Cordova 插件的更改,否则不会发布 AppStore。

现在,该应用程序以几种不同的方式使用 BLE。

  1. BLE信标
  2. BLE 温度探头
  3. BLE pH 探头
  4. 其他 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,因此使用单例实例我将不得不将来自“迷你”客户端的扫描请求合并为匹配所有“迷你”客户端要求的请求,并可能过滤广告即时发送给“迷你”客户。

非常感谢任何帮助。

4

1 回答 1

2

我不确定它是否是单例,但BluetoothLeScanner 是单例,请参阅https://android.googlesource.com/platform/frameworks/base/+/的源代码主/核心/java/android/bluetooth/BluetoothAdapter.java

您当然也可以同时创建多个扫描仪,就像 iOS 一样。每次只需使用不同的 scanCallback 对象调用 startScan 即可。

于 2018-02-01T09:05:05.047 回答