Implementação de Aplicações Móveis
e Jogos com Python
Bluetooth
Bluetooth
 OBEX (OBject EXchange)
 Protocolo Bluetooth voltado pra transmissão de arquivos (audio,
imagem, etc)
Bluetooth
 OBEX (OBject EXchange)
 Protocolo Bluetooth voltado pra transmissão de arquivos (audio,
imagem, etc)
 Para scan de dispositivos OBEX:
import socket
endereco, servicos = socket.bt_obex_discover()
print endereco,servicos
Bluetooth
 Enviando uma foto
import camera, e32, socket, appuifw
foto = u"C:Imagesarquivo_foto.jpg"
def enviar_foto():
address, services = socket.bt_obex_discover()
if u'OBEX Object Push' in services:
channel = services[u'OBEX Object Push']
socket.bt_obex_send_file(address, channel, arquivo_foto)
appuifw.note(u"Foto enviada!", "info")
else:
appuifw.note(u"Dispositivo não preparado.", "error")
def tirar_foto():
photo = camera.take_photo()
canvas.blit(photo)
photo.save(arquivo_foto)
def quit():
app_lock.signal()
canvas = appuifw.Canvas()
appuifw.app.body = canvas
appuifw.app.exit_key_handler = quit
appuifw.app.menu = [(u"Tirar Foto", tirar_foto), (u"Enviar", enviar_foto)]
app_lock = e32.Ao_lock()
app_lock.wait()
 RFCOMM (Radio Frequency COMMunication)
 Protocolo Bluetooth para transmissão (RX e TX) de texto ou
raw data
Bluetooth
 RFCOMM (Radio Frequency COMMunication)
 Protocolo Bluetooth para transmissão (RX e TX) de texto ou
raw data
 Para scan de dispositivos RFCOMM:
Bluetooth
import socket
endereco, servicos = socket.bt_discover()
print endereco,servicos
Bluetooth
 Fazendo um CHAT – Lado Servidor
import socket, appuifw
def chat_server():
server = socket.socket(socket.AF_BT, socket.SOCK_STREAM)
channel = socket.bt_rfcomm_get_available_server_channel(server)
server.bind(("", channel))
server.listen(1)
socket.bt_advertise_service(u"NossoChat", server, True, socket.RFCOMM)
socket.set_security(server, socket.AUTH | socket.AUTHOR)
appuifw.note(u”Esperando Conexão”)
conn, client_addr = server.accept()
appuifw.note(u”Conectado!”)
talk(conn, None)
Bluetooth
 Fazendo um CHAT – Lado Cliente
def chat_client():
conn = socket.socket(socket.AF_BT, socket.SOCK_STREAM)
address, services = socket.bt_discover()
if 'NossoChat' in services:
channel = services[u'btchat']
conn.connect((address, channel))
appuifw.note(u”Conectado!”)
talk(None, conn)
else:
appuifw.note(u"O celular não está rodando o chat.", "error")
Bluetooth
 Fazendo um CHAT – Comum
