Кодинг для Maemo 5: пишем Bluetooth-сканнер для Nokia N900

@@title=Кодинг для Maemo 5: пишем Bluetooth-сканнер для Nokia N900 @@charset=utf-8 @@filter=text2html @@nosplit=1

Если посмотреть на репозитарий приложений месяц назад, когда я делился своими впечатлениями от общения с мини-компьютером от Nokia, и сейчас, то это две большие разницы. Программ становится все больше: часть портируется с Debian, часть со старых версий Maemo, которая использовался в предыдущих моделях интернет-планшетов, а часть разрезывается с нуля. И хотя хочется верить, что во всем этом разнообразии найдется нужный инструмент, я уже не раз оказывается в ситуации, когда подходящей программы в репозитарии не оказывалось. В частности для экспериментов с Bluetooth мне был нужен сканнер, который находил бы устройства в эфире и по MAC-адресу определял их производителя – и такого инструмента я не нашел. Но раз уж имеем дело с гиковским девайсом, то решено: пойдем до конца и напишем приложение сами. Тем более что платформа Maemo в этом плане крайне дружелюбна.

Устанавливаем среду разработки

Основным языком разработки для Maemo 5, как и для любого другого Linux, конечно же, является Си. Подробный Maemo 5 SDK, содержащий линуксовые утилиты и необходимые привязки, — лишнее тому подтверждение. Но программирование на Си безусловно требует серьезных навыков программирования, задача еще больше усложняется необходимостью изучения мобильной платформы. Но! Для Maemo5 доступен полноценный интерпретатор Python и, что не менее важно, портированы многочисленные библиотеки. Значит можно использовать всю простоту питона и без лишней прелюдии взяться за разработку нашего приложения!

Интерпретатор Python доступен в виде пакета maemo-python-device-env в менеджере приложений. Убедиться, что интерпретатор установился правильно, можно, открыв X Terminal и набрав команду python. После этого ты окажется в приветственной консоли интерпретатора:

