Уходим с телефоном, «МакБук» выключается

Причина, по которой я засел за Пайтон и стал изучать как из него работать с Bluetooth в том, что мне очень хотелось сделать следующую вещь: как только я покидаю рабочее место, мой ноутбук блокируется.

Идея выглядела просто: надо посмотреть присутствует ли в эфире мой смартфон, если нету, значит я куда-то ушёл (я без смартфона не хожу). Я сначала это на «Баше» сделал и всё даже работало, но случилось неожиданное: Mac OS время от времени стала падать с серым экраном смерти. Тогда я взял в руки Пайтон. Я даже запрограммировал сканирование эфира, но выяснилась неприятная штука — через какое-то время моя «Нокия» автоматически выключала видимость устройства и никакими уговорами не удалось убедить её этого не делать. Пришлось делать проверку соединением со смартфоном (не знаю как это сажает батарею, не успел ещё проверить).

В общем, всё получилось у меня. Если хотите, чтобы у вас работало так же, то двигайтесь по шагам.

Шаг №1.

Нужно узнать так называемый «адрес» вашего устройства и привязать его к компьютеру. Тут ничего сложного нет, заходим в настройки «Блютуз» на «Маке» (они находятся в «Системных настройках»), привязываем его как обычно и переписываем себе 12 букв, разделённых минусами, это и есть адрес: Настройки Bluetooth (80.68КиБ)

Шаг №2.

С этого шага потребуется уметь пользоваться терминалом. Создаём запускаемый файл /usr/local/bin/bt-lock следующего содержания:
#!/usr/bin/python

import objc
import sys
from subprocess import call

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

def CheckDevice(address):
    dev = IOBluetoothDevice.withAddressString_(address)

    if dev.isConnected():
        return True

    conn = dev.openConnection()

    if conn == -536870185: # Bluetooth is off
        return True

    if conn == 0:
        dev.closeConnection()
        return True

    return False


cmdtorun=(r'/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession', r'-suspend')

try:
    if not CheckDevice(sys.argv[1]):
        call(cmdtorun)
except IndexError:
    print("Usage: bt-lock <device address>")
В скобках замечу, чтобы сделать файл запускаемым нужно в терминале выполнить следующую команду: chmod a+x /usr/local/bin/bt-lock.

Шаг 3.

Создаём файл ~/Library/LaunchAgents/ru.bolknote.Bluetooth-lock.crontab.plist с таким вот содержимым:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>ru.bolknote.Bluetooth-lock.crontab</string>

  <key>Program</key>
  <string>/usr/local/bin/bt-lock</string>

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/bt-lock</string>
    <string>а̲д̲р̲е̲с̲ ̲в̲а̲ш̲е̲г̲о̲ ̲у̲с̲т̲р̲о̲й̲с̲т̲в̲а̲</string>
  </array>

  <key>Nice</key>
  <integer>20</integer>

  <key>StartInterval</key>
  <integer>30</integer>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>
И выполняем в терминале команду «launchctl load ru.bolknote.Bluetooth-lock.crontab.plist». Это всё.

Чтобы отключить всю эту марахайку, достаточно выполнить в терминале команду «launchctl unload ru.bolknote.Bluetooth-lock.crontab.plist» или выключить Bluetooth на ноуте.

Решение только для «Мака», как работать из Пайтона с Блютузом под другие операционные системы, я не знаю.
16 марта 2013 20:20

aktuba (инкогнито)
16 марта 2013, 20:58

Идея - класс! Надо будет реализовать что-то подобное под win7/win8 + iphone.

silentroach (инкогнито)
16 марта 2013, 21:16

Хотелось просто поковыряться? :)
Есть же готовых таких утилит несколько

Евгений Степанищев (bolknote.ru)
16 марта 2013, 21:21, ответ предназначен silentroach

Например?

Мохов Олег (o-mokhov.ya.ru)
16 марта 2013, 21:29

Следующий шаг – разблокировка ноута, когда ты приходишь?

smikera (инкогнито)
16 марта 2013, 22:04, ответ предназначен aktuba

Надо будет реализовать что-то подобное под win7/win8 + iphone.
Ничего лучше прокачивания рефлекса нажимать Win+L при уходе еще не придумали, да.

