Android 用蓝牙低能量解锁Linux

Android 用蓝牙低能量解锁Linux,android,bluetooth,bluetooth-lowenergy,bluez,proximity,Android,Bluetooth,Bluetooth Lowenergy,Bluez,Proximity,你见过苹果手表解锁Mac吗?这个想法太棒了,但我不想要智能手表,因为我已经有了一款功能类似的手机。 另外,我最近从OSX搬到了Linux:) 我不知道Apple watch是如何解锁Mac的。但从用户体验的角度来看,我知道什么是可取的: 需要比键入密码更快解锁 应在没有wifi/4G的情况下工作 应该是节能的 射频识别 RFID会很好,但我知道没有笔记本电脑嵌入RFID阅读器 基于蓝牙的近距离检测 经典蓝牙的挑战在于需要不断扫描附近的设备,以测量信号强度(RSSI),从中我们可以推断接近程度 不

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

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

  • 需要比键入密码更快解锁
  • 应在没有wifi/4G的情况下工作
  • 应该是节能的
  • 射频识别 RFID会很好,但我知道没有笔记本电脑嵌入RFID阅读器

    基于蓝牙的近距离检测 经典蓝牙的挑战在于需要不断扫描附近的设备,以测量信号强度(RSSI),从中我们可以推断接近程度

    不幸的是,discovery跳听了40个频道。不管怎样,当屏幕关闭一段时间后,手机就会停止广播。这还不够好。我知道,因为我试过:

    import collection.JavaConverters_
    进口tinyb_
    对象侦听器扩展应用程序{
    var running=true
    val BT_ADDR=sys.env.getOrElse(“BT_ADDR”,“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=新对象
    while(true){
    manager.getAdapters.forEach(a=>{
    a、 setRssiDiscoveryFilter(BT_RSSI_DBM_阈值)
    a、 移除设备()
    })
    System.err.println(“至少扫描“+BT_RSSI\u DBM_阈值”+“DBM RSSI…”的“+BT_ADDR+”)
    manager.startNearbyDiscovery(
    (设备:蓝牙设备)=>{
    if(BT_ADDR.equals(device.getAddress)){
    近距离(装置)
    manager.stoppenearbydiscovery()
    lock.synchronized(lock.notify())
    }
    else println(device.getName)
    }
    , 1000
    ,错
    )
    lock.synchronized(lock.wait())
    }
    }
    
    我在看BTLE(蓝牙低能量),我很难理解以下内容:

    有没有一种方法可以从Linux建立到Android手机的单一低能耗蓝牙连接,我们可以让它一直处于休眠状态,并使用它唤醒手机,让它发送一些数据包(这样我们可以测量其RSSI功率并推断其接近程度)按需,只有在严格需要时才这样做

    也就是说,我们将仅在以下罕见情况下进行传输:

    • 如果我们检测到1分钟内鼠标和键盘处于非活动状态,请检查用户不在时
    • 当GDM处于活动状态时,检查用户是否足够靠近
    • 没有任何其他BT活动
    这种方法快速、节能,并且不需要网络协议,只需要一些罕见的BT传输


    但是,这是否有可能与蓝牙LE?有没有指向示例的指针?

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

  • 你需要一个BlueZ脚本/C程序来不断扫描你的Android设备
  • 您需要始终打开手机的蓝牙功能
  • 您需要至少配对一次,以便Linux机器识别Android设备的可变蓝牙地址(请参阅参考链接)
  • 应该编写BlueZ脚本程序,以便在Linux系统进入待机状态时,该程序将作为守护进程或后台进程启动,该进程将开始扫描Android设备并读取其RSSI值。如果找到您的设备,并且RSSI值指示它在范围内,则此过程将向Linux操作系统发出唤醒信号

    注意事项:-

    • BLE不适合定位/定位;你可能会发现 如果你在几米远的地方,但要想得到一个 精确到几厘米
    • 您的BlueZ脚本需要 作为守护进程或后台进程持续运行,因此 当设备进入睡眠状态时,不知何故被杀死或处于非活动状态,这 这是行不通的
    • 手机上的蓝牙应始终处于打开状态,这 不应该对电池寿命有太大影响,但也不是 推荐的
    为您提供的一些资源:-

    这将不是一个简单的过程,你可能不得不一路尝试并失败,但这将是一次学习经历,你最终应该能够实现你想要的


    我希望这能有所帮助。

    如果我在笔记本电脑上贴上RFID标签,并让Android启动蓝牙连接以响应RFID事件(可能需要编写一个微型移动应用程序,我可以这样做),该怎么办?这样我就可以避免在手机上不断播放BT广播,在锁定的笔记本电脑上不断进行轮询。WDYT?我在Linux端和Android端都没有RFID方面的经验,但如果您有信心可以使用此功能,那么其余的都应该是可行的。手机上持续的BT广播并不是什么大问题,BLE只消耗了WiFi/数据的一小部分。最后,您可以将笔记本电脑端的tx电源设置为-40dBm(使用BlueZ)-这肯定会降低范围,因此机器只能在很近的距离内启动。