Разблокировка Linux с Bluetooth с низким энергопотреблением - PullRequest
2 голосов
/ 26 января 2020

Вы когда-нибудь видели, как яблочные часы открывают Ма c? Идея потрясающая, но я не хочу умных часов, потому что у меня уже есть телефон, который имеет аналогичные возможности AFAIK. Кроме того, я недавно перешел с OSX на Linux:)

Я не знаю, как Apple Watch удается разблокировать Ma c. Но я знаю, что было бы желательно с точки зрения пользовательского опыта:

  1. Требуется разблокировать быстрее, чем я ввожу свой пароль
  2. Должно работать при отсутствии Wi-Fi / 4G
  3. Должно быть энергосберегающим

RFID

Было бы неплохо использовать RFID, но нет в моих ноутбуках встроенных считывателей RFID.

Обнаружение близости на основе Bluetooth

Проблема с classi c Bluetooth - это требование постоянно сканировать близлежащие устройства для измерения силы сигнала (RSSI), из которого мы можем вывести близость.

К сожалению, обнаружение прыгает и слушает 40 каналов , И в любом случае телефоны перестают вещать, когда экран на некоторое время выключен. Это не достаточно хорошо. Я знаю, потому что я пытался:

import collection.JavaConverters._
import tinyb._

object Listener extends App {

  var running = true

  val BT_ADDR = sys.env.getOrElse("BT_ADDR", "XX:XX:XX:XX:XX:XX")
  val BT_RSSI_DBM_THRESHOLD = Integer.parseInt(sys.env.getOrElse("BT_RSSI_DBM_THRESHOLD", "-65")).toShort

  val manager = BluetoothManager.getBluetoothManager
  val lock = new Object

  while (true) {
    manager.getAdapters.forEach(a => {
      a.setRssiDiscoveryFilter(BT_RSSI_DBM_THRESHOLD)
      a.removeDevices()
    })

    System.err.println("scanning for " + BT_ADDR + " at minimum " + BT_RSSI_DBM_THRESHOLD + " dBm RSSI...")

    manager.startNearbyDiscovery(
      (device: BluetoothDevice) => {
        if (BT_ADDR.equals(device.getAddress)) {
          onProximity(device)
          manager.stopNearbyDiscovery()
          lock.synchronized(lock.notify())

        }
        else println(device.getName)
      }
      , 1000
      , false
    )
    lock.synchronized(lock.wait())
  }


}

Я смотрел на BTLE (Bluetooth Low Energy), и мне трудно понять следующее:

Есть ли способ установить sh от Linux единственного низкоэнергетического Bluetooth-соединения с телефоном Android, которое мы можем постоянно оставлять бездействующим и использовать его для пробуждения телефона и передачи некоторых пакетов (чтобы мы могли измерить его мощность RSSI и выводить близость) по требованию , только когда это строго необходимо.

Т.е. мы бы ограничивали передачу только этими редкими случаями:

  • Проверьте, когда пользователь отсутствует, если мы обнаружим неактивные мышь и клавиатуру в течение 1 минуты,
  • Проверьте, достаточно ли близко пользователь, когда GDM активен
  • Нет активности BT, в противном случае

Этот подход быстрый, энергоэффективный и не требует сетевого протокола, только некоторые редкие BT передача.

Но возможно ли это с Bluetooth LE? Любые указатели на примеры?

1 Ответ

2 голосов
/ 28 января 2020

Да, это возможно при использовании Bluetooth Low Energy (с некоторыми оговорками) следующим образом: -

  1. Вам нужна программа BlueZ script / C для постоянного сканирования вашего устройства Android.
  2. Вам нужно, чтобы Bluetooth вашего телефона был всегда включен.
  3. Вам необходимо будет выполнить сопряжение хотя бы один раз, чтобы ваш Linux аппарат распознал изменяемый адрес Bluetooth вашего устройства Android ( см. ссылки).

Программа сценария BlueZ должна быть написана так, чтобы, как только ваша система Linux перешла в режим ожидания, программа запускалась как демон или фоновый процесс, который только начинает сканирование для Android устройств и читать их значения RSSI. Если ваше устройство найдено и значение RSSI указывает, что оно находится в пределах диапазона, этот процесс подаст сигнал ОС Linux на пробуждение.

Предостережения: -

  • BLE не идеален для позиционирования / определения местоположения; Вы, вероятно, можете определить, находитесь ли вы на расстоянии нескольких метров, но было бы сложно получить точность в несколько сантиметров.
  • Ваш скрипт BlueZ должен постоянно работать как демон или фоновый процесс, поэтому, если он как-то убит или неактивен, когда устройство переходит в режим сна, это не будет работать.
  • Bluetooth на вашем телефоне должен быть всегда включен, что не должно сильно влиять на срок службы батареи, но также не рекомендуется.

Некоторые ресурсы для вас: -

Это не будет прямой процесс и вам, вероятно, придется попробовать и потерпеть неудачу на этом пути, но это будет учебный опыт, и вы сможете достичь того, чего хотите. В конце.

Надеюсь, это поможет.

...