Download - Computação Sensível a Contexto Pesquisa desenvolvida pelo Georgia Institute of Technology
Computação Sensível a Contexto
Pesquisa desenvolvida pelo Georgia Institute of
Technology
Histórico da Computação Sensível ao Contexto Discutida pela primeira vez em 1994 - Xerox
Corporation “Software que se adapte ao local em que
estiver sendo utilizado, ao conjunto de pessoas e objetos próximos, e também às mudanças deles ao longo do tempo”
Active Badges da Olivetti (1992) - primeiro trabalho de pesquisa nessa área
Atualmente as pesquisas mais interessantes são desenvolvidas no GeorgiaTech
O que é contexto? “Contexto é qualquer informação que
possa ser usada para caracterizar a situação de uma entidade”
“Entidade é uma pessoa, lugar ou objeto relevante à iteração entre usuário e aplicação”
Utilizando-se o contexto pode-se aumentar as formas de troca de informações entre o usuário e o computador
Categorias de Contexto Pode-se dividir em duas categorias
Primários (mais importantes na prática) Local Identidade Atividade Tempo
Secundários (indexados pelos primários) Telefone (derivado da identidade) Clima (derivado do local + tempo)
O que é Computação Sensível a Contexto? “Um sistema é considerado sensível
a contexto se ele utiliza o contexto para fornecer informações/serviços relevantes para o usuário”
Pode suportar 3 tipos de características Apresentação Execução Relacionamento
Como desenvolver uma aplicação sensível a contexto? Context Toolkit
Widgets Aggregators Interpreters
Desenvolvido em Java
http://www.cc.gatech.edu/fce/contexttoolkit
Aplicação – In/Out Board Mostra através de
uma página Web quais professores estão dentro/fora do prédio
Utiliza o Context Toolkit
Utiliza o iButton para detectar estado
http://fire.cc.gt.atl.ga.us/inout/
Problemas – In/Out Board Ação explícita do
usuário Único ponto de
verificação Soluções
Sensores não intrusivos
Combinação de Sensores
http://www.ibutton.com
Aplicação – CybreMinder Post-it digital Entrega baseada em contexto
Quando ocorre uma situação especificada
Quando expira o limite de tempo 3 tipos de entrega
Aviso na tela E-mail SMS
Exemplos - CybreMinderSituação Linguagem
NaturalCybreMinder
Tempo 9:45 a.m. Expiration field: 9:45 a.m.Local Previsão de chuva e
Bob está saindo de casaCity=Atlanta, WeatherForecast=rainUsername=Bob, Location=Bob’s front door
Co-local Sally e seu colega estejam no mesmo local
Username=Sally, Location=*1Username=Bob, Location=*1
Complexa Preço das ações de X é maior que $50, Bob está sozinho e tem tempo livre
StockName=X, StockPrice>50Username=Bob, Location=*1Location=*1, OccupantSize=1Username=Bob, FreeTime>30
Complexa Sally está em seu escritório, tem algum tempo livre e seu amigo não está ocupado
Username=Sally, Location=Sally’s officeUsername=Sally, FreeTime=60Username=Tom, ActivityLevel=Low
Problemas - CybreMinder Determinação de situações é
complexa Possibilidade de criação de situações
que não podem ser detectadas Poucas formas de recebimento de
mensagens Apesar dos resultados promissores,
aparentemente o projeto foi descontinuado
O que é o Context Toolkit? Conjunto de classes desenvolvidas
para facilitar a criação de aplicações sensíveis ao contexto
Feito em Java Utiliza o mesmo conceito de
widgets para GUI’s
Estrutura do Context Toolkit
Componentes do Context Toolkit BaseObject Context Widgets Context Servers (Aggregators) Context Interpreters
Base Object Utilizado como base para os demais objetos do
toolkit (todos são derivados do Base Object) Oferece suporte à comunicação entre
componentes do toolkit e entre aplicações e componentes
Normalmente aplicações criam uma instância do Base Object e os componentes são subclasses
Pode funcionar tanto como cliente quanto como servidor
Comunicação feita em XML utilizando HTTP como protocolo de rede
Como usar o Base Object Construtores
public BaseObject(int serverPort); public BaseObject( String clientProtocol,
String serverProtocol,int serverPort,String clientEncoder,String serverEncoder);
Como XML e HTTP são ineficientes, é possível especificar classes que implementem outros protocolos
Como usar o Base Object// create BaseObject running on port 7777BaseObject server = new BaseObject(7777);// request the version numberDataObject dataVersion =
server.getVersion("localhost",5555,"PersonPresence_here");String versionError = new Error(dataVersion).getError();if (versionError.equals(Error.NO_ERROR)){
System.out.println("Version is:“ + (String)version.getDataObject(WPersonPresence.VERSION).getValue().firstElement();
}else {
System.out.println("Error = "+versionError);}DataObject dataPing = server.pingComponent("localhost",
5555,"PersonPresence_here");// pingString pingError = new Error(dataPing).getError();System.out.println("Ping results = "+pingError);
Context Widgets Responsáveis por separar os detalhes dos
sensores das informações geradas por eles Description – auto-descrição (tipo de contexto
captado, callbacks e serviços oferecidos) Polling – devolve o estado atual Subscription – componentes podem se alistar
nas funções callbacks para receberem eventos na mudança de estado do widget
Storage – armazena informações históricas de contexto
Services – serviços que o widget pode fornecer
Como usar um Context Widget
assinar (subscribe) cancelar assinatura
(unsubscribe) perguntar (poll) atualizar e perguntar colocar dados
obter lista de callbacks obter lista de atributos obter lista de serviços obter dados históricos executar serviços
(síncrono e assíncrono)
Uma aplicação pode:
Como usar um Context Widget - Subscribingpublic Error subscribeTo(Handler handler,
int localPort, String localId, String remoteHost, int remotePort, String remoteId, String callback, String url, Conditions conditions, Attributes
attributes);
Como usar um Context Widget - Subscribing// create BaseObject running on port 7777BaseObject server = new BaseObject(7777); Attributes subAtts = new Attributes();subAtts.addAttribute(WPersonPresence.USERID);subAtts.addAttribute(WPersonPresence.TIMESTAMP);Conditions subConds = new Conditions();subConds.addCondition(WPersonPresence.USERID,
Storage.EQUAL,"16AC850600000044");Error error = server.subscribeTo(this, 7777, "testApp",
"localhost", 5555, "PersonPresence_here", WPersonPresence.UPDATE, "presenceUpdate",
subConds,subAtts);System.out.println("Subscription with valid
attributes/conditions: "+error6.getError());
Como usar um Context Widget - Handlerpublic DataObject handle(String callback, DataObject data)
throws InvalidMethodException, MethodException { if(callback.equals("presenceUpdate")) { AttributeNameValues atts = new AttributeNameValues(data); AttributeNameValue timeAtt =
atts.getAttributeNameValue(WPersonPresence.TIMESTAMP); String time = (String)timeAtt.getValue(); System.out.print(time+"\n"); }}
Context Servers Responsáveis por agregar todo o contexto
sobre uma pessoa, entidade, objeto ou lugar Assina todos os widgets relevantes
utilizando as opções importantes para a entidade considerada
Serve de mediador entre a aplicação e os widgets
As aplicações devem preferencialmente se comunicar com servers do que com widgets
Como usar Context Serverspublic Server(String clientProtocol, String serverProtocol, int serverPort, String clientEncoder, String serverEncoder, String storageClass, String id, WidgetHandles widgets)
Normalmente os Servers utilizam JDBC+MySQL como mecanismo de armazenamento. Isso pode ser substituído fornecendo-se uma string com o nome da classe que implementa armazenamento no construtor.
Context Interpreters Transformam uma forma de contexto em
outra. Não armazenam dados nome -> e-mail número de pessoas, direção em que olham,
nível de ruído, horário -> está ou não sendo realizada uma reunião
Description – fornecem uma auto-descrição (contextos de entrada e contextos de saída)
Interpretation – serviço de mudança de um tipo de contexto em outro
Como usar Context InterpretersDataObject askInterpreter(String remoteHost, int remotePort, String remoteId, AttributeNameValues data)
AttributeNameValues data = new AttributeNameValues();data.addAttributeNameValue(IIButton2Name.IBUTTONID,
"ABCDEF");DataObject interpreted = askInterpreter("localhost",
8888,IIButton2Name.CLASSNAME,data);AttributeNameValues newData = new
AttributeNameValues(interpreted);System.out.println("new data is: "+newData);
Demais Classes Necessárias
DataObject Error Attribute AttributeFunction AttributeNameValue Condition Retrieval RetrievalResults Callback Subscriber WidgetHandle
Úteis Constants ContextTypes ConfigObject Configuration XMLURLReader
ToDo Básico Resource Discovery
Descoberta de sensores dada a função executada, sem especificação de host, porta, nome, etc.
Visualização Existindo o Resource Discovery, permitir a
visualização dos componentes existentes, quem se comunica, etc.
Condições Atualmente só é possível especificar as
condições com AND. Ampliar para OR e NOT
ToDo Avançado Suporte a Ambigüidade
Desenvolver o suporte à ambigüidade das informações geradas pelos sensores. Permitir condensamento de informações de mais de um sensor, transmissão da precisão da informação além do contexto, etc.
Segurança/Privacidade Desenvolver suporte à privacidade quando
as informações de contexto transmitidas forem particulares/sensíveis.