Skip to content

Documentação Técnica — Lorentz Server

1. Visão geral da arquitetura

O Lorentz Server é uma aplicação .NET 9 que funciona como Background Service (serviço hospedado), executando um ciclo de processamento contínuo a cada segundo.

Componentes principais

LorentzCTI/
├── Program.vb             Ponto de entrada — configura o host
├── Worker.vb              Serviço em background — ciclo principal
├── modPhoenixCTI.vb       Módulo global — variáveis compartilhadas e TCP/UDP
├── Classes/
│   ├── clsServidor.vb     Servidor principal — distribuição de chamadas
│   ├── clsProcesso.vb     Sessão de agente/supervisor conectado
│   ├── clsDispositivo.vb  Ramal/tronco monitorado
│   ├── clsClienteWeb.vb   Agentes web (comunicação via banco de dados)
│   ├── clsData.vb         Camada de acesso a dados (SQL Server)
│   ├── clsParametro.vb    Leitura/escrita do arquivo .ini
│   ├── clsLog.vb          Sistema de logging em arquivos
│   ├── clsLicenca.vb      Validação de licença
│   ├── ICentral.vb        Interface para centrais telefônicas
│   ├── cls3cx.vb           Implementação para 3CX
│   ├── clsImpacta.vb      Implementação para Asterisk/Intelbras
│   ├── clsCanal.vb        Canal de comunicação (Asterisk)
│   └── AESCrypt.vb        Criptografia AES para senhas
└── CSTA/
    └── clsAsnOne.vb       Processamento ASN.1 para protocolo CSTA

2. Modelo de execução

Inicialização

  1. Program.vb cria um HostApplicationBuilder com .NET Generic Host
  2. Registra Worker como BackgroundService
  3. Worker.ExecuteAsync() instancia o servidor e entra em loop

Loop principal

Worker.ExecuteAsync():
    ServidorCTI = new clsServidor()     ← abre portas, conecta centrais
    while not cancellation:
        ServidorCTI.Servidor()           ← ciclo completo
        await Task.Delay(1000)           ← intervalo de 1 segundo

Inicialização do servidor

O construtor do servidor realiza:

  1. Lê parâmetros do arquivo .ini
  2. Abre socket TCP na porta de integração (agentes desktop)
  3. Abre socket TCP na porta de serviço (Supervisor web)
  4. Abre socket TCP na porta URA (IVR)
  5. Conecta-se a cada central telefônica configurada (suporta múltiplas)
  6. Atualiza banco de dados com evento de reinício do servidor

3. Portas e protocolos

Porta Protocolo Direção Finalidade
8001 (TCP) Proprietário binário Bi-direcional Comunicação com agentes desktop
3000 (TCP) Proprietário binário Servidor → Cliente Estado dos ramais para Supervisor web
4000 (TCP) XML Bi-direcional Integração com URA
8000 (UDP) Proprietário binário Bi-direcional Monitor CTI externo
7001 (TCP) CSTA/ASN.1 Bi-direcional Central Intelbras Impacta
Variável API/SQL Bi-direcional Central 3CX

Protocolo de comunicação com agentes

Os pacotes são delimitados por CHR(3) (início) e CHR(7) (fim), com campos separados por ;:

CHR(3) + código_pacote + ";" + sequência + ";" + dados... + CHR(7)

Códigos de pacote (agente ↔ servidor)

Código Direção Finalidade
1 Agente → Servidor Login
2 Servidor → Agente Estado do ramal
3 Agente → Servidor Solicitar número (pede-número)
4 Agente → Servidor Pausa eventual (ligar/desligar)
5 Agente → Servidor Pausa produtiva (ligar/desligar + motivo)
6 Agente → Servidor Consultar fila de espera
7 Agente → Servidor Solicitar lista de agentes monitorados
8 Agente → Servidor Enviar mensagem de chat
9 Agente → Servidor Comando telefônico (tirar do gancho, atender, reter, etc.)
10 Agente → Servidor Discagem para número/ramal
11 Agente → Servidor Solicitar lista de ramais
12 Agente → Servidor Solicitar lista de agentes logados
13 Agente → Servidor Alerta ao supervisor
14 Agente → Servidor Solicitar motivos de pausa produtiva
15 Agente → Servidor Alterar senha
16 Agente → Servidor Solicitar hora do servidor
17 Agente → Servidor Solicitar motivos de gravação
18 Agente → Servidor Registrar gravação de áudio
20 Agente → Servidor Permissão de transferência
21 Agente → Servidor Comando CSTA direto
22 Servidor → Agente Power Dialing (discagem preditiva)
23 Agente → Servidor Monitor de estado de ramais
24 Agente → Servidor Atualização de licença
25 Supervisor → Servidor Discagem pelo supervisor
26 Supervisor → Servidor Distribuição manual pelo supervisor

Pacotes de notificação (servidor → agente, código 0)

Sub-código Finalidade
0;1 Monitoramento de agentes (broadcast para supervisores)
0;2 Mudança de estado do ramal
0;6 Atualização de fila de espera
0;8 Mensagem de chat recebida
0;10 Mensagem de splash (boas-vindas)
0;13 Alerta do agente ao supervisor

4. Protocolo de monitoramento (UDP)

O monitor externo se comunica via pacotes UDP com cabeçalho de 3 bytes:

Byte 0: 0x30 + (comprimento >> 8)
Byte 1: comprimento AND 0xFF
Byte 2: código do comando
Byte 3+: dados (texto Latin1)
Código Direção Finalidade
1 Monitor → Servidor Conexão (retorna versão)
2 Monitor → Servidor Desconexão
3 Monitor → Servidor Consultar parâmetros
31 Monitor → Servidor Alterar parâmetros
4 Servidor → Monitor Estado de processo (agente)
5 Servidor → Monitor Estado de dispositivo (ramal)
6 Monitor → Servidor Status do sistema
7 Monitor → Servidor Reiniciar centrais
8 Monitor → Servidor Atualizar licença (hardlock)

