2015-06-08 141 views
2

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

我在我的模板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包中,或者有什么方法可以让插件有更多时间在成功或失败回调之前响应?任何帮助将非常感激!

回答

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.connect之前调用。 ble.scan导致Android代码中的LinkedHashMap被填充了任何发现的设备。只有设备在LinkedHashMap中列出后,才能使用ble.connect连接到设备。