A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Python for Series 60 Elvis Pfützenreuter – INdT Original de Osvaldo Santana Neto

Apresentações semelhantes


Apresentação em tema: "Python for Series 60 Elvis Pfützenreuter – INdT Original de Osvaldo Santana Neto"— Transcrição da apresentação:

1 Python for Series 60 Elvis Pfützenreuter – INdT Original de Osvaldo Santana Neto

2 Instituto Nokia de Tecnologia (INdT) Mecânica, logística, telecom, software Plataforma Maemo (Nokia N810 e outros) Python for Maemo e outras plataformas De kernel/SDK a UIs inovadoras

3 O que são celulares Série 60 ou Symbian Smartphones com capacidade de processamento respeitável Sistema operacional Symbian Plataforma Série 60: Symbian + interface de usuário + recursos adicionais Restou apenas a Nokia no consórcio Symbian

4 Desenvolvimento C++ para S60 SDK completo gratuito em SDK inclui emulador Alguns recursos mais avançados são pagos (JTAG) API C++ do Symbian é sui generis e canhestra Progressiva adoção de APIs open-source (Qt, OpenC) _LIT(KFileName, "C:\\file1"); RFile fd; RFs fs; fs.Connect(); CleanupClosePushL(fs); User::LeaveIfError(fd.Open(fs, KFileName, EFileShareExclusive | EFileWrite)); CleanupClosePushL(fd); TBuf8 buf; myFile.Read(0, buf); myFile.Close(); fs.Close(); CleanupStack::PopAndDestroy(2); char buf[8]; fd = open(C:\\file1, O_RDWR); int len = read(fd, buf, 8); close(fd);

5 Por que desenvolver para S60 Mais de milhões de celulares vendidos Distribuição do aplicativo: uma vez assinado, não sofre qualquer restrição Previsões ainda apontam como plataforma dominante para os próximos anos Várias opções de linguagem: J2ME, C++, Qt, Python Plataforma fechada aberta e SDK gratuito Existe mercado e comunidade de desenvolvedores

6 Por que usar Python para S60 Desenvolvimento C++ é difícil Desenvolver para mobile é ainda mais difícil As APIs e ferramentas dos fabricantes não ajudam O Python resolve muitos destes problemas por introduzir uma camada de abstração

7 Desvantagens do PyS60 Desempenho pode ser um problema solução: módulos Python escritos em C/C++ Nem toda a API C++ do Symbian está coberta solução: idem

8 Salada de versões dos softwares PythonPyS60Série 60Symbian 2.2<= nd Edition 3 rd Edition 6.x até 8.x 6600, 6681, N70 9.x N85, N95, N82, N , rd Edition 5 th Edition 9.x N85, N95, N82, N96 N97, XPressMusic Este curso é baseado no PyS para dispositivos 3 rd Edition

9 Obter e instalar o PyS60 Distribuição para Windows Distribuição genérica PyS60 para SDK Versão 3.2 https://garage.maemo.org/projects/pys60/

10 Obter e instalar o PyS60 (cont.) Instalar via Bluetooth ou PC Suite; prefira instalar no cartão de memória (D:) Interpretador (inclui OpenC PIPS) Shell interativo Assinado Nokia alta capacidade Shell interativo Auto-assinado para S60 3.2

11 Shell interativo PyS60

12 Terminal Bluetooth via Windows

13 Terminal Bluetooth via Mac OS X Celular conecta

14 Terminal Bluetooth via Linux Celular conecta

15 Terminal via Bluetooth - PyS60 Aviso: O perfil Serial Port do Bluetooth é temperamental Tentar conectar algumas vezes É interessante parear e liberar antes Se nada mais der certo, tente desligar celular, computador, ou ambos Console/terminal via cabo USB

16 Rodando PyS60 no emulador

17 Python versus modelo de segurança Pacote SIS original não instalável Crypto Certificado X.509 do desenvolvedor Pacote SIS assinado e instalável Capacidades requisitadas pelo aplicativo Escopo de distribuição requisitado Homologação $$$$$$$$$ Auto- -assinado Assinado CA Symbian $$$ Vide Symbian Signed Open Signed !$

18 Python versus modelo de segurança Pacote SIS de aplicativo Python - é um executável - pode ter menos capacidades que o runtime - suas capacidades determinam o que os scripts podem fazer - contém scripts e módulos Python - PyScriptShell = um simples aplicativo escrito em Python - FAQ como utilizar o PyScriptShell assinado pela Nokia? Runtime PyS60 - Python_1.9.7.sis - é uma biblioteca - assinada pela Nokia - muitas capacidades Módulo em C/C++ (opcional) - tem de possuir no mínimo as mesmas capacidades do aplicativo Scripts Python - arquivos-texto - elementos passivos

