Invoice On-Demand

Dezembro 16 2013

 

Várias são as possíveis utilizações do cartão de cidadão e o que pretendo transmitir aqui é como é possível aceder aos dados do mesmo, através do “Middleware do Cartão de Cidadão”, disponibilizado pela Administração Pública Portuguêsa.

Para se ter acesso as funcionalidades do cartão recorrendo a uma aplicação desenvolvida por terceiro, é necessário fazer o download da libraria para a linguagem que pretende, neste caso vai ser utilizado Java embora também seja possível fazer aplicações em .Net e C.


Para esta aplicação foi utilizada uma máquina com Windows.

Antes de se começar a trabalhar é necessário fazer o download do Middleware e Manual  para o Cartão de Cidadão vamos a este link http://www.kitcc.pt/ccidadao/kits e tem-se acesso a vária documentação/aplicações utieis, como por exemplo “Manual técnico do Middleware Cartão de Cidadão” - http://www.kitcc.pt/ccidadao/documentos/cc_manual_middlware_technical_v121.pdf e o “Middleware para ler Cartões de Cidadão” - http://www.kitcc.pt/ccidadao/documentos/ficheiros_incm_cc_kittestes.zip.

No documento “Manual técnico do Middleware Cartão de Cidadão” podem ser encontradas as funções disponíveis para utilizar com o cartão de cidadão, já com “Middleware para ler Cartões de Cidadão” encontram-se dois exemplos de utilização do Cartão de Cidadão, em Java e em C#.

Agora que já temos o Middleware, vamos abrir o ficheiro de teste que é disponibilizado, aqui podemos ver todo o tipo de dados que podem ser obtidos com a utilização do cartão de cidadão.


Antes de se executar a aplicação de teste que é disponibilizada é primordial que se inclua a libraria fornecida “pteidlibj.jar” para ter acesso as funções de utilização do cartão.

O código fornecido é bastante explicativo, mas dentro dele vou citar a parte que faz a leitura dos dados pessoais (Nome, Data de Nascimento, Altura, Sexo, ..)


Para se aceder a uma parte privada (Morada, Código Postal, N.º de Porta, ..) é necessário o código pin da morada.

De seguida vem uma parte importante, que é o tratamento de erros, e que está bem explicada no relatório. Todo o tipo de erros que a aplicação possa ter na execução de operações podem ser visíveis na documentação acima mencionada.


Com esta informação é fácil de se começar a utilizar o Cartão de Cidadão como fonte de dados ou para qualquer outro tipo de tarefa.

 


Dezembro 16 2013

Um dos objectivos do Kannel é funcionar como gateway de SMS para redes GSM, podendo assim receber e enviar SMS. Está será a funcionalidade por nós implementada e aqui explicada.

O seguinte diagrama pretende definir a arquitectura do Kannel:

 

Figura 1: Arquitectura.

Esta arquitectura consiste no seguinte: o telemóvel envia uma SMS para o número da placa GSM do Kannel (no nosso caso, por exemplo a pedir uma factura relativa a uma compra num café). O Kannel processa a mensagem de texto e reencaminha para o servidor o conteúdo pretendido. O SMSC envia a resposta com o conteúdo que o Kannel.

Nesta pequeno tutorial que a seguir apresentamos foi usada uma pen TMN ZTE MF190J.

 

1. Instalar o Kannel.

O primeiro passo, obviamente, pela instalação com o seguinte comando:

     sudo apt-get install Kannel

 

2.  Configuração da smsbox.

Alterar o ficheiro que está em /etc/default/Kannel para descomentar a parte do ficheiro que irá permitir a troca de SMS.

     START_WAPBOX = 1
     START_SMSBOX = 1

 

3.  Construção do ficheiro de configuração

Neste passo começamos a interagir com o ficheiro /etc/Kannel/Kannel.conf que será o maior responsável pela troca de SMS.

O primeiro grupo a ser inserido no ficheiro de configuração será o “core” que será o grupo onde será configurado o beararbox.

     group = core
     admin-port = 15000
     smsbox-port = 15001
     admin-password = bar
     status-password = foo
     log-file = "/var/log/kannel/bearerbox.log"
     access-log = "/kannelaccess.log"
     log-level = 0
     box-deny-ip = "*.*.*.*"
     box-allow-ip = "127.0.0.1"

      

Para procedermos à configuração do centro de SMS do Kannel teremos de construir um grupo chamado “smsc”. Este grupo deve incluir todos os dados necessários para proceder à ligação ao centro de SMS.

Neste grupo irão aparecer alguns dados relativos à placa, tais como: o número do cartão desta, o número do centro de mensagens do respectivo operador (TMN +351962100000, Vodafone +351911616161 e Optimus +35193121314) e a porto usb do PC onde a placa se encontra conectada.

     group = smsc
     smsc = at
     modemtype = auto
     device = /dev/ttyACM0
     speed = 460800
     my-number = <your-number>
     sms-center = <center-sms>
     validityperiod = 167

 

