如何使用 Meteor 和 Cordova BLE 插件连接到 BLE 设备

How do I use Meteor and a Cordova BLE plugin to connect to a BLE device

我正在尝试使用 Meteor 和这个 Cordova 插件 -https://github.com/don/cordova-plugin-ble-central - 使用 meteor add cordova 添加到我的项目以连接到蓝牙 LE 设备 (TI Sensortag)。我首先要做的是,当单击 link 时,连接到设备并显示一条消息。

我的模板 javascript 的 events 部分中有以下代码。

Template.measure.events({'click [data-action=scan-connect-stream]':
  function(event, template) {
    event.preventDefault();
    if (Meteor.isCordova) {
      Meteor.startup(function () {
          ble.connect('24:09:00:DE:00:42', 
                function(){
                    alert('Connect success');
                    return;
                }, 
                function(){
                    alert('Connect failed');
                    return;
                });
            });
        }
    }
});

我的问题是,有时代码可以运行,我会收到 'Connect success' 警报,但更多时候它无法连接并显示 'Connect failed' 警报。在我在成功和失败回调中添加 return 语句之前,它根本不起作用。

我正在 android 设备 (meteor run android-device --verbose) 上调试它,可以通过 adb logcat 看到 Cordova 插件中的 BLE Con​​nect 事件正在触发,但随后没有触发连接。我在两部不同的手机上调试时遇到了同样的问题,并且在使用不是 TI Sensortag 的 BLE 设备时,所以我猜这是插件与 Meteor 交互方式的问题(也许 Meteor 等待的时间不够长成功回调?)。

有没有人在 Meteor 上成功使用过这个插件,或者谁能提供任何关于我做错了什么的线索?我应该尝试将它包装在一个 Meteor 包中,还是有什么方法可以让插件有更多时间在成功或失败回调触发之前做出响应?任何帮助将不胜感激!

对于遇到类似问题的任何人,这就是为我解决的问题。我将 ble.connect 调用放入 ble.scan 函数的成功回调中。不知道为什么,但先扫描几秒钟就可以了。

  Template.measure.events({
    'click [data-action=scan-connect-stream]': function(event, template) {
      event.preventDefault();
      if (Meteor.isCordova) {
        Meteor.startup(function () {
          device_id = '24:09:00:DE:00:42';
          ble.scan([], 5,
              function(peripherals){
                connectDevice(device_id);
              },
              function(){
                 alert('No devices found');
              }
            );
        });
      }
    }
  });


  var connectDevice = function (device_id) {
        ble.connect(device_id,
                        function(){
                          alert('Device ' + device_id + ' connnected');
                          },
                        function(){
                          alert('Couldn\'t connect to device ' + device_id);
                          });
  }

如果有人能解释为什么 ble.connect 不能单独工作,那就太好了!

编辑:查看 Android 代码,插件的设计方式似乎是 ble.scan 必须在调用 ble.connect 之前调用。 ble.scan 导致 Android 代码中的 LinkedHashMap 填充任何已发现的设备。只有在 LinkedHashMap 中列出设备后,您才能使用 ble.connect.

连接到它