Site Mascot
 

Не удивляйтесь, сайт переехал: был http://smacker.fatal.ru, стал http://smacker.heliohost.org.

Оповещение через Bluetooth

27.09.2007 12:24

Очень может быть, что я изобрел очередной велосипед, но в данной статье я расскажу о том, как я реализовал у себя оповещение о различных событиях по Bluetooth.

 
Итак, идея крайне проста: как уже явствует из предыдущих заметок, я настроил у себя GPRS через Bluetooth с помощью телефона и USB-адаптера второго класса. Сейчас, с переходом к использованию выделенной линии и модема для «выездных сессий» (да, за время последнего перерыва в обновлениях многое случилось, и нынешние публикации призваны задним числом восполнить этот пробел), необходимость в этом решении практически отпала (теперь это мой «аварийный вариант»). Однако у меня остались настройки Bluetooth и спаренные телефон и компьютер. Чтобы как-то занять их делом, я решил написать скрипт, который позволит мне отсылать по Bluetooth напоминания или уведомления на мой телефон. Например, о новых сообщениях в Jabber или о том, что скомпилировался исходник.

 

Реализация

 

Технически, реализация довольно проста: с помощью obex_push на телефон можно отослать произвольный файл. В исходном положении файла у нас нет, а есть только некий текст, который мы хотим передать. Соответственно, задача скрипта — этот файл сформировать и убедиться в том, что он передан.
Немного о нюансах:
1. Моя квартира имеет профиль буквы Ш (или гребенки) с тремя параллельными перегородками в центре. Из-за этого не всегда получается успешно передать файл с первого раза, хотя при прочих равных (т.е. без искусственного изменения расположения объектов на пути сигнала) со второго или третьего успех практически гарантирован. Стало быть, скрипт должен совершить несколько попыток передачи файла и остановиться только после успешной передачи.
2. Мой телефон не принимает подряд файлы с одинаковыми названиями. Стало быть, нужно создавать файлы с разными именами автоматически.
3. Мой телефон показывает имя файла сразу под надписью Bluetooth в списке сообщений. Поэтому имя файла должно быть по возможности наиболее осмысленным и эстетичным. Что-то вроде /tmp/453/gjsfti-X-smacker876 не годится.

 

 #!/bin/bash
 
 RETRY_COUNT=5
 ADDR="00:be:7d:c8:08:fa"
 CHANNEL=9
 
 ##################################################################################
 
 mkdir /tmp/btnotify 2>/dev/null
 cd /tmp/btnotify
 
 MSG=$(echo $2 | iconv -t utf8)
 
 TIME=$(date +%r | sed 's/ $//')
 echo $MSG > "($TIME): $1"
 
 while [  $RETRY_COUNT -gt 0 ]; do
 
 if echo $(obex_push [$ADDR]:$CHANNEL "($TIME): $1") | grep successful > /dev/null
 then
 	rm -f "($TIME): $1"
 	exit
 fi
 
 sleep 2;
 RETRY_COUNT=$[$RETRY_COUNT - 1]
 
 done
 
 rm -f "($TIME): $1"
 

 

В этом скрипте первые три параметра — настройки числа попыток, идентификатора Bluetooth-устройства (т.е. телефона) и канал для связи. Все это можно получить множеством путей, хотя бы из kbluetoothd -> OBEX. Если уже настраивался GPRS, то эти настройки и так уже должны быть известны.
Для имени файла я решил использовать вид «(ЧЧ:ММ:СС): тема», файлы создавать в отдельном каталоге в /tmp и удалять по завершении работы скрипта. Пауза между попытками — 2 секунды.

 

Скрипт у меня лежит в ~/bin (права 750 — не забудьте) и называется btnotify. Использовать его очень просто:
 $ btnotify "Compilation complete" "Сборка uclibc завершена"
Первый параметр — тема сообщения, она же имя файла; второй параметр — текст сообщения (не забудьте писать в кавычках). Можно использовать в ручном режиме, прописывая после нужной команды в консоли, можно приделывать к тому же jabber-клиенту, если угодно.

 

Несколько замечаний:
1. Как можно заметить, на случай использования русского языка, текст сообщения перекодируется в UTF8 (для моего телефона это работает, но для вашего м.б. и нет — сказать не могу). Однако я так и не придумал, как победить само имя файла, т.к. оно проходит через руки obex_push, который перевирает кодировку второй раз. Для меня лично это не страшно — я, честно говоря, не великий любитель везде использовать русский язык, мне легче написать «compilation complete», чем «исходник собрался». Если кто-то предложит способ разобраться с этим, you are welcome.
2. Пара слов о конфиденциальности. Насколько мне известно, проблема защищенности Bluetooth со стороны ПК остро не стоит, в отличие от телефона. Спешу обнадежить — при прописанном адресе устройства можно спокойно держать телефон в режиме «скрыт», файл всё равно найдет адресата, а вот соседям найти ваш телефон будет сложнее.
  1. Я буду рад, если вы оставите свой отзыв об этой заметке:

    Никнейм

    Email

    URL

    Заголовок комментария

    Проверка на человечность
    - Введите буквы:
    The CAPTCHA image