5. Protocolo XML da URA

A URA se comunica via TCP na porta 4000 com mensagens XML:

Screen Pop (URA → Servidor)

<URA>
  <acao>screenpop</acao>
  <ramal>200</ramal>
  <!-- dados adicionais específicos do cliente -->
</URA>

Pesquisa de chamada (URA → Servidor)

<URA>
  <acao>pesquisa</acao>
  <ramal>200</ramal>
</URA>

Resposta da URA (URA → Servidor)

<URA>
  <acao>resposta</acao>
  <codigo>12345</codigo>
  <!-- dados de navegação -->
</URA>

Respostas do servidor

<URA><acao>screenpop</acao><retorno>sucesso</retorno></URA>
<URA><acao>screenpop</acao><retorno>falha</retorno></URA>
<URA><acao>pesquisa</acao><retorno>sucesso</retorno><codigo>12345</codigo></URA>

6. Interface com centrais telefônicas

O servidor utiliza uma interface comum para todas as centrais, permitindo trocar a implementação sem alterar o restante do sistema.

Operações suportadas

Operação Descrição
Iniciar conexão Conecta-se à central telefônica
Selecionar Processa eventos pendentes da central
Fazer chamada Origina uma chamada entre dois dispositivos
Atender chamada Atende uma chamada recebida
Limpar conexão Desconecta/desliga uma chamada
Desviar chamada Transfere uma chamada para outro destino
Consulta Inicia chamada de consulta sem desligar a atual
Conferência Junta chamada retida com chamada ativa
Estacionar Coloca chamada em park
Enviar DTMF Envia tons de discagem durante chamada
Pausar agente Sinaliza pausa na central (quando suportado)
Limpar ramal de serviço Remove associações de serviço de ramais inativos

Implementações disponíveis

  • 3CX (cls3cx.vb): conexão via API/banco de dados do 3CX
  • Intelbras/Asterisk (clsImpacta.vb): conexão via protocolo CSTA/ASN.1 ou AMI

7. Agentes web (sem TCP)

O mecanismo de agentes web permite que operadores utilizem o sistema via navegador, sem instalar o aplicativo desktop. A comunicação acontece inteiramente via banco de dados:

Tabela de situação CTI

Coluna Finalidade
Apelido Identificação do agente web
HashCode Identificador único da sessão
Cliente Comandos do agente para o servidor
Servidor Respostas do servidor para o agente
EstadoRamal Estado atual do ramal
A, B, C Informações de origem/destino
Externo Número externo
CodAtendimento Código do atendimento atual
Data Timestamp da última atualização
Ramal Ramal associado

Ciclo de comunicação

  1. Agente web grava comando na coluna "Cliente"
  2. Servidor lê a coluna a cada 1 segundo
  3. Servidor processa o comando (mesmo formato de pacote dos agentes TCP)
  4. Servidor grava resposta na coluna "Servidor"
  5. Agente web lê a resposta

8. Algoritmo de distribuição (ACD)

Seleção de agente

  1. Para cada chamada na fila (ordenada por hora de entrada): a. Consulta se o serviço permite distribuição b. Carrega o fluxo de roteamento do serviço c. Para cada etapa do fluxo:
    • Se grupo: procura agente livre (prioritário primeiro, depois mais antigo)
    • Se agente: verifica se o agente específico está livre
    • Se ramal: verifica se o ramal está desocupado
    • Se condição: avalia e segue caminho verdadeiro ou falso d. Se encontrou destino: transfere a chamada via central e. Se transbordo expirou: avança para próxima etapa

Critérios para agente estar "disponível"

Um agente é considerado disponível quando todas as condições são verdadeiras:

  • Está no grupo correto
  • Tem receptivo ativado
  • Ramal está livre
  • Pausa está desligada
  • Está logado (com apelido definido)
  • Não está selecionado para outra distribuição

Prioridade

  • Agentes com receptivo prioritário são avaliados primeiro
  • Entre agentes com mesma prioridade, o que está livre há mais tempo é selecionado

9. Armazenamento de configuração

O arquivo .ini usa formato INI padrão com seção [Parametros]:

[Parametros]
ServidorSQL=127.0.0.1
BancoSQL=LorentzCTI
UsuarioSQL=sa
SenhaSQL=<criptografado>
PhoenixPortaTCP=8001
CTI_Impacta_Ip=192.168.1.10
CTI_Impacta_Porta=7001
Fabricante=3CX
Modelo=3cx
  • O arquivo é criado automaticamente se não existir
  • Senhas são armazenadas com criptografia simétrica
  • O encoding é Latin1 (ISO-8859-1)
  • Alterações via Monitor CTI são gravadas imediatamente

10. Criptografia

O sistema utiliza dois métodos de criptografia:

Método Uso
Criptografia simétrica proprietária Senhas no arquivo .ini (SQL e AMI)
AES-256 Dados sensíveis em trânsito

11. Considerações de desempenho

  • O servidor processa uma chamada por ciclo na distribuição (para evitar condições de corrida)
  • A fila de espera usa SortedDictionary para ordenação eficiente por timestamp
  • Sessões de URA expiram automaticamente após 5 minutos sem atividade
  • Limite de 50 conexões simultâneas de URA (proteção contra vazamento)
  • O fluxo de roteamento tem limite de 50 etapas por avaliação (proteção contra loop infinito)
  • A atualização de fila de espera para supervisores ocorre a cada 25 ciclos (~25 segundos)
  • O garbage collector é invocado explicitamente ao fim de cada ciclo

Última atualização: Junho 2025