Easy - Workshop de Software Livre
Transcrição
Easy - Workshop de Software Livre
Easy: uma API baseada em Python para facilitar o desenvolvimento de aplicações para a plataforma maemo Miguel Falcão1 , André Hora1 , Emanuel Filho1 , Mario Hozano1 , Luciano Wolf2 , Hyggo Almeida1 , Angelo Perkusich1 1 2 Laboratório de Sistemas Embarcados e Computação Pervasiva Centro de Engenharia Elétrica e Informática Universidade Federal de Campina Grande (UFCG) 58.109-900 – Campina Grande – PB – Brasil Instituto Nokia de Tecnologia (INdT) - 51.020-350 – Boa Viagem – Recife-PE – Brasil {miguelaugusto,andre,emanuel,hozano,hyggo,angelo}@embedded.ufcg.edu.br [email protected] Abstract. This paper presents the Easy API, which provides an abstraction level to ease the development of applications for the Linux-based maemo platform. We present examples of using Easy as well as a description of underlying lowlevel tools. Finally, we describe an application that puts several Easy functionalities together. Resumo. Neste artigo introduz-se a API Easy, que provê uma camada de abstração para facilitar o desenvolvimento de aplicações para dispositivos portáteis que utilizam a plataforma maemo, baseada em Linux. São apresentados exemplos de utilização da Easy, assim como as ferramentas de baixo nı́vel utilizadas pela API. Por fim, apresenta-se um exemplo de aplicação que reúne várias funcionalidades da Easy. 1. Introdução Nos últimos anos dispositivos móveis como celulares têm agregado funcionalidades de outros aparelhos, tornando-se dispositivos com múltiplos propósitos. Nesse sentido, é possı́vel verificar tais aparelhos reunindo funções para capturar imagens, gravar som, armazenar dados, tocar músicas, rádio FM, utilizar GPS1 além de realizar ligações telefônicas. Ao passo em que novas funcionalidades são agregadas, uma maior complexidade no desenvolvimento de aplicações para estes dispositivos é promovida. Afinal, é necessário ao desenvolvedor o conhecimento da interface de acesso a estes recursos e da plataforma de desenvolvimento, além de contar com as limitações de processamento, memória e bateria encontradas no dispositivo que vai executar a aplicação desenvolvida [Forman and Zahorjan 1994]. As plataformas de desenvolvimento de aplicações para dispositivos móveis são relativamente recentes e suas informações escassas. Diante disso, a construção de aplicativos para dispositivos que as utilizam torna-se um desafio para muitos desenvolvedores. O que na visão de alguns parece ser apenas uma adaptação do desenvolvimento de aplicações para computadores convencionais (desktop), mostra-se extremamente diferente no que se refere à forma de implementação, no acesso aos recursos utilizados e na estrutura de funcionamento da plataforma. Conseqüentemente, o grau de complexidade para desenvolver tais aplicações é incrementado, tornando necessária a existência de camadas de abstração, evitando um conhecimento detalhado em determinadas tecnologias mais complexas ou de mais baixo nı́vel. Neste artigo introduz-se a API 2 Easy, uma camada de abstração para o desenvolvi1 2 Global Positioning System Application Programming Interface mento de aplicações sobre maemo [Maemo 2008], uma plataforma de desenvolvimento para dispositivos móveis baseada em Linux. A API Easy tem como objetivo principal prover simplicidade e clareza no acesso aos recursos da maemo, facilitando assim o trabalho para a comunidade de desenvolvedores. Ela é distribuı́da de acordo com a LGPL e implementada em Python [Lutz and Ascher 2004]. O restante deste trabalho está estruturado da seguinte forma: a Seção 2 faz uma breve apresentação da plataforma maemo e apresenta o código de um player de vı́deo implementado na mesma. A Seção 3 descreve a API Easy apresentando sua arquitetura com seus diferentes módulos e exemplos de uso. A Seção 4 ilustra aplicações mais elaboradas utilizando Easy como um player de vı́deo implementado com a API. Por fim, a Seção 5 contém considerações finais do trabalho. 2. A Plataforma maemo A plataforma maemo provê um conjunto de componentes para desenvolvimento para dispositivos móveis baseados em Linux, como os Internet Tablets Nokia 770, N800 e N810. Atualmente em sua quarta versão, ela é distribuı́da com código aberto, reunindo componentes (frameworks) amplamente utilizados em sistemas convencionais e dispositivos móveis, como GTK+ [Krause 2007], D-Bus [D-Bus 2008], Hildon [Hildon 2008] entre outras tecnologias de software livre. Listagem 1. Player de Vı́deo implementado em Python com GTK+ e GStreamer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 import p y g t k , g t k , p y g s t , g s t , h i l d o n class Video Player : def init ( self ) : window = h i l d o n . Window ( ) window . c o n n e c t ( "destroy" , g t k . m a i n q u i t ) vbox = g t k . VBox ( ) hbox = g t k . HBox ( ) s e l f . entry = gtk . Entry ( ) s e l f . e n t r y . s e t t e x t ( "/home/user/MyDocs/.videos/Nokia_N810.avi" ) s e l f . b u t t o n = g t k . B u t t o n ( "Start" ) s e l f . b u t t o n . c o n n e c t ( "clicked" , s e l f . s t a r t s t o p ) s e l f . movie window = g t k . DrawingArea ( ) window . add ( vbox ) vbox . p a c k s t a r t ( hbox , F a l s e ) hbox . add ( s e l f . e n t r y ) hbox . p a c k s t a r t ( s e l f . b u t t o n , F a l s e ) vbox . add ( s e l f . movie window ) window . s h o w a l l ( ) s e l f . p l a y e r = g s t . e l e m e n t f a c t o r y m a k e ( "playbin" , "player" ) bus = s e l f . p l a y e r . g e t b u s ( ) bus . a d d s i g n a l w a t c h ( ) bus . e n a b l e s y n c m e s s a g e e m i s s i o n ( ) b u s . c o n n e c t ( "message" , s e l f . o n m e s s a g e ) s e l f . b i n = g s t . Bin ( "bin" ) v i d e o s c a l e = g s t . e l e m e n t f a c t o r y m a k e ( "videoscale" ) s e l f . b i n . add ( v i d e o s c a l e ) pad = v i d e o s c a l e . g e t p a d ( "sink" ) g h o s t p a d = g s t . G h o s t P a d ( "sink" , pad ) s e l f . bin . add pad ( ghostpad ) v i d e o s c a l e . s e t p r o p e r t y ( "method" , 1 ) conv = g s t . e l e m e n t f a c t o r y m a k e ( "ffmpegcolorspace" , "conv" ) ; s e l f . b i n . add ( conv ) s e l f . v i d e o s i n k = g s t . e l e m e n t f a c t o r y m a k e ( "xvimagesink" ) s e l f . b i n . add ( s e l f . v i d e o s i n k ) g s t . e l e m e n t l i n k m a n y ( v i d e o s c a l e , conv , s e l f . v i d e o s i n k ) s e l f . p l a y e r . s e t p r o p e r t y ( "video-sink" , s e l f . b i n ) def s t a r t s t o p ( s e l f , widget ) : i f s e l f . b u t t o n . g e t l a b e l ( ) = = "Start" : s e l f . v i d e o s i n k . s e t x w i n d o w i d ( s e l f . movie window . window . x i d ) s e l f . b u t t o n . s e t l a b e l ( "Stop" ) s e l f . p l a y e r . s e t p r o p e r t y ( "uri" , "file://" + s e l f . e n t r y . g e t t e x t ( ) ) s e l f . p l a y e r . s e t s t a t e ( g s t . STATE PLAYING ) else : s e l f . p l a y e r . s e t s t a t e ( g s t . STATE NULL ) 52 53 54 55 56 57 58 59 60 61 62 s e l f . b u t t o n . s e t l a b e l ( "Start" ) d e f o n m e s s a g e ( s e l f , bus , m e s s a g e ) : t y p e = message . t y p e i f t y p e = = g s t . MESSAGE EOS : s e l f . p l a y e r . s e t s t a t e ( g s t . STATE NULL ) s e l f . b u t t o n . s e t l a b e l ( "Start" ) Video Player () g t k . gdk . t h r e a d s i n i t ( ) g t k . main ( ) A utilização da maemo no desenvolvimento de novas aplicações se dá através da linguagem C, caracterı́stica das plataformas Linux. Os desenvolvedores podem criar aplicações em Python acessando seus componentes através de ligações (bindings) providas pelo projeto PyMaemo [PyMaemo 2008]. Embora seja uma plataforma aberta e baseada em Linux, o acesso aos recursos dos dispositivos que a utilizam exige um bom nı́vel de experiência com os frameworks utilizados. Ilustrando esse fato pode-se observar a Listagem 1 que apresenta o código de um player de vı́deo na linguagem Python (PyMaemo) que utiliza os frameworks GTK+ para construção da interface gráfica (linhas 6 a 20) e GStreamer [GStreamer 2008] para implementação das funções multimı́dia (linhas 22 a 58). Além de implementar muitas linhas de código na criação de uma interface gráfica para uma aplicação simples, o desenvolvedor necessita de conhecimentos mais profundos sobre pipelines, bins, pads e sinais do GStreamer para que possa reproduzir um vı́deo no visor aparelho. 3. A API Easy Easy é uma API escrita na linguagem Python que tem como objetivo criar uma camada de abstração para acessar os recursos oferecidos nos dispositivos maemo. Sua arquitetura, ilustrada na Figura 1, define módulos que acessam os recursos da plataforma através das ligações (bindings) providas pelo PyMaemo. Enquanto o PyMaemo oferece ligações para as funções dos componentes GStreamer, D-Bus, Hildon, GTK+, etc., a API Easy simplifica a utilização dos mesmos através de métodos diretos e intuitivos separados por módulos de áudio, câmera, rádio, Bluetooth, etc. Figura 1. Arquitetura da API Easy Utilizando a API Easy, os desenvolvedores podem aumentar sua produtividade, criando aplicações de forma rápida e com poucas linhas de código. Easy busca não só facilitar o desenvolvimento por programadores experientes, mas também tornar possı́vel a implementação de aplicações por programadores com algum conhecimento da linguagem Python. Abaixo são descritos com maiores detalhes os módulos da API. 3.1. Áudio Este módulo encapsula um conjunto de funcionalidades do GStreamer fornecendo métodos diretos para gravação e reprodução de arquivos de áudio. O módulo ainda inclui funções para o controle do volume, verificação da posição corrente, do seu tamanho e funções para busca no arquivo em reprodução. Um exemplo de implementação é apresentado na Listagem 2, em que com três linhas de código é possı́vel fazer a gravação do som obtido pelo microfone e em seguida reproduzi-lo nos alto-falantes do dispositivo. Após carregar os módulos necessários (Linha 1), é realizada a gravação durante 30 segundos (Linha 2) e, em seguida, sua reprodução (Linha 3). Listagem 2. Gravação e reprodução utilizando o módulo de Áudio 1 2 3 from e a s y import a u d i o a u d i o . r e c o r d ( f i l e n a m e =’my_audio.wav’ , r e c o r d t i m e = 3 0 ) a u d i o . p l a y ( f i l e n a m e =’my_audio.wav’ ) 3.2. Câmera Neste módulo são tratadas as funções referentes à manipulação da câmera do dispositivo e reprodução de vı́deos. Estão presentes métodos para gravação e reprodução em arquivos de vı́deo, assim como a captura de fotos. Outras funções que estão incorporadas são: a mudança de propriedades do vı́deo (brilho, contraste e saturação), busca em arquivo e a verificação da duração e posição corrente do vı́deo em reprodução. Assim como o Áudio, este módulo utiliza o framework GStreamer para acessar os recursos do dispositivo, neste caso a câmera e o visor. O código apresentado na Listagem 3 exibe a imagem capturada pela câmera no visor do aparelho (Linha 2), realiza a gravação de um vı́deo com 30 segundos (Linha 3) e em seguida o reproduz (Linha 4). Na Linha 5 é capturada uma foto utilizando a câmera. Listagem 3. Gravação, reprodução e captura de imagem com o módulo Câmera 1 2 3 4 5 from e a s y import c a m e r a camera . s t a r t ( ) c a m e r a . r e c o r d ( f i l e n a m e =’my_video.avi’ , r e c o r d t i m e = 3 0 ) c a m e r a . p l a y ( f i l e n a m e =’my_video.avi’ ) c a m e r a . c l i c k ( f i l e n a m e =’my_photo.jpg’ ) 3.3. Rádio O módulo Rádio é uma abstração da utilização do chip de rádio FM presente em alguns dispositivos maemo. As funções presentes no módulo provêem a reprodução de estações de rádios FM (broadcast) com métodos para sintonização manual, busca automática de estações e controle de volume. O código apresentado na Listagem 4 permite inicializar o chip de rádio FM do aparelho (Linha 2), sintoniza-o com a freqüência de 93.1MHz (Linha 3) e em seguida realiza a sintonização automática para próxima estação disponı́vel (Linha 4). Listagem 4. Sintonia de estações de rádio FM utilizando o módulo Rádio 1 2 3 4 from e a s y import r a d i o radio . s t a r t () radio . tune (93100) radio . next station () 3.4. Outros módulos A API Easy possui mais quatro módulos para facilitar a implementação de aplicações na plataforma maemo. São estes: • Bluetooth: composto por funções para a manipulação do Bluetooth integrado. Algumas funções disponibilizadas são: descoberta de dispositivos, serviços e transferência de arquivos. O módulo utiliza o projeto LightBlue [LightBlue 2008], uma API para simplificar o acesso ao Bluetooth em Python. • Contatos: permite a manipulação dos contatos armazenados no dispositivo maemo. As principais funções disponibilizadas são: adição, remoção e consultas dos contatos. Utiliza a biblioteca Evolution-Python [PyMaemo 2008]. • E-mail: composto por funções para enviar e-mails através da biblioteca smtplib. • UI: permite a criação rápida de interfaces gráficas baseadas em GTK+ utilizando o projeto Eagle [Eagle 2008]. A página do projeto Easy3 disponibiliza exemplos de utilização de todos os módulos supracitados. Alguns destes exemplos são ilustrados na Seção 4. 4. Aplicações utilizando a API Easy O escopo da API Easy não se resume apenas à sua utilização para implementar pequenos scripts como os apresentados na seção anterior. Projetos mais elaborados com interface gráfica utilizando o módulo UI podem ser implementados, favorecendo a criação de aplicações com código claro e pequeno. Exemplos de utilização para a API Easy incluem player de áudio (Figura 2), player/gravador de vı́deo (Figura 3), rádio FM, gerenciador de contatos, etc. Os exemplos supracitados foram implementadas utilizando apenas os módulos do projeto Easy e encontram-se no repositório do projeto. Figura 2. Player de Áudio Figura 3. Player/gravador de Vı́deo As interfaces gráficas destes exemplos foram implementadas com Eagle, uma biblioteca Python que ajuda no desenvolvimento de GUIs. O Eagle foi encapsulado integralmente no módulo de UI por apresentar uma filosofia semelhante à do Easy, criando uma camada de abstração facilitando a criação de GUIs. Observando o código apresentado na Listagem 5 é possı́vel verificar a simplicidade na criação de aplicações utilizando Easy. O código implementa um player de vı́deos ilustrado na Figura 3. Além das funções do player a aplicação permite gravar vı́deos capturados pela câmera do dispositivo. Comparando o player implementado com a API Easy e o apresentado na Listagem 1 é possı́vel perceber a grande redução no número de linhas de código. Sua interface gráfica é implementada com apenas 6 linhas (linhas 15 a 21) e as funções de multimı́dia do player e do gravador de vı́deos correspondem às linhas 3 a 13. 3 http://easy.garage.maemo.org/ Listagem 5. Aplicação mais elaborada utilizando Easy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 from e a s y import camera , e a g l e d e f r e c o r d ( app , b u t t o n ) : c a m e r a . r e c o r d a s y n c ( app [ ’filename’ ] ) d e f s t o p ( app , b u t t o n ) : camera . s t o p r e c o r d i n g ( ) d e f p l a y ( app , b u t t o n ) : c a m e r a . p l a y ( f i l e n a m e = app [ ’filename’ ] ) d e f p a u s e ( app , b u t t o n ) : camera . pause ( ) app = e a g l e . App ( t i t l e =’Easy Player’ , t o p = ( e a g l e . E n t r y ( i d =’filename’ , v a l u e =’/home/user/record.avi’ ) , e a g l e . B u t t o n ( i d =’record’ , l a b e l =’Record’ , c a l l b a c k = r e c o r d ) , e a g l e . B u t t o n ( i d =’stop’ , l a b e l =’Stop Record’ , c a l l b a c k = s t o p ) , e a g l e . B u t t o n ( i d =’play’ , l a b e l =’Play’ , c a l l b a c k = p l a y ) , e a g l e . B u t t o n ( i d =’pause’ , l a b e l =’Pause’ , c a l l b a c k = p a u s e ) ) , c e n t e r = e a g l e . XWindow ( i d =’xwindow’ ) ) c a m e r a . s e t w i n d o w i d ( app [ ’xwindow’ ] . g e t w i n d o w i d ( ) ) eagle . run ( ) 5. Considerações Finais Atualmente a API Easy encontra-se na versão 0.3 e pode ser executada na plataforma maemo 3.x. Uma nova versão já está sendo preparada para o maemo 4.0 devido a algumas modificações realizadas na estrutura da plataforma. Como trabalhos futuros estão a implementação de novos módulos, incluindo a manipulação de aplicações com GPS e o tratamento de mensagens instantâneas sob protocolos existentes. Informações sobre contribuições, implementação, cadastro de bugs, listas de discussão e novidades podem ser obtidas no site do projeto. 6. Agradecimentos Os autores agradecem ao Instituto Nokia de Tecnologia (INdT) pelo apoio financeiro para a realização desse trabalho. Referências D-Bus (2008). D-Bus. http://freedesktop.org/wiki/Software/dbus. Acessado em 05/03/2008. Eagle (2008). Eagle is a python library to help GUI development. http://gustavobarbieri.com.br/eagle/. Acessado em 05/03/2008. Forman, G. H. and Zahorjan, J. (1994). The challenges of mobile computing. Computer, 27(4):38–47. GStreamer (2008). GStreamer: open source multimedia framework. http://gstreamer.freedesktop.org/. Acessado em 05/03/2008. Hildon (2008). Hildon. http://live.gnome.org/Hildon. Acessado em 05/03/2008. Krause, A. (2007). Foundations of GTK+ Development. Apress, Berkely, CA, USA. LightBlue (2008). Lightblue: a cross-platform python bluetooth api. http://lightblue.sourceforge.net/. Acessado em 05/03/2008. Lutz, M. and Ascher, D. (2004). Learning Python. O’Reilly, 2th edition. Maemo (2008). Maemo is the application development platform for internet tablets. http://maemo.org. Acessado em 05/03/2008. PyMaemo (2008). Python for Maemo. http://pymaemo.garage.maemo.org. Acessado em 05/03/2008.