使用低功耗蓝牙解锁Linux操作系统

3
你是否看过苹果手表解锁Mac的场景?这个想法很棒,但我不需要智能手表,因为我的手机已经具备了类似的功能,据我所知。另外,最近我从OSX换成了Linux :)
我不知道苹果手表是如何解锁Mac的。但从用户体验的角度来看,以下几点是可取的:
1. 需要比我输入密码更快地解锁 2. 在没有wifi/4G的情况下也应该能够工作 3. 应该有较低的耗电量

射频识别技术(RFID)

使用RFID会很好,但据我所知,没有笔记本电脑内置RFID读卡器。

基于蓝牙的近程探测

经典蓝牙的挑战在于需要不断扫描附近的设备以测量信号强度(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),但我有些难以理解以下内容:
在Linux上是否有一种方法,可以建立一个单独的低功耗蓝牙连接到Android手机上,我们可以让它一直处于休眠状态,并且仅在需要时才使用它来唤醒手机并发送一些数据包(以便我们可以测量其RSSI功率并推断距离)。
也就是说,我们将传输限制为以下这些罕见的情况:
- 检查用户是否不在场,如果我们检测到1分钟内不活动的鼠标和键盘 - 当GDM处于活动状态时检查用户是否足够接近 - 否则完全没有BT活动
这种方法快速、节能,不需要网络协议,只需要一些罕见的BT传输。但是对于Bluetooth LE而言,是否可能实现这一点呢?是否有指向示例的提示?
注:BTLE即蓝牙低能耗技术。
1个回答

3

可以通过蓝牙低功耗(有一些限制)实现此功能,具体如下:

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

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

以下是注意事项:

  • BLE不适合定位/定位;您可能能够检测到您距离设备几米远,但要精确到几厘米的距离就有挑战性了。
  • 您的BlueZ脚本需要作为守护程序或后台进程不断运行,因此,如果在设备进入睡眠状态时某种方式被杀死或处于非活动状态,则这将无法工作。
  • 手机上的蓝牙应始终处于打开状态,这不会对电池寿命造成太大影响,但也不建议这样做。

以下是一些资源:

这并不是一件轻松的过程,可能需要不断尝试和失败,但这将是一个学习的过程,最终您应该能够达到想要的目标。

希望能对您有所帮助。


如果我在我的笔记本电脑上贴上RFID标签,并让Android响应RFID事件来初始化蓝牙连接(可能需要编写一个小型移动应用程序,我可以做到这一点),那么我就可以避免手机上的持续BT广播和锁定的笔记本电脑上的持续轮询。你认为呢? - sscarduzio
1
我在Linux和Android方面都没有RFID的经验,但如果您有信心可以让这个功能正常工作,那么其他部分应该也是可行的。手机上持续的蓝牙广播并不是一个很大的问题,BLE只消耗WiFi/Data的一小部分。最后,您可以在笔记本电脑端设置发射功率为-40dBm(使用BlueZ)-这肯定会降低范围,以便机器只在近距离内开启。 - Youssif Saeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接