Евгений Степанищев (bolknote.ru)
16 марта 2013, 22:51, ответ предназначен Мохов Олег (o-mokhov.ya.ru):

Следующий шаг – разблокировка ноута, когда ты приходишь?
Я думал об этом :) Но не исключён вариант, что я просто мимо буду проходить, а он разблокируется.

samdark (rmcreative.ru)
17 марта 2013, 00:27

И что делать, если телефон забыт дома? Угнать за 30 секунд?

Евгений Степанищев (bolknote.ru)
17 марта 2013, 00:47, ответ предназначен samdark (rmcreative.ru):

С моей работой забыть дома смартфон (http://bolknote.ru/2012/02/25/~3587/) — это как забыть ноутбук, можно сразу разворачиваться и ехать домой.

Ну и потом, если выключить Bluetooth (он выключается на «Маке» вон там ↗, в верхнем правом углу), то моя программа тоже отключается. Для этого 30 секунд вполне хватит.

samdark (rmcreative.ru)
17 марта 2013, 00:52, ответ предназначен Евгений Степанищев (bolknote.ru):

Про телефон — это я цитировал заголовок поста, если что: «Уходим с телефоном, «МакБук» выключается». Так да, если значок в MacOS легко доступен, времени хватит.

Евгений Степанищев (bolknote.ru)
17 марта 2013, 01:17, ответ предназначен samdark (rmcreative.ru):

Да, я в заголовок обычно помещаю такие слова, чтобы легче искать потом было по любым, пришедшим в голову словам, так что my fault, да :)

Евгений Степанищев (bolknote.ru)
17 марта 2013, 01:45, ответ предназначен samdark (rmcreative.ru):

Даже и без этого значка времени хватает. Не обязательно всё делать за один раз, ввёл пароль и продолжаешь.

Станислав (инкогнито)
17 марта 2013, 11:03, ответ предназначен Евгений Степанищев (bolknote.ru):

Например, есть http://www.keycardapp.com/

Евгений Степанищев (bolknote.ru)
17 марта 2013, 12:26, ответ предназначен Станиславу

Не знал. Ну что ж, она 200 рублей стоит, а у меня бесплатно.

aktuba (инкогнито)
17 марта 2013, 14:07

Ничего лучше прокачивания рефлекса нажимать Win+L при уходе еще не придумали, да.
Это и так прокачано, дальше уже некуда ;)

Hazan (инкогнито)
17 марта 2013, 23:51

"так называемый адрес" - это самый настоящий MAC-адрес, а не "так называемый"
Например, по первым трём октетам можно определить производителя интерфейса:
http://www.gcstech.net/macvendor/index.php?node=vensea&list

Евгений Степанищев (bolknote.ru)
18 марта 2013, 06:08, ответ предназначен Hazan

а не «так называемый»
Что ваше замечание значит вообще? Это адрес, это так называется? Значит он «так называемый».

SiMM (mr-simm.livejournal.com)
18 марта 2013, 08:19

Полагаю, для тех же целей можно и Wi-Fi использовать – интересно, что более энергозатратно на трубке – Bluetooth или Wi-Fi?

Евгений Степанищев (bolknote.ru)
18 марта 2013, 08:28, ответ предназначен SiMM (mr-simm.livejournal.com):

А как для этого можно WiFi использовать? У меня на ноуте WiFi занят — я через него к сети подсоединён.

Евгений Степанищев (bolknote.ru)
18 марта 2013, 08:39

Вообще, по-хорошему, надо переписать мою поделку в демон и не загружать её каждые 30 секунд в память. Кроме того, проверять заблокирована ли машина, например, вот так: http://stackoverflow.com/questions/11505255/osx-check-if-the-screen-is-locked

Евгений Степанищев (bolknote.ru)
18 марта 2013, 10:00

Из бесплатных попробовал вот это: http://www.meruko.com/bluetooth-screen-lock Оно зачем-то лочит экран просто так чаще всего.

Ваше имя или адрес блога (можно OpenID):

Текст вашего комментария, не HTML:

Кому бы вы хотели ответить (или кликните на его аватару)