Я создаю приложение с использованием Cordova, которое использует найденную библиотеку ng-cordova-bluetoothle
здесь .
У меня две основные функции:
function isRunning(){
return bleReadisRunning()
.then (function(response){
response = atob(response.value);
debugWrite("Response@isRunning: " + response + "\n");
if(response.status){
// Do nothing
} else{
// Stop the loop
}
return response;
})
.catch( function(error){
console.log("isRunning");
});
}
function getTemp(){
return bleReadgetTemp()
.then (function(response){
response = atob(response.value);
debugWrite("Response@getTemp: " + response + "\n");
if(response.status){
// Do nothing
} else {
// Stop the loop :p
}
return response;
})
.catch( function(error){
console.log("getTemp");
})
}
Я пытался выполнять эти две функции непрерывно с определенным интервалом времени.По этой причине я использовал сервис $interval
от angularJS и написал следующий код:
vm.startExperimentLoop = function() {
vm.myCall = $interval( loop, 5000);
};
vm.apiStop = function(){
$interval.cancel(vm.myCall);
}
Сначала я попытался использовать только isRunning()
в функции loop()
, такой как:
function loop(){
isRunning();
}
После тестирования все заработало как положено.Звонок isRunning()
происходил каждые 5 секунд.Но если я изменяю функцию loop()
и заставляю ее запускать getTemp()
, кажется, что этот интервал в 5 секунд не сохраняется, и getTemp()
вызывается непрерывно.
Здесь также находятся *Функции 1024 * и bleReadgetTemp()
.
function bleReadisRunning(){
var service_id = '12ab';
var characteristic_id = '32cd';
var params = {
address: $stateParams.address,
service: service_id,
characteristic: characteristic_id,
};
return $cordovaBluetoothLE.read(params);
}
function bleReadgetTemp(){
var service_id = '12ab';
var characteristic_id = '31cd';
var params = {
address: $stateParams.address,
service: service_id,
characteristic: characteristic_id,
};
return $cordovaBluetoothLE.read(params);
}
Код кажется мне почти одинаковым, и я не могу понять, в чем проблема.
PS: я не знаю, помогает ли это, но я использую библиотеки nodeJS
и bleno
для настройки моего периферийного устройства.Ниже приводится способ настройки двух характеристик, но, опять же, я не могу найти какой-либо большой разницы, которая могла бы объяснить проблему с помощью $interval
.
// IS RUNNING CHARACTERISTIC
new bleno.Characteristic({
value: null,
uuid: settings.is_running_characteristic_id,
properties: ['read'],
onReadRequest: function(offset, callback){
isExperimentRunning()
.then( (res) => {
var buffer = Buffer.from( JSON.stringify(res) );
callback(this.RESULT_SUCCESS, buffer);
})
}
}),
// GET TEMP CHARACTERISTIC
new bleno.Characteristic({
value:null,
uuid: settings.get_temp_characteristic_id,
properties: ['read'],
onReadRequest: function(offset, callback){
getTemp()
.then( (res) => {
var buffer = Buffer.from( JSON.stringify(res) );
callback(this.RESULT_SUCCESS, buffer);
})
}
})
РЕДАКТИРОВАТЬ:
Я нашел что-то, но не уверен, почему это происходит.
Так что на стороне nodeJS в функции getTemp()
, которая является onReadRequest, если ответ (res
) является объектом только с одниматрибута, например, {'status':'ok'}
, тогда все работает как положено, если я добавлю еще один атрибут к этому объекту, например {'status':'ok', 'temp':23}
, тогда весь процесс развалится.
EDIT.2:
Так что, похоже, это вопрос размера.Либо с одним атрибутом в объекте произойдет сбой, если размер объекта будет больше, чем {'temp':2455555555}
.Если я добавлю еще 5 к значению, это сойдет с ума.