Page cover image

宿舍物联网方案实践-人走关灯锁屏

最近总莫名其妙出宿舍忘记关台灯锁电脑, 于是便有了这篇文章
    Date
    Nov 21, 2022
    Description
    最近总莫名其妙出宿舍忘记关台灯锁电脑, 于是便有了这篇文章
    Public
    Public
    Published
    Tags
    URL
     

    方案选择

     
    目前我能想到的, 能准确判断我是否离开宿舍的方式便是蓝牙了
     
    刚开始我用的一直是这个 Gnome 插件
     
    它实现了在我的 小米手环 断开了与 pc 的连接就自动锁上屏幕
     
    但是这样毕竟是 Gnome 插件, 通用性不是特别强, 而且自定义起来不是很方便
     
    有空再魔改它
     
    所以这里也用简单的思路先实现一下这个功能吧
     
    一个学期又要过去了, 早点实现吧还是
     

    功能实现

     
    这里我打算通过 bash 写个小脚本去实现
     

    判断蓝牙连接状态

     
    这应该是最重要的部分了
     
    我们通过 bluetoothctl 的命令来实现判断
     
    $ bluetoothctl info C1:0C:0A:02:XX:XX Device C1:0C:0A:02:XX:XX (public) Name: Mi Smart Band 6 Alias: Mi Smart Band 6 Appearance: 0x03c1 Icon: input-keyboard Paired: yes Trusted: yes Blocked: no Connected: yes LegacyPairing: no UUID: Vendor specific (00001530-0000-3512-2118-0009af100700) UUID: Generic Access Profile (00001800-0000-1000-8000-00805f9b34fb) UUID: Generic Attribute Profile (00001801-0000-1000-8000-00805f9b34fb) UUID: Immediate Alert (00001802-0000-1000-8000-00805f9b34fb) UUID: Device Information (0000180a-0000-1000-8000-00805f9b34fb) UUID: Heart Rate (0000180d-0000-1000-8000-00805f9b34fb) UUID: Battery Service (0000180f-0000-1000-8000-00805f9b34fb) UUID: Alert Notification Serv.. (00001811-0000-1000-8000-00805f9b34fb) UUID: Human Interface Device (00001812-0000-1000-8000-00805f9b34fb) UUID: Unknown (00003802-0000-1000-8000-00805f9b34fb) UUID: Anhui Huami Information.. (0000fee0-0000-1000-8000-00805f9b34fb) UUID: Anhui Huami Information.. (0000fee1-0000-1000-8000-00805f9b34fb) Modalias: bluetooth:v0157p005Bd0100 ManufacturerData Key: 0x0157 ManufacturerData Value: 02 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ................ ff 03 c1 0c 0a 02 13 1d ........ RSSI: -82 AdvertisingFlags: 06 . Battery Percentage: 0x2d (45)
     
    可以看到这里的输出, 有个 Connected 的字段
     
    我们可以通过它去判断蓝牙设备是否连接上了
     

    锁屏

     
    这里大家可以去翻阅你再走的桌面环境的相关命令实现
     
    Gnome 的话可以使用 dbus 协议去调用
     
    # Lock dbus-send --session --dest=org.gnome.ScreenSaver --type=method_call --print-reply --reply-timeout=20000 /org/gnome/ScreenSaver org.gnome.ScreenSaver.SetActive boolean:true # Unlock dbus-send --session --dest=org.gnome.ScreenSaver --type=method_call --print-reply --reply-timeout=20000 /org/gnome/ScreenSaver org.gnome.ScreenSaver.SetActive boolean:false
     
    Mac 上的话可以
     
    pmset displaysleepnow
     

    关灯

     
    我用的是小米台灯
     
    可以通过 miio 协议去实现控制
     
    这里用这个项目自带的命令行工具吧
     
     
    毕竟人生苦短
     
    miio 协议实现感兴趣的也可以看看我的这个项目
     
     

    组装代码

     
    以后有空再把它工程化吧, shell写的又不是不能用
     
    # 自行配置 DeviceMAC="C1:0C:0A:02:XX:XX" Interval=5 # 自定义操作 action(){ echo "lock" # todo echo "Turn off my light" miiocli yeelight --ip 192.168.2.214 --token xxxxxxxxxxxxxxxx off echo "Lock my Mac Book Pro" ssh MacBook-Pro pmset displaysleepnow } export last_status="" while true ; do status=$(bluetoothctl info $DeviceMAC | grep 'Connected:' | awk -F': ' '{ print $2}') if [ "$status" == "no" ];then if [ "$last_status" == "yes" ];then action fi elif [ "$status" == "yes" ];then echo "yes" fi last_status=$status sleep $Interval done
     
     

    最后

     
    通过这几行代码就实现了预期功能了~
     
    如果你和我一样用的也是小米手环的话
     
    记得在 手机 APP 里开启 实验室-小米笔记本解锁 的功能
     
    然后就是记得开启蓝牙自动连接