Пишем программу на Python под Symbian в Ubuntu

November 6, 2009, revised November 9, 2009 Bluetooth obexfs PyS60 Python Symbian Symbian S60v5

Если бы я знал, что программы для 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, но мне это в ближайшее время ни к чему.

Buy Me a Coffee at ko-fi.com