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!

 


Dezembro 2011
Dom
Seg
Ter
Qua
Qui
Sex
Sab

1
2
3

4
5
6
7
10

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