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

时间:2015-06-08 11:01:22

标签: meteor bluetooth-lowenergy cordova-plugins

我正在尝试使用Meteor和此Cordova插件 - https://github.com/don/cordova-plugin-ble-central - 使用meteor add cordova添加到我的项目中,以便连接到蓝牙LE设备(TI Sensortag)。我想要做的就是,当点击链接时,连接到设备并显示消息。

我的模板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;
                });
            });
        }
    }
});

我的问题是,有时代码有效并且我得到了“连接成功”警报,但更多时候它无法连接并显示“连接失败”警报。在成功和失败回调中添加return语句之前,它根本不起作用。

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

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

1 个答案:

答案 0 :(得分:5)

对于遇到类似问题的人来说,这就是为我排序的原因。我将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.connectble.scan会导致Android代码中的LinkedHashMap填充任何已发现的设备。只有在LinkedHashMap中列出设备后,您才可以使用ble.connect连接到该设备。