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.
As operações estão divididas em 2 serviços diferentes, para respectivo envio e recepção de mensagens.
A recepção de mensagens aceita apenas mensagens cujo conteúdo, independentemente do tipo de mensagem, respeita as seguintes regras:
"Get\nAveiro\nQuarto\nCama de casal, lareira\n150\nRenda nao inclui despesas" "Get Aveiro Quarto Cama de casal, lareira 150 Renda nao inclui despesas"
<?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>
Crie uma aplicação Web (Web Application). Adicione um novo package ao projecto, em Source Packages
Em seguida, clique em Services → Web 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_
Seleccione o package que criou anteriormente e, clicando no botão direito faça New → RESTful 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:
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(); } }
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:
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); } }
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.
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/RequestPOIServi
As categorias disponíveis são as seguintes:
| ID | Category |
|---|---|
| 1 | Bares/Discotecas |
| 2 | Restaurantes |
| 3 | Farmácias |
| 4 | Centros Comerciais/Hypermercados |
| 5 | Hoteis/Hostels |
| 6 | Outros(Lazer) - Ginasios/Cinemas/etc |
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>
⇒ List getPOIByDistance(double lat, double lon, int radius)
→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.
→List: Lista dos pontos de interesse encontrados.
⇒ List getPOIByTypeAndDistance(double lat, double lon, int radius, int type)
→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.
→List: Lista dos pontos de interesse encontrados.
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:
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!
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 ![]()
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...)
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.
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.