Sábado, 10 de Março, 2012

 


Sexta-feira, 09 de Dezembro, 2011

SMSMsg Service

 

Visão geral

Este serviço permite o envio e recepção de mensagens SMS através da rede GSM, estando a escolha de destinatário restringida a números pertencentes à operadora Vodafone Portugal. A recepção de mensagens possui um filtro que distingue 2 tipos de mensagens: pedidos (GET - pressupõe resposta ao pedido) e inserções (PUT - não pressupõe resposta); está especializada para gerar conteúdo XML baseado na informação proveniente das mensagens recebidas, mediante validação dessa informação.

Operações

As operações estão divididas em 2 serviços diferentes, para respectivo envio e recepção de mensagens.

Envio: getText(String destNr, String text)

  • Parâmetros de entrada
    • String destNr: destinatário da mensagem.
    • String text: conteúdo da mensagem.
  • Parâmetro de saída
    • String: feedback de sucesso/insucesso no envio da mensagem.

Recepção: getText(String destNr, String text, String keyword)

  • Parâmetros de entrada
    • String destNr: destinatário da mensagem.
    • String text: conteúdo da mensagem. Deve respeitar as Regras de Conteúdo.
    • String keyword: tipo de mensagem (GET/PUT).
  • Parâmetro de saída
    • String: confirmação de recepção ou mensagem inválida.

Regras de Conteúdo

A recepção de mensagens aceita apenas mensagens cujo conteúdo, independentemente do tipo de mensagem, respeita as seguintes regras:

  1. A mensagem deve começar, consoante o que se pretende, com a palavra Get ou Put, seguida de um parágrafo (\n).
  2. Número mínimo de parâmetros: 3 (Morada; Categoria; Descrição);
  3. Respeitar a ordem de parâmetros: parâmetros ordenados como indicado.
  4. Número de parâmetros opcionais: 2 (Valor da renda; Outras informações) - definição mútua ou exclusiva, mas mantendo a ordem;
  5. Separador de parâmetros: Parágrafo (\n).

Exemplo de mensagem

  • em código:
"Get\nAveiro\nQuarto\nCama de casal, lareira\n150\nRenda nao inclui despesas"
  • ou SMS:
"Get
Aveiro
Quarto
Cama de casal, lareira
150
Renda nao inclui despesas"
  • Resultado - Entrada gerada a partir da mensagem:
<?xml version='1.0' encoding='utf-8'?>
<House Entry>
	<Sender>+351919124379</Sender>
	<Address>Aveiro</Address>
	<Category>Quarto</Category>
	<Description>Cama de casal, lareira</Description>
	<Rent>150</Rent>
	<Other info>Renda nao inclui despesas</Other info>
</House Entry>

Instruções de utilização

Crie uma aplicação Web (Web Application). Adicione um novo package ao projecto, em Source Packages

Em seguida, clique em ServicesWeb Services → <botão direito do rato> → Add Web Service…

Seleccione “URL” e insira o endereço do WADL: http://essmss.dyndns-server.com:8080/ES_MsgSrv/resources/application.wadl

Para o serviço de envio de SMS

Seleccione o package que criou anteriormente e, clicando no botão direito faça NewRESTful Java Client… e na nova janela seleccione IDE Registered na caixa “Select the REST resource:” → Browse…ES_MsgSrv[send]. Será gerado o código necessário para chamar o serviço.

Exemplo de classe que utiliza o serviço:

SendSMSClient.java
package resourcs;
 
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;
 
/** Jersey REST client generated for REST resource:SendSMS [send]<br>  *  USAGE:<pre>  *        SendSMSClient client = new SendSMSClient();  *        Object response = client.XXX(...);  *        // do whatever with response  *        client.close();  *  </pre>  * @author Roberto  */
public class SendSMSClient {
    private WebResource webResource;
    private Client client;
    private static final String BASE_URI = "http://essmss.dyndns-server.com:8080/ES_MsgSrv/resources";
 
    public SendSMSClient() {
        com.sun.jersey.api.client.config.ClientConfig config = new com.sun.jersey.api.client.config.DefaultClientConfig();
        client = Client.create(config);
        webResource = client.resource(BASE_URI).path("send");
    }
 
    public String getText(String text, String destNr) throws UniformInterfaceException {
        WebResource resource = webResource;
        if (text != null) {
            resource = resource.queryParam("text", text);
        }
        if (destNr != null) {
            resource = resource.queryParam("destNr", destNr);
        }
        return resource.accept(javax.ws.rs.core.MediaType.TEXT_PLAIN).get(String.class);
    }
 