def receive_msg(fd):
print "Esperando a mensagem.."
reply = fd.readline()
print "Recebido: " + reply
appuifw.note(unicode(reply), "info")
def send_msg(fd):
msg = appuifw.query(u"Envie:", "text")
print "Enviado: " + msg
print >> fd, msg
def talk(client, server):
try:
if server:
fd = server.makefile("rw", 0)
receive_msg(fd)
if client:
fd = client.makefile("rw", 0)
while True:
send_msg(fd)
receive_msg(fd
except:
appuifw.note(u"Desconectou",
"info")
if client: client.close()
if server: server.close()
index = appuifw.popup_menu([u"Servir",
u"Conectar"])
if index != None:
if index:
chat_client()
else:
chat_server()
Networking
Networking
 Maneiras de acessar servidores
 Computação Distribuída
 Módulos de Acesso
 httplib, urllib (core)
 json.py (Patric Logan)
 http://meu-ip/json.py
Networking
 Fazendo um simples download
import urllib
url = “http://pagina/arquivo.html”
arquivo = “C:Dataarquivo.txt”
urllib.urlretrieve(url, arquivo)
Networking
 Comunicando-se através de POST
 Lado Cliente (Celular)
import httplib, urllib, appuifw
def senddata():
params = urllib.urlencode({'data': "Flavio"})
headers = {"Content-type": "application/x-www-form-urlencoded","Accept":
"text/plain"}
conn = httplib.HTTPConnection("www.flavioribeiro.com")
appuifw.note(u'Espere...')
conn.request("POST", "/exemplo.php", params, headers)
response = conn.getresponse()
uniresponse = unicode(response.read())
conn.close()
appuifw.note(uniresponse)
senddata()
Networking
 Comunicando-se através de POST
 Lado Servidor (PHP!)
<?php
$data = $_REQUEST['data'];
$filename = 'textfile.txt';
$handle = fopen($filename, 'a+');
$text="n";
fwrite($handle, $data);
fwrite($handle, $text);
echo 'Post com Sucesso!';
fclose($handle);
?>
Série 'Network Programming for s60'
do Marcelo Barros
http://croozeus.com/
Camera
Camera
 Módulo responsável por interação direta com a(s) camera(s)
 Alguns métodos:
 cameras_available()
 image_modes()
 flash_modes()
 max_zoom()
 take_photo()
Camera
 ViewFinder
 Feedback pro usuário sobre a posição da imagem
import camera, appuifw, e32
def viewfinder(img):
canvas.blit(img)
def quit():
camera.stop_finder()
lock.signal()
appuifw.app.body = canvas = appuifw.Canvas()
appuifw.app.exit_key_handler = quit
camera.start_finder(viewfinder)
lock = e32.Ao_lock()
lock.wait()
Camera
 ViewFinder
 Feedback pro usuário sobre a posição da imagem
Camera
 camera.take_photo()
 Retorna um objeto graphics.Image
import camera
foto = camera.take_photo()
foto.save(“C:Imagesfoto.jpg”)
O módulo sysinfo
 Módulo responsável por informações do sistema
 sysinfo.battery()
 Retorna o nivel da bateria (entre 0 e 7)
 sysinfo.imei()
 Retorna o número de identificação do celular
 sysinfo.active_profile()
 Retorna o perfil utilizado no momento (Silencioso, Reunião,
etc)
 sysinfo.display_pixels()
 Retorna o tamanho da tela em pixels (muito importante)
Sysinfo
 Módulo responsável por informações do sistema
 sysinfo.free_drivespace()
 Retorna o espaço livre em bytes em cada drive
 {u'C:': 58463232, u'D:': 9494528, u'Z:': 0}
 sysinfo.total_ram()
 Retorna o tamanho da memória RAM
 sysinfo.free_ram()
 Retorna a memória RAM livre
 sysinfo.signal_bars()
 Retorna o sinal da antena (de 0 a 7)
 sysinfo.sw_version()
 Versão do firmware
Sysinfo
Dicas de Organização
de um Projeto
 Várias funções em um só arquivo
 Arquivo: operacoes.py
 Funções:
 soma(x,y)
 subtrai(x,y)
 divide(x,y)
Namespace e Dicas de um projeto Python
import operacoes
operacoes.soma(10,20)
operacoes.divide(100,2)
 Várias Classes em um só arquivo
 Arquivo: funcionarios.py
 Classes:
 Presidente
 Diretor
 Estagiario
Namespace e Dicas de um projeto Python
import funcionarios
flavio = funcionarios.Estagiario()
lucas = funcionarios.Presidente()
flavio.trabalha()
lucas.toma_cafe()
 Métodos
 trabalha()
 toma_cafe()
 Várias Classes em um só arquivo (Exemplo II)
 Arquivo: funcionarios.py
 Classes:
 Presidente
 Diretor
 Estagiario
Namespace e Dicas de um projeto Python
from funcionarios import *
flavio = Estagiario()
lucas = Presidente()
flavio.trabalha()
lucas.toma_cafe()
 Métodos
 trabalha()
 toma_cafe()
 Pacotes
 Pasta: conexoes/
 Arquivo __init__.py (vazio)
 Arquivos:
 bluetooth.py → Classes Server e Client
 wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
import conexoes.bluetooth
import conexoes.wireless
bt = conexoes.bluetooth.Client()
wifi = conexoes.wireless.AccessPoint()
 Pacotes (Exemplo II)
 Pasta: conexoes/
 Arquivo __init__.py (vazio)
 Arquivos:
 bluetooth.py → Classes Server e Client
 wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
from conexoes import bluetooth
bt = bluetooth.Client()
 Pacotes (Exemplo III)
 Pasta: conexoes/
 Arquivo __init__.py (vazio)
 Arquivos:
 bluetooth.py → Classes Server e Client
 wireless.py → Classes AccessPoint e Client
Namespace e Dicas de um projeto Python
from conexoes.bluetooth import Server
bt = Server()
 Dicas:
 Crie uma pasta pra seu programa:
 Deixe uma pasta do seu programa para os códigos (src)
 Deixe outra pasta para Arquivos no geral (files)
 Crie outras necessárias
Namespace e Dicas de um projeto Python
import os, os.path
PATH = u”C:DataMinhaAplicação”
if not os.path.exists(PATH): os.makedirs(PATH)
import os, os.path
Sources = u”C:DataMinhaAplicaçãosrc”
if not os.path.exists(Sources): os.makedirs(Sources)
 Dicas:
 Coloque a pasta de códigos no seu Python Path
Assim ele será visível e poderá ser incluído nos seus códigos.
Namespace e Dicas de um projeto Python
import sys
Sources = u”C:DataMinhaAplicaçãosrc”
sys.path.append(Sources)
Jogos! :)

