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 - CybreMinder
Situação
Linguagem Natural
CybreMinder
Tempo
9:45 a.m.
Expiration field: 9:45 a.m.
Local
Previsão de chuva e Bob
está saindo de casa
City=Atlanta, WeatherForecast=rain
Username=Bob, Location=Bob’s front door
Co-local
Sally e seu colega estejam
no mesmo local
Username=Sally, Location=*1
Username=Bob, Location=*1
Complexa
Preço das ações de X é
maior que $50, Bob está
sozinho e tem tempo livre
StockName=X, StockPrice>50
Username=Bob, Location=*1
Location=*1, OccupantSize=1
Username=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 office
Username=Sally, FreeTime=60
Username=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 7777
BaseObject server = new BaseObject(7777);
// request the version number
DataObject 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().fi
rstElement();
}
else {
System.out.println("Error = "+versionError);
}
DataObject dataPing = server.pingComponent("localhost",
5555,"PersonPresence_here");
// ping
String 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
Uma aplicação pode:





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)
Como usar um Context Widget - Subscribing
public 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 7777
BaseObject 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 - Handler
public 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 Servers
public 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 Interpreters
DataObject 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


Visualização


Descoberta de sensores dada a função executada,
sem especificação de host, porta, nome, etc.
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.
Download

Computação Sensível a Contexto - IME-USP