Para verificar o porto de ligação da placa poderemos instalar o wvdial e correr o ficheiro de configuração wvdialconf.

     sudo apt-get install wvdial
     sudo wvdialconf

 

 

 Figura 2: Exemplo da execução do wvdial.

Após especificar onde a placa se encontrava conectada, precedemos à elaboração do grupo “modems” que terá toda a configuração necessária para o correcto funcionamento desta.

     group = modems
     broken = true
     id = ZTE WCDMA Technologies MSM
     name = "ZTE WCDMA Technologies MSM"
     detect-string = "MF190J-2.0.0"
     init-string = "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"
     speed = 460800
     enable-mms = true
     message-storage = me

 

Para o envio de uma sms teremos de definir o “SMSBox”. Este grupo terá todas as informações necessárias sobre a omposição do link que irá permitir o envio da SMS.

     group = smsbox
     bearerbox-host = localhost
     sendsms-port = 15013
     global-sender = <your-number>
     sendsms-chars = "0123456789 +-"
     log-file = "/var/log/kannel/smsbox.log"
     log-level = 0
     access-log = "/var/log/kannel/access.log"
     log-file = "/smsboxlog.log"
     immediate-sendsms-reply = true

 

Deveremos definir um ou mais utilizadores para que seja activo o push SMS através da interface HTTP. O grupo responsável pela criação desta denomina-se “sendsms-user”

     group = sendsms-user
     username = kannel
     password = kannel
     default-smsc = mobiphone

 

Assim, após a criação destes dois grupos, já estaremos em condições de processar o envio de mensagens do nosso servidor Kannel para o número à nossa escolha (correndo o servidor e o cliente). Mediante as configurações que anteriormente temos, podemos concluir que o link responsável por este envio é:

http://localhost:15013/cgi-bin/sendsms?username=kannel&password=kannel&to=<destination-number>&text=<text>

  

Por último, a única coisa que nos falta para o nosso serviço de SMS funcionar como queremos é a criação de um grupo “sms-service”. Este grupo estará responsável pela recepção das SMS por nós desejadas.

     group = sms-service
     keyword = default
     get-url = "http://localhost:9000/smscenter/receive?number=%p&text=%b"
     accept-x-kannel-headers = true
     max-messages = 1
     concatenation = true
     catch-all = true

 

O funcionamento deste serviço é muito simples. De destacar a tag “keyword” que detecta o conteúdo da mensagem, verifica se é igual, e se o for executa o restante grupo (poderíamos ter uma tag “text” com o conteúdo que queríamos responder à pessoa, por exemplo). Quanto à tag “get-url”, será automaticamente preenchida aquando da recepção duma SMS, o que fará disparar o web-service por nós criado para leitura destes parâmetros.

 

4.       Execução dos serviços

Após finalizada a configuração do ficheiro Kannel, podemos proceder à execução do servidor e do cliente para, finalmente, testarmos o nosso serviço.

Para a execução do servidor executamos o seguinte comando (aquando do arranque do sistema operativo, o Kannel arranca automaticamente um processo, sendo assim importante pará-lo primeiro):

     sudo /etc/init.d/kannel stop            
     cd /usr/sbin
     sudo ./bearerbox –v 1 /etc/kannel/kannel.conf

Após este, somente nos falta executar o cliente Kannel:

     sudo ./smsbox –v 1 /etc/Kannel/Kannel.conf

Para exemplificar o q antes explicamos, seguem-se as seguintes imagens:

 

Figura 3: Execução do servidor.

Figura 4: Execução do cliente.

 

Figura 5: Exemplo de envio de SMS.

 

Figura 6: Exemplo de recepção de SMS.

 

Problemas durante a criação do serviço:

  • Durante a execução do trabalho, tivemos de trocar de placa GSM porque a placa anteriormente usada tava com alguns problemas na recepção de SMS. À partida seria a falta de alguns comandos AT.
  • Problemas com a criação init-string e detect-string do grupo modems. Estes problemas podem ser resolvidos correndo o servidor com a opção 0 (modo debug) e assim, aquando da leitura das destas variáveis do ficheiro Kannel, irá dar um erro e informar do que era suposto aparecer.
  • Problemas na execução de algumas funcionalidades do Kannel, que nos prenderam durante algum tempo.

Aqui segue o ficheiro de configuração: kannel.conf


Novembro 26 2013

Muitos dos sites de elevado desepanho criados hoje em dia, por vezes, necessitam de realizar tarefas que levam uma quantidade relativamente grande de tempo, tal como a geração de pdfs ou o envio de emails ou a importação de arquivos. Algumas dessas tarefas exigem muita memória, outras apenas requerem demasíado tempo para concluirem. De forma a construir uma arquitetura escalável que nos permita processar em background estas tarefas recorremos a um Message Broker, mais concretamente ao RabbitMQ e a uma implementação em PHP com a framework Symfony 2 para realizar o processamento e geração dos ficheiros PDF de forma eficiente.

 

O que é o RabbitMQ?

