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¶
Program.vbcria umHostApplicationBuildercom .NET Generic Host- Registra
WorkercomoBackgroundService 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:
- Lê parâmetros do arquivo
.ini - Abre socket TCP na porta de integração (agentes desktop)
- Abre socket TCP na porta de serviço (Supervisor web)
- Abre socket TCP na porta URA (IVR)
- Conecta-se a cada central telefônica configurada (suporta múltiplas)
- 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 ;:
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)¶
Resposta da URA (URA → Servidor)¶
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¶
- Agente web grava comando na coluna "Cliente"
- Servidor lê a coluna a cada 1 segundo
- Servidor processa o comando (mesmo formato de pacote dos agentes TCP)
- Servidor grava resposta na coluna "Servidor"
- Agente web lê a resposta
8. Algoritmo de distribuição (ACD)¶
Seleção de agente¶
- 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