quinta-feira, 11 de dezembro de 2008

Wiimote no Flash

Receber dados de um Wii Remote no Flash pode ser uma tarefa simples. Para isso, acrescentamos em nosso pacote de classes para Actionscript 3 o arquivo "wiimote.as" (imaginario.devices.wiimote). Ele recupera as informações repassadas pelo WiimoteOSC e as manda para uma função que você especifica.

Como exemplo, criamos um arquivo simples que mostra as informações recebidas do wiimote. Para executá-lo, lembre-se que será preciso usar o FLOSC (todo o processamento das mensagens OSC é feito automaticamente pela classe wiimote). O link para baixar é:

wiimote.zip

Lembre-se que para rodar este exemplo você irá precisar do nosso pacote de classes AS3:

baixe o pacote de classes AS3 1maginári0

O pacote de classes AS3 1maginári0 está licenciado sob a MPL 1.1 (Mozilla Public License).

Wiimote

O WiimoteOSC é um software capaz de se conectar a até dois Wii Remotes e enviar as informações recebidas via mensagens OSC. Ele foi testado no Windows Vista e desenvolvido em Java (JRE 6).


Suas principais funcionalidades são:
  • Conexão com 1 ou 2 Wii Remotes. É possível se conectar a qualquer wiimote encontrado ou indicar qual(is) usando o endereço bluetooth dos dispositivos.
  • Calibração do sensor de infravermelho (válido para o primeiro Wii Remote). Você indica os limites (ponto superior esquerdo e inferior direito) e as informações de posição dos pontos de infravermelho já são enviadas corrigidas. A calibração é gravada e não precisa ser repetida se o Wii Remote não for movido.
  • Envio de mensagens OSC (via UDP) para host/port indicados.
  • Pode executar a localização e o envio de mensagens automaticamente, assim que o programa inicia ou manualmente.
Importante: a detecção dos Wii Remotes não é estável usando o driver da Microsoft (veja mais detalhes neste post).

O layout das mensagens OSC enviadas está nos arquivos de ajuda que acompanham o software. O WiimoteOSC está licenciado sob a MPL 1.1 (Mozilla Public License).

WiimoteOSC (software)
código fonte (source)

Bluetooth + Java

O Bluetooth se tornou um padrão quando o assunto é a comunicação com dispositivos móveis. O baixo consumo energético e custo reduzido são só alguns fatores que influenciaram a sua adoção.

Estabelecer comunicação com dispositivos Bluetooth não é uma tarefa complexa e já existem várias APIs para as mais diferentes linguagens que simplificam ainda mais o trabalho. Como o Java é uma plataforma praticamente onipresente tanto em desktops (independente do sistema operacional) quanto em aparelhos móveis, ele é uma boa escolha na hora da troca de dados. Para isso é preciso entender um pouco da forma como o Java trata conexões Bluetooth.


JSR-82

Como várias outras propriedades, o suporte ao Bluetooth é definido por uma especificação Java, a JSR-82. Isso significa que a linguagem já prevê o suporte mas, ao contrário do que pode parecer, ela não o oferece por padrão. A JSR-82 apenas traz informações sobre como deve ser feito o suporte ao Bluetooth mas a implementação, no caso do Java para computadores, foi deixada a cargo de terceiros. Com isso surgiram várias bibliotecas que implementam totalmente ou em parte as especificações para a comunicação Bluetooth. Muitas delas são proprietárias (inlcusive pagas) enquanto outras adotam modelos livres. Algumas delas são:
  • avetana (produto comercial gratuito na versão Linux)
  • bluecove (gratuita, LGPL para Windows e OSX e GPL para Linux)
  • bluesock (Common Public License)
As bibliotecas de alguma dessas implementações é necessária para completar o suporte a Bluetooth em seu aplicativo Java. Já na versão do Java para dispositivos móveis, a "micro edition", a implementação do JSR-82 já foi disponibilizada por padrão, não sendo necessária nenhuma biblioteca extra.


Drivers Bluetooth

Mesmo tendo incluído a biblioteca de implementação do Bluetooth em seu programa, ele ainda não poderá executar corretamente em seu computador. Como todo dispositivo de hardware, o Bluetooth (interno ou usb) precisará dos drivers corretos para funcionar. No caso do OSX da Apple isso não chega a ser problema já que tanto o hardware quanto o driver vêm pré-instalados de fábrica. Para o Linux, a melhor escolha é o driver BlueZ que pode ser instalado usando o Synaptic (apt-get) ou a ferramenta de instalação/atualização preferida. O driver BlueZ opera sem problemas com a implementação bluecove.

Já no Windows...

O suporte ao Bluetooth foi incluído no service pack 2 do Windows XP. A partir dele, quando você encaixa um dispositivo Bluetooth USB o hardware é normalmente identificado e o driver próprio (stack) instalado. Entretanto esse stack padrão, "Microsoft Bluetooth Stack", não traz um suporte completo. É possível que seu programa funcione perfeitamente com ele, mas em vários casos isso não acontece. Alguns exemplos: comunicação com celulares Motorola e com Wii Remotes.

Nesses casos a saída é usar drivers de terceiros. O Widcomm é bastante comum e funciona perfeitamente com vários dispositivos. O Bluesoleil é outra alternativa. Você encontra esses drivers para download na Internet, mas a versão que acompanha o seu hardware é sempre a recomendada.

quinta-feira, 4 de dezembro de 2008

Processando mensagens OSC no Flash