Python 2.5.4 (r254:67916, Oct 9 2009, 00:02:36)
[GCC 4.2.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>>

В принципе можно попробовать запустить какой-нибудь несложный сценарий на Python'е уже сейчас, используя специально заготовленный bash-скрипт: run-standalone.sh <название_скрипта.py>. Для этого подошел бы стандартный текстовый редактор, но это не сильно удобно. Конечно, можно заниматься разработкой скрипта на компьютере и далее вручную перекидывать его на телефон по SSH/SCP или еще каким-нибудь, но и это не лучший вариант: о человеческой отладке пришлось бы забыть. Впрочем, все эти заботы не к чему, потому как для разработки Python-приложений для Maemo есть замечательная IDE — Pluthon. Основанная на всем известном Eclipse’е, она позволяет разрабатывать и отлаживать скрипт на компьютере, а тестировать его прямо на телефоне. Причем этот вариант подходит для любой платформы: винды, линукса или мака. Для запуска понадобится лишь скачать два архива с pluthon.garage.maemo.org и распаковать их в одну папку. Помимо этого требуется, чтобы в системе был установлен JRE (java.sun.com). Все необходимое можно не качать, а взять с нашего диска.

Подготовка проекта

Позаимствованный у PyDev редактор кода предоставляет все прелести IDE: автодополнение кода, сниппеты, подсказки — все, что и без того может ускорить разработку. Далее схема действия Pluthon очень простая: разрабатываемый скрипт по команде на запуск перебрасывается через SSH на телефон и уже на мобильной платформе начинается его исполнение. По этой причине важно, чтобы на N900 был установлен OpenSSH сервер, это легко делается через менеджер пакетов (подробнее читай в статье прошлого номера). Особенно приятно, что телефон вовсе необязательно подключать по USB к компьютеру: намного удобнее это сделать через беспроводные Bluetooth или Wi-fi. Попробуем?

Для начала создадим новый проект (меню File -> Pluthon Project -> Empty Python Project), далее жмем Next и выбираем способ удаленного подключения к телефону. Какой бы способ ты ни выбрал — USB, Bluetooth, WLAN ad-hoc — не поленись зайти в настройки. Здесь необходимо правильно указать IP-адрес девайса, а также имя пользователя для работы в системе. Чтобы не было проблем я обычно отлаживаю программы под рутом, хотя это и может быть небезопасно. Далее нажатием на кнопку Finish мы создаем проект.

Тут надо сказать, что по умолчанию Python установлен в «голом» виде, в нем практически нет готовых модулей. Поэтому все приходится устанавливать дополнительно в виде специального пакета PyMaemo, представляющего собой сборку сортированных модулей для платформы Maemo. Нас в первую очередь интересуют два модуля:

  • PyMaemo/HildonDesktop, предоставляющий привязки для использования интерфейса Maemo;
  • PyBluez — обертка для простого использования встроенного Bluetooth.

В ином бы случай, PyMaemo пришлось устанавливать вручную, но Pluthon в момент создания нового проекта предлагает проверить мобильное устройство на наличие необходимых для комфортной разработки библиотек. В случае необходимости, все подкачивается из инета и устанавливается автоматически, а тебе остается лишь смотреть на сообщения в логе.

Приступаем к разработке

Теперь, вернемся к нашей задаче — нам необходимо просканировать Bluetooth-эфир. Установив PyMaemo, который включает обертку PyBluez, мы сильно облегчили себе задачу, потому как у нас больше нет необходимости заморачиваться по поводу низкоуровнего взаимодействия с BT-модулем (вот они прелести Python!). Библиотека все сделает сама: главное не забыть ее импортировать, поэтому делаем это в первую очередь:

import bluetooth

Операция по поиску беспроводных устройств в эфире называется Discover и реализована в библиотеке bluetooth как один из методов. Причем в качестве параметров можно указать, определять ли имена устройств (их числовой идентификатор, например, step_nokia, N900-phone и т.д.) или нет. В ответ функция возвратит список, в котором будут имена устройств и их MAC-адреса — естественно в случае, если таковые имеются. Присвоим результат сканирования переменной nearby_devices:

nearby_devices = bluetooth.discover_devices(lookup_names = True)

Теперь остается только вывести результат сканирования. Для простоты примера представим, что имеем дело с обычном консольным приложением и для вывода будем использовать стандартную функцию для вывода текстовых данных:

print "found %d devices" % len(nearby_devices)
for addr, name in nearby_devices:
print " %s - %s" % (addr, name)

Теперь соединяем все вместе и через меню Run -> Run отдаем команду на запуск, предварительно проверив, что на телефоне включен Bluetooth. В момент первого запуска Pluthon поинтересуется, каким образом ему переносить исходник на мобильное устройство: безопасно монтировать удаленный диск или копировать скрипт по SSH. Второй вариант не требует настройки, поэтому будем использовать его. Единственное, что нужно, — это ввести пароль пользователя, который ты ранее указывал в момент настройки подключения. Если ты так же, как и я, указал root, то вспомни тот пароль, который указав в момент установки приложения rootsh.

В случае успеха, в панели для отладки PluThon отобразится вывод скрипта: имена всех найденных устройств, а также их MAC-адреса. Можно также запустить сценарий из консоли: передав название скрипта в качестве аргумента run-standalone.sh. Правда, прямо скажем, что на мобильное приложение это пока явно непохоже.

Создаем интерфейс через Qt

Чего не хватает нашей программе, так это полноценного графического интерфейса. К счастью, существует несколько вариантов наверстать упущенное. Можно, как и для более ранних версий Maemo, использовать библиотеку GTK. Но раз уж компания Nokia приобрела небезызвестный набор библиотек Qt и тем более портировала его для Maemo5, то было бы глупо отказываться от использования новой технологии. Причем если ты уже имел опыт разработки с использованием Qt, то ничего ровным счетом не изменится: на N900 все работает точно так же, как и под виндой или обычным линуксом. Вплоть до того, что можно взять готовые примеры и без труда запустить их на мобильной платформе!

Поскольку приложение мы разрабатываем на Python, то необходимо установить для Qt необходимые привязки: PyQt (www.riverbankcomputing.co.uk) или PySide (www.pyside.org). Мы будем использовать первый вариант. Для этого, как в Debian или Ubuntu воспользуемся пакетным менеджером apt-get. Открываем консоль, переходим в режим рута (sudo gainroot) и далее набираем команду для инсталляции PyQt (пакет называется python2.5-qt4):

apt-get install python2.5-qt4

Для того чтобы вникнуть в азы проектирования интерфейсов на Qt рекомендую прочитать очень доходчивый мануал, который выложен на диск. А пока попробуем на нашем примере разобрать общие черты приложения. Первым делом импортируем нужные библиотеки Qt:

import sys
from PyQt4 import QtGui, QtCore
import bluetooth

Далее создаем класс с нашим основным окном и обозначим для него заголовок «N900 Bluetooth-scanner»:

class MainWindow(QMainWindow):
def __init__(self, *args):
apply(QMainWindow.__init__, (self,) + args)
self.setWindowTitle('N900 Bluetooth scanner')

Главным компонентом окна ListBox, в который мы поместим вывод информации о найденных устройствах:

self.listbox=AssociativeListBox(self)

Как и в предыдущем примере получаем информацию об устройствах в эфире с помощью метода discover_devices() и добавляем имя и MAC-адрес устройства в наш Listbox, используя цикл:

nearby_devices = bluetooth.discover_devices(lookup_names = True)
for addr, name in nearby_devices:
self.listbox.insertItem(addr, name)

Далее создаем экземпляр объект нашего окна и запускаем цикл с обработчиком событий:

app = QtGui.QApplication(sys.argv)
qb = MainWindow()
qb.show()
sys.exit(app.exec_())

Теперь можно оформить наше приложение в виде Debian-пакета, готового к установке. В этом опять же нас выручит среда разработки Pluthon. Достаточно запустить специальный мастер через меню Export -> PluThon -> Export to Debian Package, после чего выбрав платформу Maemo, получить готовый к распространению пакет.

Дальнейшая разработка

Теперь, когда наша программа получило очертания обычного для N900 приложение и выполняет вполне конкретную цель, можно дополнить интерфейс дополнительными элементами. Я добавил кнопку «Начать сканирование» и реализовал сканирование эфира по запросу, а используя базу «MAC-адрес – производитель», реализовал определение имени производителя. Исходники мы выложили на наш DVD. Более того, возможности PyBluez позволяют легко определить, какие сервисы предоставляет беспроводное устройство, а значит, ты без труда сможешь реализовать и такую возможность!

Важно, что для начала разработки приложения не надо морочить голову с изучением новой платформы. Используя уже имеющиеся знаний Python’а и библиотеку Qt, мы сходу смогли разработать работоспособное приложение для Nokia N900. Осталось выложить его в девелоперский репозитарий :).

Взято с http://www.xakep.ru/post/51198/default.asp


Ведете ли вы блог?

Да
Нет
Планирую


Результаты опроса

Новостной блок