Implementação de Aplicações Móveis e Jogos com Python - Aula 5

  • 1.
    Implementação de AplicaçõesMóveis e Jogos com Python
  • 2.
  • 3.
    Bluetooth  OBEX (OBjectEXchange)  Protocolo Bluetooth voltado pra transmissão de arquivos (audio, imagem, etc)
  • 4.
    Bluetooth  OBEX (OBjectEXchange)  Protocolo Bluetooth voltado pra transmissão de arquivos (audio, imagem, etc)  Para scan de dispositivos OBEX: import socket endereco, servicos = socket.bt_obex_discover() print endereco,servicos
  • 5.
    Bluetooth  Enviando umafoto import camera, e32, socket, appuifw foto = u"C:Imagesarquivo_foto.jpg" def enviar_foto(): address, services = socket.bt_obex_discover() if u'OBEX Object Push' in services: channel = services[u'OBEX Object Push'] socket.bt_obex_send_file(address, channel, arquivo_foto) appuifw.note(u"Foto enviada!", "info") else: appuifw.note(u"Dispositivo não preparado.", "error") def tirar_foto(): photo = camera.take_photo() canvas.blit(photo) photo.save(arquivo_foto) def quit(): app_lock.signal() canvas = appuifw.Canvas() appuifw.app.body = canvas appuifw.app.exit_key_handler = quit appuifw.app.menu = [(u"Tirar Foto", tirar_foto), (u"Enviar", enviar_foto)] app_lock = e32.Ao_lock() app_lock.wait()
  • 6.
     RFCOMM (RadioFrequency COMMunication)  Protocolo Bluetooth para transmissão (RX e TX) de texto ou raw data Bluetooth
  • 7.
     RFCOMM (RadioFrequency COMMunication)  Protocolo Bluetooth para transmissão (RX e TX) de texto ou raw data  Para scan de dispositivos RFCOMM: Bluetooth import socket endereco, servicos = socket.bt_discover() print endereco,servicos
  • 8.
    Bluetooth  Fazendo umCHAT – Lado Servidor import socket, appuifw def chat_server(): server = socket.socket(socket.AF_BT, socket.SOCK_STREAM) channel = socket.bt_rfcomm_get_available_server_channel(server) server.bind(("", channel)) server.listen(1) socket.bt_advertise_service(u"NossoChat", server, True, socket.RFCOMM) socket.set_security(server, socket.AUTH | socket.AUTHOR) appuifw.note(u”Esperando Conexão”) conn, client_addr = server.accept() appuifw.note(u”Conectado!”) talk(conn, None)
  • 9.
    Bluetooth  Fazendo umCHAT – Lado Cliente def chat_client(): conn = socket.socket(socket.AF_BT, socket.SOCK_STREAM) address, services = socket.bt_discover() if 'NossoChat' in services: channel = services[u'btchat'] conn.connect((address, channel)) appuifw.note(u”Conectado!”) talk(None, conn) else: appuifw.note(u"O celular não está rodando o chat.", "error")
  • 10.
    Bluetooth  Fazendo umCHAT – Comum def receive_msg(fd): print "Esperando a mensagem.." reply = fd.readline() print "Recebido: " + reply appuifw.note(unicode(reply), "info") def send_msg(fd): msg = appuifw.query(u"Envie:", "text") print "Enviado: " + msg print >> fd, msg def talk(client, server): try: if server: fd = server.makefile("rw", 0) receive_msg(fd) if client: fd = client.makefile("rw", 0) while True: send_msg(fd) receive_msg(fd except: appuifw.note(u"Desconectou", "info") if client: client.close() if server: server.close() index = appuifw.popup_menu([u"Servir", u"Conectar"]) if index != None: if index: chat_client() else: chat_server()
  • 11.
  • 12.
    Networking  Maneiras deacessar servidores  Computação Distribuída  Módulos de Acesso  httplib, urllib (core)  json.py (Patric Logan)  http://meu-ip/json.py
  • 13.
    Networking  Fazendo umsimples download import urllib url = “http://pagina/arquivo.html” arquivo = “C:Dataarquivo.txt” urllib.urlretrieve(url, arquivo)
  • 14.
    Networking  Comunicando-se atravésde POST  Lado Cliente (Celular) import httplib, urllib, appuifw def senddata(): params = urllib.urlencode({'data': "Flavio"}) headers = {"Content-type": "application/x-www-form-urlencoded","Accept": "text/plain"} conn = httplib.HTTPConnection("www.flavioribeiro.com") appuifw.note(u'Espere...') conn.request("POST", "/exemplo.php", params, headers) response = conn.getresponse() uniresponse = unicode(response.read()) conn.close() appuifw.note(uniresponse) senddata()
  • 15.
    Networking  Comunicando-se atravésde POST  Lado Servidor (PHP!) <?php $data = $_REQUEST['data']; $filename = 'textfile.txt'; $handle = fopen($filename, 'a+'); $text="n"; fwrite($handle, $data); fwrite($handle, $text); echo 'Post com Sucesso!'; fclose($handle); ?>
  • 16.
    Série 'Network Programmingfor s60' do Marcelo Barros http://croozeus.com/
  • 17.
  • 18.
    Camera  Módulo responsávelpor interação direta com a(s) camera(s)  Alguns métodos:  cameras_available()  image_modes()  flash_modes()  max_zoom()  take_photo()
  • 19.
    Camera  ViewFinder  Feedbackpro usuário sobre a posição da imagem
  • 20.
    import camera, appuifw,e32 def viewfinder(img): canvas.blit(img) def quit(): camera.stop_finder() lock.signal() appuifw.app.body = canvas = appuifw.Canvas() appuifw.app.exit_key_handler = quit camera.start_finder(viewfinder) lock = e32.Ao_lock() lock.wait() Camera  ViewFinder  Feedback pro usuário sobre a posição da imagem
  • 21.
    Camera  camera.take_photo()  Retornaum objeto graphics.Image import camera foto = camera.take_photo() foto.save(“C:Imagesfoto.jpg”)
  • 22.
  • 23.
     Módulo responsávelpor informações do sistema  sysinfo.battery()  Retorna o nivel da bateria (entre 0 e 7)  sysinfo.imei()  Retorna o número de identificação do celular  sysinfo.active_profile()  Retorna o perfil utilizado no momento (Silencioso, Reunião, etc)  sysinfo.display_pixels()  Retorna o tamanho da tela em pixels (muito importante) Sysinfo
  • 24.
     Módulo responsávelpor informações do sistema  sysinfo.free_drivespace()  Retorna o espaço livre em bytes em cada drive  {u'C:': 58463232, u'D:': 9494528, u'Z:': 0}  sysinfo.total_ram()  Retorna o tamanho da memória RAM  sysinfo.free_ram()  Retorna a memória RAM livre  sysinfo.signal_bars()  Retorna o sinal da antena (de 0 a 7)  sysinfo.sw_version()  Versão do firmware Sysinfo
  • 25.
  • 26.
     Várias funçõesem um só arquivo  Arquivo: operacoes.py  Funções:  soma(x,y)  subtrai(x,y)  divide(x,y) Namespace e Dicas de um projeto Python import operacoes operacoes.soma(10,20) operacoes.divide(100,2)
  • 27.
     Várias Classesem um só arquivo  Arquivo: funcionarios.py  Classes:  Presidente  Diretor  Estagiario Namespace e Dicas de um projeto Python import funcionarios flavio = funcionarios.Estagiario() lucas = funcionarios.Presidente() flavio.trabalha() lucas.toma_cafe()  Métodos  trabalha()  toma_cafe()
  • 28.
     Várias Classesem um só arquivo (Exemplo II)  Arquivo: funcionarios.py  Classes:  Presidente  Diretor  Estagiario Namespace e Dicas de um projeto Python from funcionarios import * flavio = Estagiario() lucas = Presidente() flavio.trabalha() lucas.toma_cafe()  Métodos  trabalha()  toma_cafe()
  • 29.
     Pacotes  Pasta:conexoes/  Arquivo __init__.py (vazio)  Arquivos:  bluetooth.py → Classes Server e Client  wireless.py → Classes AccessPoint e Client Namespace e Dicas de um projeto Python import conexoes.bluetooth import conexoes.wireless bt = conexoes.bluetooth.Client() wifi = conexoes.wireless.AccessPoint()
  • 30.
     Pacotes (ExemploII)  Pasta: conexoes/  Arquivo __init__.py (vazio)  Arquivos:  bluetooth.py → Classes Server e Client  wireless.py → Classes AccessPoint e Client Namespace e Dicas de um projeto Python from conexoes import bluetooth bt = bluetooth.Client()
  • 31.
     Pacotes (ExemploIII)  Pasta: conexoes/  Arquivo __init__.py (vazio)  Arquivos:  bluetooth.py → Classes Server e Client  wireless.py → Classes AccessPoint e Client Namespace e Dicas de um projeto Python from conexoes.bluetooth import Server bt = Server()
  • 32.
     Dicas:  Crieuma pasta pra seu programa:  Deixe uma pasta do seu programa para os códigos (src)  Deixe outra pasta para Arquivos no geral (files)  Crie outras necessárias Namespace e Dicas de um projeto Python import os, os.path PATH = u”C:DataMinhaAplicação” if not os.path.exists(PATH): os.makedirs(PATH) import os, os.path Sources = u”C:DataMinhaAplicaçãosrc” if not os.path.exists(Sources): os.makedirs(Sources)
  • 33.
     Dicas:  Coloquea pasta de códigos no seu Python Path Assim ele será visível e poderá ser incluído nos seus códigos. Namespace e Dicas de um projeto Python import sys Sources = u”C:DataMinhaAplicaçãosrc” sys.path.append(Sources)
  • 34.