RabbitMQ é um message broker que permite enviar mensagens através de um processo chamado de producer/produtor e posteriormente ler as mensagens na fila de espera através de um consumer/consumidor. Neste processo de envio e leitura de mensagens encontram-se 3 conceitos chave:

  1. exchange – são pontos de entrada para todas as mensagens publicadas pelos produtores.
  2. queue – Fila onde são armazenadas as mensagens.
  3. binding – bindings são conjuntos de regras para interligar queues e exchanges, define para que queue deve ser enviada a mensagem recebida no ponto de entrada.

As mensagens nas filas são armazenadas de forma independente. Cada mensagem contém a informação necessária ao seu processamento. Uma mensagem pode ser um objecto serializado, um email a enviar, uma imagem, ou outro elemento qualquer.

 

Representação do processamento das mensagens

 

Vantagens da utilizar o RabbitMQ

Através utilização do RabbitMQ foi possível compreender as seguintes vantagens na nossa aplicação:

  1. Scalability – Um consumidor, lê uma mensagem da fila, mas não tem que existir necessáriamente apenas um consumidor. Por isso podemos criar multiplos consumidores quantos nos seja necessário.
  2. Clustering – Multiplos servidores RabbitMQ na rede local podem ser agrupados de forma a criarem um único broker logico.
  3. Highly Available Queues – As filas podem ser clonadas para multiplas máquinas num cluster, garantindo que, mesmo em caso de falha de hardware as mensagens são guardadas.
  4. More responsive applications – através da delagação das tarefas/processamento complexo ao RabbitMQ a nossa aplicação pode focar-se em realizar as tarefas realmente importantes para o utilizador ou para o serviço.

 

Instalação

 

Adicionar as sources ao ubuntu

 $ deb http://www.rabbitmq.com/debian/ testing main

$ wget http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
$ sudo apt-key add rabbitmq-signing-key-public.asc
 

 

Instalar 

$ sudo apt-get update
$ sudo apt-get install rabbitmq-server

 

Verificar o estado

$ sudo rabbitmqctl status

Instalar o plugin de administração

$ sudo rabbitmq-plugins enable rabbitmq_management

 

 Abrir o painel de administração em http://your-server.name:15672

 

 Criar o consumidor

 

<?php

namespace Es\InvoiceBundle\Service;

use OldSound\RabbitMqBundle\RabbitMq\ConsumerInterface;
use PhpAmqpLib\Message\AMQPMessage;

class PdfGeneratorConsumer implements ConsumerInterface
{
    private $pdf_generator;

    public function __construct(LoggableGenerator $pdf_generator)
    {
        $this->pdf_generator = $pdf_generator;
    }

    public function execute(AMQPMessage $msg)
    {
        //deserializar a mensagem
$msg = unserialize($msg->body); $url = $msg['url']; $output = $msg['output'];
        //realizar processamento
$this->pdf_generator->generate($url, $output);
        //confirmar o processamento completo com return true
return true; } }

 

O RabbitMQ é sem dúvida uma ferramente muito poderosa, este é apenas um artigo simples de configuração e implementação em PHP e como tal recomendo a leitura dos tutoriais disponíveis da página oficial: 


Outubro 02 2013

Apresentação

Os autores deste blog, são alunos da Universidade de Aveiro, e inscritos na disciplina de Engenharia de Serviços (ano lectivo 2013/2014), neste disciplina os alunos são avaliados por implementar um sistema com uma arquitectura SOA, em que pretende introduzir os alunos aos vários conceitos associados a Serviços e às Telecomunicações.
O projecto consiste em aplicar os conceitos teóricos adquiridos nas aulas.
 

Grupo

O grupo é composto por:

  • Miguel Pereira (ECT);
  • Paulo Oliveira (MSI);
  • Sérgio Cunha (MSI);
  • Tiago Brito (MSI).

Descrição

O projecto consiste em disponibilizar um sistema que forneça novas interfaces de interacção para a gestão e acquisição de facturas (formato digital), a plataforma terá como principal canal de comunicação envio de mensagens (SMS) entre o End-User e o sistema. E posteriormente, aceder às facturas remotamente (sem de as ter de pedir no momento/local).



Descrição



Objectivos

Como dito anteriormente, a implementação será suportada por uma arquitectura SOA, então os serviços descritos e distribuídos pelo grupo são:

  • Requisitar factura
    • através de SMS
  • Gestão de Utilizadores
    • recorrendo ao Cartão do Cidadão
  • Serviço de [troca de] Mensagens
    • Genérico
    • SMS, XMPP, ...
  • Serviço de Composição
    • Disponibiliza meios para o desenvolvimento de aplicações (API)
      • Mobile, Web, Desktop, …

 

E assim termina a fase de modelação, com a apresentação da API, e começa a implementação...

 


Plataforma de Gestão e Criação de Facturas Digitais
Dezembro 2013
Dom
Seg
Ter
Qua
Qui
Sex
Sab

1
2
3
4
5
6
7

8
9
10
11
12
13
14

15
17
18
19
20
21

22
23
24
25
26
27
28

29
30
31


as minhas fotos
pesquisar neste blog
 
subscrever feeds
blogs SAPO