    public void close() {
        client.destroy();
    }
 
    public static void main(String args[])
    {
        SendSMSClient client = new SendSMSClient();
        client.getText("Get\nAveiro\nQuarto\nLareira\n150", "918376770");
        client.close();
    }
}

Para o serviço de recepção de SMS

Devido ao carácter específico para o qual o serviço de recepção foi construído, a utilização do mesmo segue uma tipologia diferente do anterior. Os dados XML produzidos por este serviço são enviados para uma fila (queue) presente no Application Server denominada “SMSQUEUE”, e é acedendo a esta fila que é possível consumimr tais dados.

Segue um exemplo “académico” (já que apenas imprime os dados que recebe) de um cliente (consumidor) de dados provenientes da fila mencionada:

Consumer.java
package resourcs;
 
import javax.jms.*;
import org.apache.activemq.ActiveMQConnectionFactory;
 
/**  *  * @author Roberto  */
public class Consumer {
    // URL of the JMS server
    private static String url = "tcp://essmss.dyndns-server.com:61616";
    // Name of the queue we will receive messages from
    private static String subject = "SMSQUEUE";
 
    public static void main(String[] args) throws JMSException {
        // Getting JMS connection from the server
        ConnectionFactory connectionFactory
            = new ActiveMQConnectionFactory(url);
        Connection connection = connectionFactory.createConnection();
        connection.start();
 
        // Creating session for seding messages
        Session session = connection.createSession(false,
            Session.AUTO_ACKNOWLEDGE);
 
        // Getting the queue 'TESTQUEUE'
        Destination destination = session.createQueue(subject);
 
        // MessageConsumer is used for receiving (consuming) messages
        MessageConsumer consumer = session.createConsumer(destination);
 
        // Listen for arriving messages
        MessageListener listener = new MessageListener() {
            @Override
            public void onMessage(Message msg) { 
                System.out.println(msg.toString());
            }
        };
        consumer.setMessageListener(listener);
    }
}

 


Quinta-feira, 08 de Dezembro, 2011

   Um dos serviços a implementar no projecto eHouse Aveiro é o serviço de Pontos de Interesse. Este serviço irá funcionar como um agregador de outros serviços já disponíveis, entre os quais o Sapo Mapas, Google Places, Foursquare e Gowalla. Irá também contar com uma Base de Dados que servirá de backup caso estes serviços não se encontrem disponíveis.

   A descrição deste serviço já foi feita no meu post anterior, por isso irei preceder à utilização do mesmo.

 

Points Of Interestgo up

 

Visão Geralgo up

Este serviço disponibiliza uma lista de pontos de interesse de uma dada área (através da latitude, longitude e raio) para uma dada categoria (ou para todas).

O acesso a este serviço efectua-se através do seu ficheiro WSDL: http://api.web.ua.pt/dns/RequestPOIService/RequestPOI?wsdl

As categorias disponíveis são as seguintes:

IDCategory
1Bares/Discotecas
2Restaurantes
3Farmácias
4Centros Comerciais/Hypermercados
5Hoteis/Hostels
6Outros(Lazer) - Ginasios/Cinemas/etc

Operaçõesgo up

Este serviço disponibiliza 2 operações que irei descrever de seguida. O resultados destas operações é uma string com o seguinte formato:

 

<POI>

     <Name>"Nome do POI"</Name>

     <Address>"Morada do POI"</Address>

     <Latitude>"Latitude do POI"</Latitude>

     <Longitude>"Longitude do POI"</Longitude>

     <Type>"Tipo do POI"</Type>

</POI>

 

getPOIsByDistance

⇒ List getPOIByDistance(double lat, double lon, int radius)

Parâmetros

→double lat: Latitude do ponto onde queremos procurar os pontos de interesse.

→double lon: Longitude do ponto onde queremos procurar os pontos de interesse.

→int radius: Raio de abrangência da área onde queremos procurar os pontos de interesse.

Retorno

→List: Lista dos pontos de interesse encontrados.

getPOIsByTypeAndDistance

⇒ List getPOIByTypeAndDistance(double lat, double lon, int radius, int type)

Parâmetros

→double lat: Latitude do ponto onde queremos procurar os pontos de interesse.

→double lon: Longitude do ponto onde queremos procurar os pontos de interesse.

