我正在尝试使用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 Connect事件正在触发,但之后无法连接。我在两个不同的手机上调试同样的问题,当使用不是TI Sensortag的BLE设备时,我猜这是插件与Meteor交互方式的问题(也许流星不等待足够长的时间)成功回调?)。
有没有人使用过这个插件成功使用Meteor,或者任何人都可以提供任何关于我做错的线索?我应该尝试将它包装在Meteor包中,还是有任何方法可以让我们在成功或失败回调之前给插件更多时间做出响应?任何帮助将不胜感激!
答案 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.connect
。 ble.scan
会导致Android代码中的LinkedHashMap
填充任何已发现的设备。只有在LinkedHashMap
中列出设备后,您才可以使用ble.connect
连接到该设备。