19 Python versus modelo de segurança Shell high-capas assinado pela Nokia Instalar script no cartão de memória via USB; ou criar um pacote SIS (veremos mais adiante) Instalar scripts via Bluetooth ou SMS não funciona Truque: ZIPar e mandar IMPORTANTE: instalar PyS60 no cartão de memória (D:) D:\data\python\ D:\private\20022ee9\

20 Python versus modelo de segurança

21 Comprando um celular Série 60 para fins de desenvolvimento Modelos que já utilizei com PyS60: N-Gage QD, 6600, 6681, N93, N95, N85 Prefira modelos recentes, 3 rd Edition FP1 ou superior (N95, N85, N82, N96) Verifique a lista de compatibilidade do PyS60 para evitar surpresas Celulares 2 nd Edition: última versão do PyS60 que suporta é a 1.4.6

22 Módulos Python específicos para Symbian

23 Módulos Python para Symbian Relativamente fáceis de usar Poucos tipos novos Strings mágicas Protocolos informais via listas/tuplas/dicts Mesmo método pode ser sync & async Diferença = passar callback como parâmetro Não esquecer dos módulos padrão Python

24 Módulo e32 Caixa de ferramentas do Symbian Não serve para muita coisa, isoladamente Active Objects = análogo a main loop, glib No futuro, o Qt deve preencher esta função from e32 import * get_capabilities() drive_list() ao_sleep(1) ao_yield() is_ui_thread() s60_version_info x = Ao_lock() x.wait() # em outro lugar x.signal() x = Ao_timer() x.after(1, funcao) x.cancel()

25 Módulo e32 (continuação) import appuifw import e32 trava = e32.Ao_lock() def callback_sair(): print Apertou botao e32.ao_sleep(1) trava.signal() # acorda def main(): global trava appuifw.app.exit_key_handler = callback_sair trava.wait() # dorme main()

26 Módulo sysinfo Informações diversas sobre o dispositivo: sysinfo.battery() sysinfo.imei() sysinfo.signal_dbm() sysinfo.signal_bars() sysinfo.display_pixels()

27 Módulo appuifw Acesso à UI, o mais complexo dos módulos S60 Quem já usou PyGTK+, vai achar familiar appuifw.app : classe Application appuifw.app.body : Canvas, ListBox ou Text appuifw.app.menu Dialogs modais Form (widget composto) Ligação de eventos/teclas a ações No futuro, o Qt deve tomar o lugar deste módulo

28 Layout de uma aplicação S60

29 Módulo appuifw >>> import appuifw >>> appuifw.app.title = u"BLA" >> def tab_cb(n):... print "Mudou para tab", n... >>> appuifw.app.set_tabs([u"Um", u"Dois"], tab_cb) Mudou para tab 1 Mudou para tab 0 >>> appuifw.app.orientation = 'landscape' >>> appuifw.app.screen = 'large'

30 Módulo appuifw >>> def menu_cb(*algo):... print algo... >>> appuifw.app.menu = \ [(u"Item um", menu_cb), (u"Item dois", menu_cb)] >>> () >>> appuifw.selection_list([u"AAA", u"BBB"]) 1 >>> appuifw.query(u"Digite texto", u"text") u'Inconstitucional'

31 Módulo appuifw >>> appuifw.note(u"Fora Sarney", u"error") >>> def cb(*algo):... print algo... >>> f = appuifw.Form( [(u'Nome', 'text'), (u'Idade', 'number')]) >>> f.save_hook = cb >>> f.execute() ([(u'Nome', 'text', u'Boa'), (u'Idade', 'number', 18L)],)

32 Módulo graphics Classe Image e função screenshot() Câmera gera imagens da classe Image Image implementa API drawable appuifw.Canvas idem >>> i = graphics.Image.open("E:\\teste.jpg") >>> i.ellipse((0, 0, 100, 100), fill=0xff0000) >>> i.save("E:\\teste2.jpg")

33 Módulo camera Permite manipular a(s) câmera(s) Não funciona no emulador Symbian, mas há extensões para suprir esta função camera.cameras_available() i = camera.take_photo() # Image i.save(uE:\\imagem.jpg) canvas = appuifw.Canvas() appuifw.app.body = canvas canvas.blit(i)

34 import e32, camera, appuifw, key_codes def finder_cb(im): # pode manipular a imagem antes canvas.blit(im) camera.start_finder(finder_cb)... camera.stop_finder() i = camera.take_photo(size=(640,480)) Tirar foto usando a 2a câmera camera.take_photo(position=1) Não há viewfinder para 2a câmera Improvisar com take_photo()+blit() periódico ou tentar com camera.device[1].start_finder()