→int radius: Raio de abrangência da área onde queremos procurar os pontos de interesse.

→int type: ID da categoria de pontos de interesse que queremos procurar.

Retorno

→List: Lista dos pontos de interesse encontrados.

[Tutorial] How to use PointsOfInterest Servicego up

Para utilizar o Serviço PointsOfInterest será necessário criar uma Web Application como ilustra a figura seguinte:

Após a criação do projecto, deverá criar a classe que irá utilizar o serviço. Um exemplo simples de uma classe que utiliza este serviço encontra-se abaixo:

 

samplepoiclient.java
   import java.util.List;
   import javax.xml.ws.WebServiceRef;
 
   public class SamplePOIServiceClient {
 
       @WebServiceRef(wsdlLocation = "http://api.web.ua.pt/dns/RequestPOIService/RequestPOI?wsdl")
 
       static RequestPOIService nameOfServiceClient = new RequestPOIService();
 
       private static POIFacade endpointInterface;
 
       public static void main(String args[]) {
 
           endpointInterface = nameOfServiceClient.getRequestPOIPort(); // This method returns the endpoint interface
           /**             * This method returns a list of POIs depending on your location, radius and type of POI (see types of POIs)             */
           List<Object> sampleClient1 = endpointInterface.getPOIByTypeAndDistance(40.658, -8.658, 5000, 1); //radius in meters
           /**             * This method returns a list of POIs depending on your location and radius             */
           List<Object> sampleClient2 = endpointInterface.getPOIByDistance(40.658, -8.658, 5000); //radius in meters 
           /**             * Sample usage of POIs             */
           for(int i=0; i<sampleClient1.size(); i++){
               System.out.println(sampleClient1.get(i).toString());
           }  
       }
   }

 

 

Assim que criada esta classe ela irá conter erros, pois ainda não tem a referência ao serviço. Para isso, é necessário criar um cliente do serviço. As figuras abaixo ilustram o processo:

E pronto! O cliente está criado e funcional!

 


Segunda-feira, 14 de Novembro, 2011

     Um dos serviços a implementar no projecto eHouse Aveiro é o serviço de Pontos de Interesse. Este serviço irá funcionar como um agregador de outros serviços já disponíveis, entre os quais o Sapo Mapas, Google Places, Foursquare e Gowalla. Irá também contar com uma Base de Dados que servirá de backup caso estes serviços não se encontrem disponíveis. O diagrama seguinte ilustra o funcionamento do Serviço de Pontos de Interesse:

Diagrama 1: Diagrama de funcionamento do serviço

 

   Este serviço está a ser desenvolvido com base em Enterprise Java Beans e conta com o Java Persistence API para a base de dados de backup. Estes comunicam através do driver JDBC.

      O servidor aplicacional é o Glassfish e é onde o serviço irá ser implementado e estará disponível através do seu ficheiro WSDL.

     O objectivo deste serviço é recolher informação de várias fontes e disponibilizar as melhores opções ao cliente, podendo a procura por pontos de interesse ser categorizada por tipo (Restaurantes, Bares, Hospitais, Farmácias, etc) e/ou por distância a um outro ponto.

     Em breve disponibilizarei o WSDL para poderem usar este serviço 

 


Segunda-feira, 07 de Novembro, 2011

Um dos objectivos do projecto em questão é a disponibilização de serviços de recepção e envio de mensagens de texto - SMS. Para tal, recorreu-se a um Gateway WAP e SMS denominado Kannel, que permite a troca de conteúdos entre um Content Provider e um terminal móvel, como ilustrado a seguir.

 

 

Figura 1 - Disposição lógica dos componentes (terminal móvel, SMSCenter, Gateway SMS/WAP e Content Provider).

 

Um dispositivo móvel comunica por SMS com o SMSC do Kannel, realizando um pedido. O Kannel realiza um HTTP GET ao Content Provider para obter os conteúdos pretendidos e envia-os sob a forma de mensagem (SMS) de forma automática ao remetente da mensagem de pedido inicial.

 

A comunicação é realizada por GSM, com recurso a um pen modem ZTE K3571-Z da Vodafone.

A utilização deste modem resultou numa série de problemas de configuração e reconhecimento do mesmo por parte dos sistema operativo (SO) utilizado (Ubuntu 10.10 Virtual Machine), que foram resolvidos com a utilização de outro SO - Ubuntu 11.10 Virtual Machine, que resolveu os bugs de reconhecimento encontrados anteriormente.

 

