【问题标题】:Unlock Linux with Bluetooth low energy使用低功耗蓝牙解锁 Linux
【发布时间】:2020-05-12 04:22:47
【问题描述】:

你见过苹果手表解锁 Mac 吗?这个想法很棒,但我不想要智能手表,因为我已经有一部具有类似功能的手机 AFAIK。 另外,我最近从 OSX 搬到了 Linux :)

我不知道 Apple Watch 是如何解锁 Mac 的。但我知道从用户体验的角度来看什么是可取的:

  1. 需要比我输入密码更快地解锁
  2. 应该在没有 wifi/4G 的情况下工作
  3. 应该是省电的

RFID

RFID 会很好,但据我所知没有笔记本电脑嵌入 RFID 阅读器。

基于蓝牙的接近检测

经典蓝牙面临的挑战是需要不断扫描附近的设备以测量信号强度 (RSSI),从而推断距离。

不幸的是,discovery 跳过并收听了 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(蓝牙低功耗),但我很难理解以下内容:

有没有办法从Linux建立到Android手机的单个低功耗蓝牙连接,我们可以一直保持休眠状态,并用它来唤醒手机并让它传输一些数据包(这样我们就可以测量它的RSSI 功率和推断接近度)按需,仅在严格需要时。

即我们会将传输限制在这些极少数情况下:

  • 如果我们检测到鼠标和键盘闲置 1 分钟,则检查用户何时离开,
  • 在 GDM 处于活动状态时检查用户是否足够近
  • 除此之外没有任何 BT 活动

这种方式快速、节能,不需要网络协议,只需要一些少见的BT传输。

但是,蓝牙 LE 可以做到这一点吗?任何指向示例的指针?

【问题讨论】:

    标签: android bluetooth bluetooth-lowenergy bluez proximity


    【解决方案1】:

    是的,这应该可以通过蓝牙低功耗(有一些警告)实现,如下所示:-

    1. 您需要一个 BlueZ 脚本/C 程序来持续扫描您的 Android 设备。
    2. 您需要始终打开手机的蓝牙。
    3. 您需要至少配对一次,以便您的 Linux 机器识别您的 Android 设备的可更改蓝牙地址(请参阅参考链接)。

    应编写 BlueZ 脚本程序,以便在您的 Linux 系统进入待机状态后,该程序作为守护程序或后台进程启动,该进程开始扫描 Android 设备并读取其 RSSI 值。如果找到您的设备并且 RSSI 值指示它在范围内,则此过程将向 Linux 操作系统发出唤醒信号。

    注意事项:-

    • BLE 不适合定位/定位;你可能可以检测到 如果您在几米之外,但要获得一个 几厘米的精度。
    • 您的 BlueZ 脚本需要 不断作为守护进程或后台进程运行,所以如果它是 当设备进入睡眠状态时以某种方式被杀死或处于非活动状态,这 不管用。
    • 您手机上的蓝牙应始终开启,这 不应该对电池寿命有很大影响,但也不是 推荐。

    一些资源给你:-

    这不会是一个直截了当的过程,您可能必须一路尝试并失败,但这将是一次学习体验,您最终应该能够实现您想要的。

    我希望这会有所帮助。

    【讨论】:

    • 如果我在笔记本电脑上贴一个 RFID 标签,并让 Android 启动蓝牙连接以响应 RFID 事件(可能需要编写一个小型移动应用程序,我可以做到)怎么办?这样我就可以避免手机上不断的BT广播,以及锁定的笔记本电脑上的不断轮询。 WDYT?
    • 我在 Linux 端和 Android 端都没有使用 RFID 的经验,但是如果您确信可以使此功能正常工作,那么其余的应该是可行的。手机上持续的 BT 广播并不是真正的主要问题,BLE 仅消耗 WiFi/数据功能的一小部分。最后,您可以将笔记本电脑端的 tx 功率设置为 -40dBm(使用 BlueZ)——这肯定会降低范围,以便机器仅在非常接近时才会打开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 2018-10-12
    相关资源
    最近更新 更多