35 # Copyright Jurgen Scheible import e32, camera, appuifw, key_codes def finder_cb(im): canvas.blit(im) def take_picture(): camera.stop_finder() pic = camera.take_photo(size = (640,480)) w,h = canvas.size canvas.blit(pic,target=(0, 0, w, 0.75 * w), scale = 1) pic.save('e:\\teste.jpg') def quit(): app_lock.signal() canvas = appuifw.Canvas() appuifw.app.body = canvas camera.start_finder(finder_cb) canvas.bind(key_codes.EKeySelect, take_picture) appuifw.app.title = u"Camera" appuifw.app.exit_key_handler = quit app_lock = e32.Ao_lock() app_lock.wait()

36 import e32, camera, appuifw def finder_cb(im): canvas.blit(im) def status_cb(*algo): print algo canvas = appuifw.Canvas() appuifw.app.body = canvas camera.start_finder(finder_cb) camera.start_record(e:\\video.mpeg, status_cb) e32.ao_sleep(10) camera.stop_record() camera.stop_finder() camera.release()

37 Módulos gles/glcanvas Módulo de acesso ao OpenGL/ES OpenGL/ES é acelerado por hardware nos celulares Nokia N93, N95 e N82 (N97?) Não será abordado aqui Exemplo: script gles.py

38 Módulo audio Funciona no emulador audio.say(uBla) Classe audio.Sound s = Sound.open(ue:\\arquivo.wav) s.record() Cumulativo, não trunca Se durante ligação, grava ligação s.stop() s.play()

39 Módulo telephone telephone.dial( ) telephone.hang_up() Fazer e atender ligações Gravação de áudio: vide módulo audio

40 Módulo sensor API diferente em FP1 e >= FP2 3 rd Edition FP1: Sensor (N95, N93) from sensor import * sensor_type = sensors()['RotSensor'] N95_sensor = Sensor(sensor_type['id'], sensor_type['category']) N95_sensor.set_event_filter(RotEventFilter()) def get_sensor_data(status): print status N95_sensor.connect(get_sensor_data)

41 Módulo sensor >= 3 rd Edition FP2 (N85, N96, N97...) import sensor from sensor import * accel = RotationData() # AccelerometerXYZAxisData() >>> accel.start_listening() True >>> accel.x -2 >>> import e32 >>> x = 1000 >>> while x > 0:... x -= 1... print accel.x, accel.y, accel.z... e32.ao_sleep(1)

42 Módulo messaging messaging.sms_send( , uOi) messaging.mms_send(...) Repare na string Unicode! Permite passar um callback para receber o status do envio

43 Módulo positioning >>> import positioning >>> positioning.modules() [{'available': 1, 'id': , 'name': u'Assisted GPS'}, {'available': 1, 'id': , 'name': u'Integrated GPS'}, {'available': 1, 'id': , 'name': u'Network based'}] >>> positioning.select_module( ) >>> positioning.set_requestors( [{"type":"service", "format": "application", "data": "test_app"}]) >>> positioning.last_position() >>> positioning.position() >>> # positioning.position(callback=cb)

44 Módulo inbox Acesso a mensagens SMS incoming Callback para ser notificado de novas msgs. >>> import inbox >>> i = inbox.Inbox() >>> m = i.sms_messages() >>> i.content(m[0]) U'Meet me by 7pm at motel' >>> i.time(m[0]) >>> i.address(m[0]) U'Vulnavia Phibes' >>> i.delete(m[0]) # SIGWIFE

45 Módulos contacts/e32calendar Módulos razoavelmente complexos Explorar com base na documentação >>> import e32calendar >>> db = e32calendar.open() >>> db.find_instances(time.time(), \ time.time() + 30*86400) [{'id': 2, 'datetime': }] >>> >>> db[2] >>> db[2].content u'Pendrive' >>> db[2].get_repeat() {'end': , 'interval': 1, } >>> import contacts >>> db = contacts.open() >>> db.find("Ana") [ ] >>> db[33].as_vcard() 'BEGIN:VCARD\r\n...END:VCARD\r\n'

46 Módulo btsocket Soquetes Bluetooth btsocket.socket(AF_BT || AF_INET,...) Testar BT no console BT pode falhar Bug em bt_discover() (3 rd Edition FP2) Controle de access points à Internet AP escolhido pelo usuário ou pelo aplicativo Sockets podem ligados a diferentes Aps Módulo padrão socket também disponível socket.set_default_access_point(uNome)

