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.