Пишем программу на Python под Symbian в Ubuntu
November 6, 2009 , revised November 9, 2009 in SoftwareЕсли бы я знал, что программы для Symbian можно писать на таком удобном API к такому простому языку, как Python, я бы вообще никогда не задумывался о выборе телефона, а сразу брал Нокию (любую Нокию на Symbian S60, а то и SE на UIQ). (Ну да, погуглил, оказывается, на Android тоже есть питоновский API, а вот на Windows Mobile ничего такого нету). Короче, взялся пробовать.
Все нижеописанное проверялось на Nokia 5800 + Ubuntu Karmic. С Питоном я никогда дел не имел, кроме разве что недолгого колупания в Django, так что про него могу говорить глупости. Поправляйте, пожалуйста.
Установка Python в телефон – PyS60
Качаем Python и PythonScriptShell. Второй пакет не подписан, подписать можно на Symbian Signed, после чего оба пакета благополучно устанавливаются в телефон. Первый никак себя не проявляет, зато второй добавляет консоль, работающую по блютусу или прямо с телефона, а также интерпретатор.
Документация
Документация по питону, в частности – документация по платформе S60. Она очень подробная, практически как учебник.
Настройка Python Bluetooth Console
Пробрасываем порт для Bluetooth (единоразово)
sudo apt-get install bluez-utils # если еще чего-то надо, отписывайтесь sdptool add-channel=2 SP
Открываем порт на прослушивание (перед соединением)
rfcomm listen rfcomm2 2
Теперь запускаем на телефоне консоль, просим подключиться к компьютеру. rfcomm на это должен заявить, что соединение установлено. Осталось открыть консоль (rfcomm не убиваем):
screen /dev/rfcomm2
Пишем питоновский код, он выполняется на телефоне. По-моему, это удобно только для проверки возможностей телефона на лету, например, попробуй:
import audio audio.say("This is the phone talking")
Редактирование файлов на телефоне с помощью obexfs
Зачем вообще копировать скрипты на телефон? Давай писать их прямо там.
Товарищи питоновцы придумали ряд велосипедов для передачи файлов между телефоном и компьютером, и, так сказать, облегченной отладки. Не пойму, зачем, если есть старый добрый протокол OBEX. Однако GVFS-модуль (тот самый, который «Обзор файлов на устройстве» из gnome-bluetooth) не позволил мне редактировать файлы в vim. Зато obexfs
позволил:
sudo apt-get install obexfs # узнаем MAC-адрес телефона hciconfig reset hcitool scan # монтируем mkdir ~/phone obexfs -b MA:CA:DD:RE:SS ~/phone # готово! cd ~/phone/E:/data/python vim helloworld.py
Напомню, что в питоновской консоли есть возможность запускать скрипты из папки E:\data\python
. Невероятно удобно, никаких эмуляторов не нужно.
Кстати, obexfs работает и без блютуса, то есть по USB.
UPD 9.11.2009: увы, obexfs не хочет передавать дату изменения файлов. Поэтому я не рекомендую использовать его ни для чего, кроме отладки скриптов. А еще питон отказывается подключать модули без даты изменения, потому я написал скрипт, который ее проставляет автоматически.
Эмулятор appuifw на wxWidgets
А еще можно отлаживать GUI на Linux. Для этого добрые люди написали библиотечку PyS60-compat –
правда, она не на 100% совместима с телефонным API, так что использовать ее надо осторожно. Может, дело в каких-то тонкостях питона, которые я пока не знаю, но примитивная программа, запустившаяся у меня на компьютере, отказалась работать на телефоне, пока я не поменял кавычки на двойные.
Нечто работающее
А вот и кусок работающего кода. Это так, чтоб скопипастить и проверить, что все работает.
Да, русские символы, как и многие другие, вполне поддерживаются, поскольку API использует UTF-8.
# -*- coding: utf-8 -*- import appuifw, e32 # Событие на выбор элемента в списке def lbox_observe(): appuifw.note(items[lb.current()]) # Событие на кнопку выхода def quit() app_lock.signal() # Настройка приложения appuifw.app.title = u"Listbox" appuifw.app.screen = 'normal' appuifw.app.exit_key_handler = quit # Элементы списка items = [u"1",u"2",u"проверка",u"an item",u"foobar"] # Создаем список и показываем его lb = appuifw.Listbox(items, lbox_observe) appuifw.app.body = lb # Основной поток приложения окончен, ждем сигнала о завершении работы app_lock = e32.Ao_lock() app_lock.wait()
Что еще?
Куча примеров из книги Mobile Python Book.
Всякие полезности в Nokia Wiki.
Еще хорошо бы разобраться с созданием SIS-пакетов в Ubuntu, но мне это в ближайшее время ни к чему.
Понравился пост? Купи мне кофе