47 Módulo btsocket >>> bt_discover() # invoca UI ('00:23:12:3c:ba:a3', {u'Bluetooth-PDA-Sync': 3}) >>> bt_obex_discover() Traceback (most recent call last): File " ", line 1, in error: (13, 'Permission denied') >>> bt_obex_discover('00:23:12:3c:ba:a3') ('00:23:12:3c:ba:a3', {u'OBEX Object Push': 10}) >>> bt_obex_send_file('00:23:12:3c:ba:a3', \ 10, u"e:\\teste.jpg") >>> s.connect(("00:23:12:3c:ba:a3", 10)) # bt_advertise_service # bt_rfcomm_get_available_server_channel

48 Módulo btsocket >>> from btsocket import * >>> access_points() [{'iapid': 10, 'name': u'ASP'}, {'iapid': 2, 'name': u'bandalarga.claro.com.br'}, {'iapid': 9, 'name': u'EPX'}] >>> ap = access_point(9) >>> set_default_access_point(ap) >>> ap.start() >>> ap.ip() ' ' >>> s = socket(AF_INET, SOCK_STREAM) >>> s.connect(("www.folha.com.br", 80)) >>> s.send("GET /\r\n\r\n") 9 >>> print s.recv(100)... >>> s.close() >>> ap.stop()

49 btsocket X socket btsocket = soquetes Symbian, limitados Não são aceitos por select() Limitação inclui soquetes BT Não ingressam em grupos multicast etc. socket = soquetes do OpenC Mais poderosos (multicast funciona) Única desvantagem: relação com access points Módulo select não repete notificações não funciona para write (Symbian)

50 Módulo scriptext Platform Services API: acesso neutro a recursos do sistema (via strings) >= 3 rd FP2, abordaremos por cima Application Manager, Sys Info Calendário, Contatos Location, Landmarks Messaging Sensors Media Management import scriptext m = scriptext.load('Service.Messaging', 'Imessaging') msgs = m.call("GetList", {"Type": u"Inbox"}) for msg in msgs: print msg['Sender']

51 Módulos e32db/e32dbm e32db : mini-banco de dados do Symbian Mesma idéia do SQLite e32dbm : Interface DBM para e32db anydbm é apelido de e32dbm em PyS60 >>> import anydbm >>> db = anydbm.open("E:\\teste.dbm", "c") >>> db["a"] = "b" >>> db.close() >>> db = anydbm.open("E:\\teste.dbm") >>> db {'a': 'b'}

52 Outros módulos logs (registro de ligações e SMS) keycapture (captura eventos teclado) topwindow (Janela modal top-level)

53 Ciclo de desenvolvimento Edição no PC Teste no celular Teste no PC (emuladores de API) Teste no emulador Symbian Impl. APIs (pys60-compat) Windows Emulador imperfeito Moroso

54 Testando scripts PyS60 no PC Use módulos emuladores criadas por terceiros PyS60-compat (UI e gráficos) Lightblue (Bluetooth) Muita atenção com o Unicode Saiba quais APIs demandam ou retornam strings Unicode Tire proveito da orientação a objetos Python Crie módulos emuladores para o PC

55 PyS60 no emulador Symbian Instalar Carbide, Perl e SDK 3 rd Edition FP1 ou FP2 Instalar PyS60 para SDK, casando a versão (FP1 ou FP2) Cygwin é muito utilizado por desenvolvedores Symbian profissionais EPOC32=C:\s60\devices\S60_3rd_FP2_SDK_v1.1\epoc32 $EPOC32\winscw\c\Data\python # scripts $EPOC32\winscw\c\resource\python25 # módulos

56 PyS60-compat

57 Distribuindo um aplicativo PyS60 Aplicativo = um script ou uma pasta Ensymble Vem na distribuição PyS60 Depende do Python 2.5 (não serve 2.4 ou 2.6) Gera e assina pacote SIS Determina módulos Python a embarcar Não elide necessidade de certificado $$$ Permite embutir outros SIS...por exemplo, o runtime PyS60 facilita a distribuição de app. Python ao usuário final

58 Criando um pacote SIS no Windows

59 Criando um pacote SIS no Linux

60 Criando um pacote SIS no MacOSX

61 Instalando pacote SIS do PyS60

62 Criando extensões em C/C++ Implica em usar Windows e o SDK do S60 src\extras\elemlist ou elemlist.zip (curso) Capacidades >= aplicativo que vai importá-la (e.g. nosso aplicativo é o PyScriptShell) Opção 1: usar o PyScriptShell auto-assinado Opção 2: adquirir um certificado $$$

63 Links sobre PyS60 https://garage.maemo.org/projects/pys60


Carregar ppt "Python for Series 60 Elvis Pfützenreuter – INdT Original de Osvaldo Santana Neto"

Apresentações semelhantes


Anúncios Google