Ambiente de Desenvolvimento¶
Durante o desenvolvimento do seu aplicativo, ou durante o desenvolvimento do próprio projeto SATHub é OK executar a aplicação através do servidor HTTP embutido no Flask (na verdade, neste último caso é até desejável).
Executando em Linux¶
Em ambientes Linux, principalmente no Ubuntu e outras distribuições onde o
interpretador Python está sempre presente, é simples. Basta criar um ambiente
virtual, instalar os requisitos e executar runserver.py
:
$ sudo apt-get install python-virtualenv virtualenvwrapper
$ mkvirtualenv sathub
(sathub) $ git clone https://github.com/base4sistemas/sathub.git
(sathub) $ cd sathub
(sathub) $ pip install -r requirements.txt
(sathub) $ python runserver.py
Instalando em Windows 8.1¶
Caso queira experimentar SATHub em Windows, o roteiro não é exatamente curto mas é bem simples. O primeiro passo é instalar o Python 2.7 e todas as demais dependências para que seja possível executar o servidor SATHub em modo de desenvolvimento.
Baixe o arquivo MSI para sua arquitetura neste link. Procure o link Latest Python 2 Release e então localize o link para para o pacote Windows x86 MSI installer ou Windows x86-64 MSI installer se a arquitetura do seu sistema for 64 bits. Faça a instalação normalmente como qualquer outro pacote MSI, aceitando as opções pré-definidas.
Para ter acesso aos binários, será preciso incluir o caminho em
Path
. TecleWin+X
e escolha a opção Sistema.No diálogo Sistema escolha a opção Configurações avançadas do sistema.
No diálogo Propriedades do Sistema, guia Avançado, clique no botão Variáveis de Ambiente.
Na lista de Variáveis do Sistema localize a variável
Path
, selecione-a e clique em Editar e inclua (não apague o valor já existente) o seguinte trecho no início do campo Valor:C:\Python27;C:\Python27\Scripts;
Se você instalou o Python em um caminho diferente, adapte os valores.
Abra o Windows PowerShell: mova o cursor para o canto superior direito, clique na opção Pesquisar e escreva
powershell
. A primeira opção encontrada deverá ser Windows PowerShell, clique nela.Digite o seguinte comando no terminal:
PS C:\Users\User> python --version Python 2.7.10
Se obtiver um erro, revise os passos.
Com o Python instalado será preciso instalar as dependências para execução do SATHub em modo de desenvolvimento. Ainda no Windows PowerShell:
PS C:\Users\User> pip install virtualenv
PS C:\Users\User> virtualenv sat
PS C:\Users\User> .\sat\Scripts\activate.ps1
(sat) PS C:\Users\User> pip install flask
(sat) PS C:\Users\User> pip install flask-restful
(sat) PS C:\Users\User> pip install unidecode
(sat) PS C:\Users\User> pip install requests
(sat) PS C:\Users\User> pip install satcomum
(sat) PS C:\Users\User> pip install satcfe
Faça o download dos fontes
do projeto SATHub (ou clone o projeto se você possui o
Git instalado) e descompacte o arquivo em
um diretório de sua preferência, digamos C:\workdir
.
(sat) PS C:\Users\User> cd \workdir\sathub-master\
(sat) PS C:\workdir\sathub-master> python runserver.py
Se lhe for apresentando o diálogo de restrição de acesso do Firewall do Windows, permita o acesso para o aplicativo. Você deverá ver uma saída como essa (aparentemente com informação duplicada, isso é normal em desenvolvimento):
SATHub versao 0.1
[-] Debug esta LIGADO
[-] Caminho para DLL: sat.dll
[-] Convencao de chamada para DLL: Windows "stdcall"
** DLL NAO ENCONTRADA **
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
[-] Debug esta LIGADO
[-] Caminho para DLL: sat.dll
[-] Convencao de chamada para DLL: Windows "stdcall"
** DLL NAO ENCONTRADA **
Neste ponto o servidor está em execução, mas há um problema. Note a mensagem
que diz DLL NAO ENCONTRADA. Interrompa o servidor teclando Ctrl+C
.
Note que após a primeira execução foi criado um arquivo chamado conf.json
.
Abra esse arquivo com um editor de textos e coloque o caminho completo para a
DLL do seu equipamento SAT. O arquivo deverá ficar mais ou menos assim:
{
"debug": true,
"codigo_ativacao": "123456789",
"convencao_chamada": 2,
"caminho_dll": "C:/SAT/SAT.DLL"
}
Note que o caminho para a DLL é especificado usando barras no padrão Unix
(/
forward slahes), mesmo no Windows, ao invés de usar contra-barras.
Se o seu código de ativação for diferente, altere-o também. A convenção de
chamada 2
significa Windows Standard calls (ou apenas Windows StdCall).
Se sua DLL usar a convenção de chamadas de C (Standard C calls) altere a
propriedade convencao_chamada
para 1
.
Execute o servidor novamente com python runserver.py
. Você deverá ver a
seguinte saída.
SATHub versao 0.1
[-] Debug esta LIGADO
[-] Caminho para DLL: C:\SAT\SAT.DLL
[-] Convencao de chamada para DLL: Windows "stdcall"
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
[-] Debug esta LIGADO
[-] Caminho para DLL: C:\SAT\SAT.DLL
[-] Convencao de chamada para DLL: Windows "stdcall"
Acessando a API via PowerShell¶
Neste ponto o servidor está em execução, o caminho para a DLL do equipamento SAT foi configurado e está tudo OK. Podemos então fazer algumas chamadas à API do SATHub para vê-lo em ação. Abra outra janela do PowerShell e digite:
PS C:\Users\User> Invoke-RestMethod -Uri http://localhost:5000/hub/v1/consultarsat -Method POST -Body "numero_caixa=1"
Na janela do terminal PowerShell em que o servidor está em execução você verá o
acesso à URI, o método de acesso e o código de resposta, 200
OK, entre
outras informações:
127.0.0.1 - - [20/Jun/2015 10:25:48] "POST /hub/v1/consultarsat HTTP/1.1" 200 -
No terminal em que o comando Invoke-RestMethod
foi executado você terá o
seguinte resultado (se tudo correr bem):
funcao retorno
------ -------
ConsultarSAT 101341|08000|SAT em operação||
O equivalente em um terminal Linux, usando curl, é o seguinte (acessando a máquina Windows 8.1 em que o SATHub está executando, como no exemplo acima):
$ curl --data "numero_caixa=1" http://10.0.0.115:5000/hub/v1/consultarsat
{
"funcao": "ConsultarSAT",
"retorno": "101363|08000|SAT em opera\u00e7\u00e3o||"
}
Se você tiver outras máquinas Windows em uma rede local, ou estiver usando máquinas virtuais, você poderá acessar um único equipamento SAT a partir de qualquer uma delas.
Acessando a API em C#¶
Os exemplos abaixo mostram como é simples acessar a API RESTful de SATHub através de outras linguagens muito comumente usadas neste campo de aplicações. Neste exemplo, usando C# (testado com MonoDevelop):
// (!) baseado em http://stackoverflow.com/a/4015346/550237
using System;
using System.Collections.Specialized;
using System.Net;
using System.Text;
public class ExemploSATHub
{
static public void Main()
{
Console.WriteLine(ConsultarSAT());
}
private static string ConsultarSAT()
{
var payload = new NameValueCollection();
payload["numero_caixa"] = "1";
var client = new WebClient();
var response = client.UploadValues(
"http://10.0.0.115:5000/hub/v1/consultarsat", payload);
return Encoding.Default.GetString(response);
}
}
O resultado é o seguinte:
$ msc exemplo.cs
$ mono exemplo.exe
{
"funcao": "ConsultarSAT",
"retorno": "100914|08000|SAT em opera\u00e7\u00e3o||"
}
Executando smoke tests¶
Certas funções SAT são difíceis de serem executadas contra um equipamento SAT
real ou até mesmo contra o emulador desenvolvido pela Secretária da Fazenda,
como por exemplo, AtualizarSoftwareSAT
ou CancelarUltimaVenda
. Por esse
motivo foi desenvolvido um mockup da biblioteca SAT, que implementa todas as
funções que a biblioteca SAT implementa, mas não acessa nenhum equipamento. As
funções apenas recebem os parâmetros esperados e devolvem uma resposta muito
parecida com uma resposta de sucesso. Desse modo, o mockup da biblioteca SAT
torna trivial executar testes simples para verificar o comportamento da API.
Para executar os smoke tests será necessário compilar o mockup da
biblioteca SAT que está em sathub/test/mockup/
. Você irá precisar de um
compilador GCC ou outro capaz de compilar o código. Tipicamente, em um ambiente
Linux, basta invocar make
para produzir o arquivo libmockupsat.so
.
Configure o SATHub apontando para o mockup da biblioteca SAT (normalmente, a
convenção de chamada será Standard C, equivalente a 1
):
{
"debug": true,
"codigo_ativacao": "123456789",
"convencao_chamada": 1,
"caminho_dll": "~/sathub/test/mockup/libmockupsat.so"
}
Para executar os testes é necessário instalar o framework para testes de APIs RESTful PyRestTest e suas dependências:
(sat)$ pip install pyresttest pyyaml pycurl jsonschema
Abra uma janela de terminal e execute o servidor SATHub:
(sat)$ python runserver.py
Abra uma outra janela do terminal e vá até o diretório onde está o arquivo YAML que descreve os testes e execute-os com PyRestTest:
(sat)$ cd ~/sathub/test/tests
(sat)$ resttest.py http://localhost:5000 smoke.yaml
Test Group Metodos SAT-CF-e SUCCEEDED: 14/14 Tests Passed!
Considerações¶
Via de regra, é recomendado que se mantenha um olho na legislação vigente a respeito da tecnologia SAT-CF-e e das implicações dessa legislação na tecnologia de suporte empregrada. Atualmente não há nada regulamentando o acesso compartilhado ao equipamento SAT. Tudo o que se tem é que essa possibilidade tem sido aventada desde os primórdios do projeto.
Sendo assim, apenas use o bom senso ao compartilhar o acesso ao equipamento SAT e evite compartilhar muitos pontos-de-venda em único equipamento. Considere balancear o número de pontos-de-venda e tenha sempre uma folga para redirecionar em caso de pane em um equipamento, por exemplo.