Uma vez que já tenha preparado seu software gerador de mensagens OSC e o "tradutor de portas" é hora de processar as informações recebidas no Flash. Essas mensagens virão no formato XML, com estrtura parecida com a seguinte:

<OSCPACKET ADDRESS="localhost" TIME="0" PORT="8000">
<MESSAGE NAME="/nomedamensagem">
<ARGUMENT TYPE="s" VALUE="conteúdo da mensagem" />
<ARGUMENT TYPE="i" VALUE="1" />
<ARGUMENT TYPE="f" VALUE="6.02" />
</MESSAGE>
</OSCPACKET>

Recuperar os dados de uma mensagem como essa é simples: basta tratá-la como um XML padrão, mas como sua estrutura é rígida criamos uma classe em AS3 capaz de interpretar uma mensagem OSC e retornar um objeto contendo todas as informações. O código está no pacote de classes AS3 do 1maginári0 em "/imaginario/communication/oscMessenger.as":

baixe o pacote de classes AS3 1magiári0

Um exemplo do uso dessa classe você encontra aqui:

oscmessenger.fla

O pacote de classes AS3 1maginári0 está licenciado sob a MPL 1.1 (Mozilla Publi License).

Recebendo OSC no Flash Player

Mensagens OSC são normalmente enviadas usando o protocolo UDP para garantir uma troca mais rápida das informações. No entanto existem vários softwares incapazes de estabelecer conexões UPD, apenas TCP. É o caso do Flash Player até a versão 9. Para que ele receba informações de uma fonte OSC é preciso um mediador que faça a "tradução" das mensagens OSC de UDP para TCP.

Um bom software para essa tarefa é o FLOSC, desenvolvido por Ben Chun desde 2002. Mesmo que o site do projeto esteja sem atividade desde 2006, o FLOSC ainda é uma excelente opção para o trabalho pela sua facilidade de uso. O endereço é:


Para usar, basta baixar o software, descompactá-lo e, em um terminal, usar:

java Gateway udpPort tcpPort

onde udpPort é a porta para a qual o software gerador do OSC está mandando as informações e tcpPort é a porta TCP a ser lida pelo Flash. Nos trabalhos do 1maginari0 procuramos usar as portas 8000 e 9000 respectivamente, então:

java Gateway 8000 9000

Portas acima de 10.000 tendem a causar problemas em algumas máquinas. Para que o programa execute é necessária a instalação do java (JRE é suficiente) - www.java.com. Mesmo que esteja sem atualizações recentes, as versões mais novas do java executam o FLOSC sem problemas.


Abrindo portas para o Flash Player

Além de encaminhar as mensagens OSC para uma porta TCP é necessário um segundo passo para a leitura dos dados. Por questões de segurança o Flash Player desabilita o acesso a portas TCP em uma máquina a não ser que receba autorização para isso (esse problema não existe quando se usa o projetor). Para isso, é necessário criar um arquivo de regras (policy file) e distribuí-lo pela porta TCP 843.

Para simplificar o processo, a Adobe disponibilizou um servidor simples e um arquivo de regras para a tarefa. Para conferir, entre em


O processo é simples, mas primeiro é importante ter o Python instalado (www.python.org - testamos na versão 2.5). Depois disso, basta baixar o arquivo encontrado na Adobe. É preciso apenas o arquivo "flashpolicyd.py" da pasta "Standalone" e seu arquivo de regras (há um exemplo, "flashpolicy.xml" no pacote). Num terminal, entre (estando ambos, flashpolicy.xml e flashpolicyd.py em uma mesma pasta):

python flashpolicyd.py --file=flashpolicy.xml --port=843

Um arquivo de regras que libere a porta 9000 para a comunicação OSC, com o FLOSC sendo executado na mesma máquina do Flash Player teria o conteúdo:
<!DOCTYPE cross-domain-policy SYSTEM "/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
<site-control policies="master-only">
<allow-access-from domain="localhost" ports="9000">
</cross-domain-policy>


Além disso...

O Flash Player 10 é capaz de estabelecer conexões pelo protocolo RTMFP, construído com base no UDP. Ainda não testamos essa conexão para a troca de mensagens OSC, o que eliminaria a necessidade do FLOSC.

O arquivo disponibilizado pela Adobe traz também uma versão em PERL do servidor para a abertura de portas TCP para a Flash Player.

terça-feira, 2 de dezembro de 2008

Exposição de Arte Digital


Começaremos esse blog apresentando a Exposição de Arte Digital EBA - UFMG, que ocorreu no saguão da Reitoria da UFMG (Universidade Federal de Minas Gerais) nos dias 18 a 21 de Novembro de 2008. Nessa ocasião apresentamos alguns trabalhos já desenvolvidos pelo grupo. Nas próximas postagens estaremos descrevendo mais detalhadamente cada projeto.

GRUPO DE PESQUISA: 1maginári0

Coordenadores:
Francisco Marinho
Jalver Bethônico

Pesquisadores:
Marília Bergamo
Rosilane Mota

Bolsistas:
Bruno Santos
Francisco Chaves
Lucas Junqueira

Consultoria Tecnológica:
Dário de Moura

Agradecimentos pela exposição:
Prof. Ronaldo Pena
Profa. Heloísa Starling
Equipe do REUNI
Equipe do CAC
Pesquisa “O SILÊNCIO, A SOMBRA E O SILÍCIO”
- fomento FAPEMIG
Pesquisa “POÉTICAS AUDIOVISUAIS INTERATIVAS”
- fomento CNPq