> For the complete documentation index, see [llms.txt](https://portal-integracao.intelbras.com.br/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://portal-integracao.intelbras.com.br/defense-ia-and-lite/readme/pdv.md).

# PDV

Conceitos de PDV e integração com o Defense para sincronizar eventos de venda com vídeo do caixa, incluindo protocolo ASCII/POS e exemplo de servidor TCP.

### **O que é o PDV?**

O PDV (Ponto de Venda) é o local ou sistema onde a venda é registrada, seja em um ambiente físico ou digital.

**Exemplos de PDV:**

* Loja online / e-commerce
* Sistema de caixa
* Loja física (balcão, caixa)
* Maquininha de cartão

### **Como funciona o PDV ?**

O PDV envia os dados da venda para o **Defense**, que, por sua vez, **associa essas informações ao vídeo da câmera do caixa**. Assim, é possível visualizar, **simultaneamente**, tanto os detalhes da venda quanto a gravação em **tempo real** do momento da transação.

1. **Venda acontece no PDV**

O operador registra a venda com **produto**, **valor**, **forma de pagamento, Data e hora,** etc.

2. **O PDV envia os dados**

O sistema do PDV envia os dados para o Defense via **API, TCP/IP, Middleware**, etc.

3. **Defense recebe e sincroniza.**

O Defense recebe os dados e utiliza de data e hora para sincronizar e vincular o vídeo com a venda em determinado caixa.

{% hint style="info" %}
**Importante:** PDV, Defense e DVR/NVR devem estar com data e hora sincronizadas via NTP.\
Qualquer diferença de horário compromete a associação correta entre venda e vídeo.
{% endhint %}

4. **Gravação no DVR/NVR**

O gravador permanece gravando normalmente e consegue marcar o momento exato da venda.

Como resultado é possível buscar por **produto, operador, caixa, investigar golpes, caixa com valor fora do padrão, etc**

<figure><img src="https://3558738335-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2Fu2gr1s2Izdazx5BlQHLu%2Fuploads%2FgWBVNWtqLWLwDMFTisK4%2FDecision%20Path%20Selection%20Flow-2025-12-17-173352.png?alt=media&amp;token=7c4fef30-7b82-4eee-ad3e-d2f9991d7fa5" alt=""><figcaption></figcaption></figure>

***

### **Como utilizar o PDV ? (Defense)**

1. **Câmera no caixa**

* Instalar as câmeras focada nas **mãos do operador, no produto, gaveta de dinheiro, etc.**

2. **Sincronizar horário (MUITO IMPORTANTE)**

* Configure o NTP (Network Time Protocol) no **PDV, Defense e DVR/NVR**

3. **Configurar o DVR/NVR no Defense**

* Adicionar o gravador (IP, usuário e senha)
* Testar a comunicação
* Mapear as câmeras

4. **Configurar o PDV no Defense**

* Cadastrar o tipo do PDV
* IP/porta ou endpoint
* Método de envio (TCP, API, middleware)
* Testar recebimento de evento

5. **Associar o PDV com o gravador**

* Caixa 1 → Câmera 1
* Caixa 2 → Câmera 2

***

### **ASCII**

### **O que é ?**

Como os computadores trabalham com números, o padrão ASCII define valores numéricos para representar caracteres, símbolos e comandos de texto.\
Ele é amplamente utilizado em **PDV, Defense, gravadores e integrações**, pois permite o envio de informações em **texto simples e compatível**, que são interpretadas pelo **servidor de destino**.

**Exemplos:**

* Comunicação TCP/IP
* Mensagens de PDV para sistemas
* Logs de venda

**Exemplo de texto de PDV em ASCII:**

```
SALE;CAIXA=01;VALOR=25.90;DATA=2025-12-16
```

### **Como funciona ?**

1. **PDV**

O PDV gera os dados de venda

* Produto
* Valor
* Caixa
* Forma de pagamento

2. **Defense**

* Recebe a mensagem em ASCII
* Interpreta (ou decodifica) os dados
* Associa as informações com:
  * Câmera
  * Caixa
  * Horário

3. **DVR/NVR**

* Entrega o vídeo solicitado.

***

### **Servidor de Integração PDV (ASCII → Eventos POS)**

```python
import socket

HOST = "127.0.0.1"   # IP DO SEU PC
PORT = 9000             # MESMA porta configurada no DVR

STX = b'\x02'
ETX = b'\x03'
LF  = b'\x0A'

print(f"Servidor POS aguardando em {HOST}:{PORT}...")

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)

    conn, addr = s.accept()
    print(f"DVR conectado: {addr}")

    buffer = b""

    while True:
        data = conn.recv(1024)
        if not data:
            break

        buffer += data

        while STX in buffer and ETX in buffer:
            ini = buffer.index(STX) + 1
            fim = buffer.index(ETX)

            payload = buffer[ini:fim]
            buffer = buffer[fim + 1:]

            linhas = payload.split(LF)

            for linha in linhas:
                if not linha.strip():
                    continue

                texto = linha.decode("ascii", errors="ignore")
                print("EVENTO POS RECEBIDO:")
                print(texto)


```

**Resposta (modelo – sucesso)**:

```json
Servidor PDV escutando na porta 9000...
Conectado por ('127.0.0.1', 53443)

Mensagem ASCII recebida:
SALE;CAIXA=01;OPER=MARIA;VALOR=39.90;DATA=20251216;HORA=143210
Evento traduzido:
{'EVENTO': 'SALE', 'CAIXA': '01', 'OPER': 'MARIA', 'VALOR': '39.90', 'DATA': '20251216', 'HORA': '143210'}
```

### O que é o **código-fonte do servidor?**

O **código-fonte** do servidor é responsável por **receber** os dados de venda do PDV e **interpretar** o conteúdo **(ASCII/JSON).**

O código-fonte faz toda a lógica de integração entre:

* Defense
* PDV
* NVR/DVR

### Funções do código-fonte do servidor

#### 1. Importação e configurações básicas

```python
import socket

HOST = "127.0.0.1"   # IP DO SEU PC
PORT = 9000             # MESMA porta configurada no DVR
```

Importação da biblioteca **(socket)** que permite criar uma comunicação com a rede e configurações básicas para se conectar.

#### **2. Definição do formato do protocolo POS**

```python
STX = b'\x02'
ETX = b'\x03'
LF  = b'\x0A'
```

Definição do formato do protocolo **POS.** Mostrando: **início da mensagem, fim da mensagem e quebra de linha** respectivamente.

#### **Oque é POS?**

Um método de comunicação que envia os dados das vendas do caixa para o gravador, possibilitando que essas informações apareçam junto com as imagens do vídeo.

Neste contexto, PDV refere-se ao sistema de venda, enquanto POS é o método/protocolo usado para transmitir os dados da venda ao Defense/DVR.

***

#### **3. Inicialização do servidor**

```python
print(f"Servidor POS aguardando em {HOST}:{PORT}...")
```

Mensagem de inicialização do servidor. Mostra que o servidor **POS** está ativo e aguardando conexão

#### 4. Criação do servidor TCP

```python
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
    s.bind((HOST, PORT))
    s.listen(1)
```

Criação do servidor **TCP,** esse bloco **cria um servidor TCP, liga o servidor com a porta e IP definidos** e **coloca o servidor em modo de escuta.**

#### **5. Aceitação da conexão do DVR**

```python
conn, addr = s.accept()
print(f"DVR conectado: {addr}")
```

O código espera o DVR se conectar. Quando conecta, mostra o IP do DVR.

#### 6. P**reparação para recebe**r dados

```python
buffer = b""
#Preparação para receber dados 
```

Buffer de memória, usado para armazenar dados que podem vir quebrados ou em partes.

#### **7. Recebimento contínuo de dados**

```python
while True:
    data = conn.recv(1024)
    #lê até 1024 bytes por vez
```

Recebe dados continuamente do DVR

```python
    if not data:
        break
```

Caso não receba nada, o DVR encerrou a conexão

#### **8. Montagem da mensagem completa**

```python
buffer += data
#Junta os dados novos com os antigos no buffer.
```

```python
while STX in buffer and ETX in buffer:
```

Só processa quando existe início e fim, garantindo que a mensagem POS esteja completa

#### **9. Extração do conteúdo POS**

```python
ini = buffer.index(STX) + 1
fim = buffer.index(ETX)

payload = buffer[ini:fim]
buffer = buffer[fim + 1:]
```

Este bloco, retira o STX e ETX, extrai apenas o texto da venda e limpa o buffer para receber a próxima mensagem.

#### **10. Separação e exibição das linhas**

```python
linhas = payload.split(LF)
# Divide o texto em linhas 
```

```python
for linha in linhas:
    if not linha.strip():
        continue
#ignora as linhas vazias 
```

```python
texto = linha.decode("ascii", errors="ignore")
print("EVENTO POS RECEBIDO:")
print(texto)
```

Converte os bytes para texto e exibe o evento POS no terminal.

**Resumindo:**

* Cria um **servidor POS**
* Recebe textos do DVR via TCP
* Identifica mensagens válidas
* Separa os dados de venda

### Código para teste do servidor

Esse script **simula um caixa (POS)** enviando um evento de venda para um servidor (DVR ou servidor POS) via **TCP**.

```python
import socket

HOST = "127.0.0.1"
PORT = 9000

STX = b'\x02'
ETX = b'\x03'
LF  = b'\x0A'

mensagem = (
    STX +
    b"SALE;CAIXA=01;OPER=MARIA;VALOR=39.90;DATA=20251216;HORA=143210" +
    LF +
    ETX
)

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
    client.connect((HOST, PORT))
    client.sendall(mensagem)
    print("Evento POS enviado")
```

**Resposta (modelo – sucesso)**:

```json
Evento POS enviado
```

***

Notas finais:

* **Autenticação obrigatória** para todas as requisições.
* Utilize sempre os **métodos e formatos definidos** na documentação.
* **Restrinja ações sensíveis** a usuários autorizados e mantenha logs.
* **Evite envios excessivos** e valide os dados antes de transmiti-los.
* Garanta a **consistência das informações**, pois algumas ações não podem ser desfeitas.

***


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://portal-integracao.intelbras.com.br/defense-ia-and-lite/readme/pdv.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