Ultrapassada a questão de configuração do modem GSM, a configuração do Kannel é rápida, bastando recorrer ao excelente guia de apoio disponível em http://www.kannel.org/.

Seguiu-se a elaboração de Web services (WS) para testar o envio e recepção de mensagens. Estes foram construídos como RESTful Web services, dado que as interacções entre os diversos agentes considerados assentam em HTTP GET e PUT/ POST.

 

Figura 2 - Envio e recepção de mensagem de teste (de/para o mesmo número) através de Web service e Kannel.

Testando o Web service de envio e estando a resposta automática do Kannel activa, pode verificar-se a comunicação por SMS.

 

Efectuados os primeiros testes e obtidos os resultados pretendidos, passou-se ao refactoring dos WS construídos, de modo a moldá-los ao propósito a que se destinam no projecto em questão. Para tal, foram definidos os parâmetros que devem constar nos mesmos, e seus tipos de dados. A informação trocada entre os WS e os restantes agentes/ serviços é encapsulada em XML. Segue um exemplo de pedidos enviados por um terminal móvel para o serviço de recepção de SMS elaborado e seu processamento:

 

 

 Figura 3 - Pedidos (dois) e respectiva informação.

 


Figura 4 - XML gerado com base nas (duas) SMS enviadas.

 

(To Be Continued...)


Domingo, 06 de Novembro, 2011

 

   O produto que vamos desenvolver chama-se eHouse Aveiro. Esta ideia surgiu devido a um problema muito comum nos estudantes, a procura e mudança de casa.

   O nosso produto pretende resolver este problema, adicionando a um portal da Internet serviços muito utilizados nos dias de hoje, como mensagens SMS/MMS e redes sociais. Mais concretamente, o nosso portal vai conter um overlay do Facebook, ou seja, irá importar e utilizar recursos e informação do Facebook, como os Likes, Comments, Registration Plugin e outros que pareçam adequados. Ao importar estas funcionalidades pretendemos fornecer um ambiente mais user-friendly ao utilizador. O nosso produto irá permitir ao utilizador adicionar uma casa (habitação) para aluguer, enviando uma SMS ou MMS, ou seja, caso se encontre na rua e veja uma casa, pode tirar uma fotografia, adicionar informações e, de seguida, encaminhá-las para o nosso site, adicionando desta forma uma nova entrada à base de dados, referente à habitação em causa. Existirá uma mensagem modelo com campos obrigatórios, como por exemplo a morada, que além de fornecer informação sobre a localização da habitação, permite calcular os pontos de interesse perto dessa morada. Depois deste processo, a casa será adicionada no site e ao mesmo tempo será reencaminhada uma mensagem com toda a informação da habitação para potenciais interessados. Para definir os potenciais interessados, vamos criar um perfil com estados. Alguns do filtros poderão ser, “À procura de casa”, “Pretendo viver só com raparigas”, “Pretendo encontrar casa no local X”, etc. O cliente apenas tem de seleccionar os estados que pretende ter activados. Desta forma, o envio de mensagens e respectivos conteúdos ficam restringidos aos utilizadores que os pretendam receber, evitando o envio de mensagens a utilizadores sem interesse no conteúdo das mesmas.

   Os proprietários de casas que tenham casas para arrendar também poderão adicionar casa.

   A seguinte imagem apresenta o diagrama de casos de uso do produto:

   A próxima imagem representa o diagrama de tecnologias a ser utilizadas na criação do produto:


 

   Este diagrama representa as tecnologias que vão ser utilizadas e para fazer a sua integração vamos utilizar Webservices.

Projectos futuros

   Para facilitar o envio da mensagem pretende-se criar uma aplicação móvel para Android e para o IOS da Apple, no entanto, estas aplicações estão em segundo plano, para já. Esta aplicação além de permitir fazer o upload da informação para o site vai calcular a localização da casa. Esta informação será posteriormente usada para estimar o tempo de percurso a pé para locais importantes como a universidade, hospitais, museus, locais turísticos, farmácias, polícia etc.

 

 


Março 2012
Dom
Seg
Ter
Qua
Qui
Sex
Sab

1
2
3

4
5
6
7
8
9

11
12
13
14
15
16
17

18
19
20
21
22
23
24

25
26
27
28
29
30
31


arquivos
2012

2011

pesquisar
 

blogs SAPO


Universidade de Aveiro

subscrever feeds