Cordova BLE Соединение автоматически (без действий пользователя) на основе имени устройства завершается неудачно из-за асинхронного выполнения ble.scan - PullRequest
0 голосов
/ 09 июня 2018

Я занимаюсь разработкой приложения с использованием Cordova и плагина BLE.Я хочу подключиться через BLE автоматически к ESP32 на основе жестко известного известного имени устройства. Пользователю не нужно нажимать кнопку подключения.

Моя идея была:

На устройстве готово запуститьscan:

scanForDevices: function(){ 
    ble.scan([], 10, app.onDiscoverDevice, app.onError); 
    app.getDevIdFromList(); 
},

Создание массива со всеми обнаруженными устройствами:

  onDiscoverDevice: function(device) { 
     deviceList[deviceNr] = [device.name, device.id, device.rssi]; 
     deviceNr = deviceNr + 1 ; 
  },

И когда функция ble.scan завершает работу, запустите app.getDevIdFromList (), который проверяет, находится ли имя моего устройства всписок и, если да, начинайте соединяться:

getDevIdFromList: function(){ 
   for (var i = 0; i < deviceList.length; i++) 
       { if (deviceList[i][0]== "myDeviceName")
          { myDeviceDetected = "true"; 
            myDeviceId = deviceList[i][1]; 
            app.connect(); 
          } 
       } 
       if (myDeviceDetected == "false"){
           app.onBtDetectionError(); 
       } },

Проблема, похоже, заключается в том, что getDevIdFromList вызывается до того, как ble.scan завершает работу (выполняется async?), что приводит к обработке неполного или даже пустого массива с помощью метода getDevIdFromListonBtDetectionError, даже когда мое устройство доступно.

Есть идеи, как это исправить?thx!

(См. также проблему, которую я поднял на плагине BLE github # 597 , но, как заметил владелец, это больше вопрос переполнения стека)

1 Ответ

0 голосов
/ 09 июня 2018

Поскольку сканирование асинхронно, это делает логику немного более сложной.Один из способов сделать это - дождаться окончания сканирования, а затем проверить результаты.

connectByName: function(name) {

    const devices = [];

    // scan and save devices to a list
    ble.startScan([], d => devices.push(d));

    // check the list when the scan stop
    setTimeout(() => {
        ble.stopScan();

        const device = devices.filter(d => d.name === name)[0];
        if (device) {
            ble.connect(device.id, app.onConnected, app.onDisconnected);
        } else {
            console.log(`Couldn't find device ${name}`);
        }
    }, 5000);
},

Это работает нормально, но вам всегда нужно ждать окончания сканирования.Даже если сканирование обнаружит устройство немедленно, нужно подождать тайм-аут.Другой подход состоит в том, чтобы фильтровать устройства во время сканирования.

connectByName: function(name) {

    let scanning = true;

    ble.startScan([], device => {
        if (device.name === name) {
            ble.stopScan();
            scanning = false;
            ble.connect(device.id, app.onConnected, app.onDisconnected);
        } else {
            console.log(`Skipping ${device.name} ${device.id}`);
        }
    });

    // set timer to stop the scan after a while
    setTimeout(() => {
        if (scanning) {
            ble.stopScan(); 
            console.log(`Couldn't find device ${name}`);
        }
    }, 5000);
},

Второй метод часто лучше, так как он может подключаться быстрее.

Если вы работаете только на Android и у вас есть MAC-адрес устройства, вы можете подключиться без сканирования.(iOS по-прежнему требует от вас сканирования.)

onDeviceReady: function() {
    // connect by MAC address on startup
    const MAC_ADDRESS = 'E4:86:1E:4E:5A:FB';
    ble.connect(MAC_ADDRESS, app.onConnected, app.onDisconnected);
},

Существует также новая функция автоматического подключения, которая автоматически подключается и отключается, когда телефон находится в зоне действия устройства.(Это пока не работает на iOS.)

onDeviceReady: function() {
    // Auto connect whenever the device is in range
    const MAC_ADDRESS = 'E4:86:1E:4E:5A:FB';
    ble.autoConnect(MAC_ADDRESS, app.onConnected, app.onDisconnected);
},

См. https://gist.github.com/don/e423ed19f16e1367b96d04ecf51533cc для получения полной версии index.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...