> 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/linha-de-faciais/registro-automatico-de-cgi/funcionamento.md).

# Funcionamento

### Registro automático de CGI

**Dispositivos que suportam esta função:**

| Dispositivos    | Firmware             |
| --------------- | -------------------- |
| SS 3531 MF Lite | 20251201 ou superior |
| SS 3541 MF Lite | 20251201 ou superior |
| SS 3532 MF      | 20251201 ou superior |
| SS 3532 MF      | 20251201 ou superior |
| SS 3532 MF W    | 20251201 ou superior |
| SS 3542 MF W    | 20251201 ou superior |
| SS 5531 MF W    | 20251201 ou superior |
| SS 5531 MF EX   | 20251201 ou superior |
| SS 5541 MF W    | 20251201 ou superior |
| SS 5532 MF W    | 20251201 ou superior |
| SS 5542 MF W    | 20251201 ou superior |

O Registro automático de CGI é uma forma de conexão ao dispositivo Intelbras de controle de acesso corporativo, sem a necessidade de redirecionamento de portas e autenticação a cada requisição, baseado em uma comunicação via socket. Uma vez estabelecida a conexão, as portas de origem e destino permanecerão as mesmas e possibilitará o fluxo de comunicação entre dispositivo e aplicação.

{% hint style="warning" %}
Importante: Essa comunicação não irá suportar o fluxo de vídeo e sim, a troca de mensagens entre equipamento e servidor.
{% endhint %}

### Fluxo de funcionamento

Para o correto funcionamento da comunicação entre o dispositivo de controle de acesso e o servidor de conexão, é necessário seguir três passos:

* `/cgi-bin/api/autoRegist/connect:` Dispositivo irá encaminhar uma requisição para o endereço do servidor e porta configurados, com as informações de ID, modelo e endereço do servidor;
* `/cgi-bin/api/global/login:` O servidor deverá encaminhar uma requisição de login para o dispositivo, que responderá com o token para a sessão;
* `/cgi-bin/api/global/keep-alive:` O servidor deverá encaminhar um keep-alive para o dispositivo, após receber o token. Esse keep-alive deve ser encaminhado a cada 20 segundos. Caso o dispositivo não receba três eventos seguidos, irá considerar que a conexão foi perdida e será reiniciada a sessão, com a criação de uma nova.

Abaixo, segue um infográfico demonstrando o fluxo:

<figure><img src="https://1174315854-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F0fFSkomZ6y6jtuI5J4qq%2Fuploads%2FUaen0xpljK7A1zqAivmm%2FFluxograma.png?alt=media&amp;token=125deaca-125f-4712-b812-edbabd43ff3c" alt=""><figcaption></figcaption></figure>

Após estabelecida a conexão, deve ser usada a porta de origem do dispositivo Intelbras para encaminhar os comandos de API.&#x20;

### Interfaces de comunicação

Para o correto funcionamento das interfaces de comunicação, é necessário encaminhar a mensagem e as informações de cabeçalho, conforme as informações abaixo:

#### Interface de conexão

Após iniciar o serviço do lado do dispositivo, irá encaminhar ao servidor um `POST` de conexão, conforme a `URL` abaixo, contendo no corpo uma mensagem em formato `JSON` com as informações de `DevClass`, `DeviceID` e `ServerIP.`

`DevClass:` Modelo do dispositivo;

`DeviceID:` Valor inserido no campo ID da configuração do serviço no produto. Pode ser um número de série ou identificação que melhor couber na aplicação e gestão;

`ServerIP:` Endereço IP do servidor configurado no dispositivo;

`URL:`/cgi-bin/api/autoRegist/connect;

`Método:` POST;

**Exemplo:**

```json
POST /cgi-bin/api/autoRegist/connect HTTP/1.1
Host: 192.168.1.254:60005
Connection: keep-alive
Referer: http//192.168.1.254/
Accept-Encoding: gzip,deflate,sdch
Content-length: 89
Accept-Language: pt-br,en,zh;q=0.8

{
   "DevClass" : "SS 5532 MF W",
   "DeviceID" : "12",
   "ServerIP" : "192.168.1.254"
}

```

**Resposta:**

```json
HTTP/1.1 200 OK
Connection: keep-alive
Content-Length: 0
```

#### Interface de login

Será enviado um POST vazio do servidor ao dispositivo, que responderá com evento de “401 Unauthorized” e deve ser encaminhado um novo POST com o mesmo endpoint, repassando o usuário e senha cadastrados no dispositivo, via método digest. Confirmado o login no dispositivo, será respondido o POST com 200 OK e um token da sessão para uso junto ao keep-alive.

`URL:`/cgi-bin/api/global/login.

`Método:` POST

**Exemplo:**

**Requisição 1**

```json
http://192.168.1.201/cgi-bin/api/global/login
POST /cgi-bin/api/global/login HTTP/1.1
Host: 192.168.1.201
Connection: keep-alive
CONTENT-LENGTH: 0
```

**Resposta 1**

```json

HTTP/1.1 401 Unauthorized
WWW-Authenticate: Digest realm="Login to 2c1ee6baab91b6e9133efb10e7941a10", qop="auth", nonce="451192579",
opaque="91a48231f08076ff1869aa3d666666b9d9dc7ef3", algorithm=MD5
Connection: close
CONTENT-LENGTH: 0

```

**Requisição 2**

```json
POST /cgi-bin/api/global/login HTTP/1.1
Authorization: Digest username="admin", realm="Login to 2c1ee6baab91b6e9133efb10e7941a10", nonce="451192579",
uri="/cgi-bin/api/global/login", response="045a512981641d2cd0fa1edb76f3d7e7",
opaque="91a48231f08076ff1869aa3d666666b9d9dc7ef3", qop=auth, nc=00000001, cnonce="004fd20e9f803827de4c39fa3a9fb115"
Host: 192.168.1.201
Content-Length: 0
Accept-Encoding: gzip, deflate

```

**Resposta 2**

```json

HTTP/1.1 401 Unauthorized
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: <length>
Connection: keep-alive
{
    "Token": "tGzv3JOkF0XG5Qx2TlKWIA",
}


```

#### Interface de keep-alive

Após a confirmação do login e recebimento do token, deve ser mantido o envio do keep-alive pelo servidor para o dispositivo, a cada 20 segundos. Caso o dispositivo não receba o keep-alive durante três tentativas ou 60 segundos, irá considerar que houve desconexão e é necessário reiniciar o ciclo. O keep-alive deve conter o token recebido no login junto ao cabeçalho para o envio ao dispositivo.

O keep-alive deve conter o token recebido no login junto ao cabeçalho para o envio ao dispositivo.

`URL:` /cgi-bin/api/global/keep-alive

`Método:` POST

**Exemplo:**

**Requisição:**

```json

http://192.168.1.201/cgi-bin/api/global/keep-alive
POST /cgi-bin/api/global/keep-alive HTTP/1.1
Host: 192.168.1.254
X-cgi-token: tGzv3JOkF0XG5Qx2TlKWIA
Connection: keep-alive
CONTENT-LENGTH: 0

```

**Resposta:**

```json
HTTP/1.1 200 OK
Connection: keep-alive
CONTENT-LENGTH: 0
```

### Servidor de Exemplo

Abaixo, segue o servidor de registro de exemplo para auxílio à integração:

<https://github.com/integracaoca/exemplos_controle_de_acesso/tree/main/Servidor%20Auto%20CGI%20-%20Python>

#### Servidor de exemplo

Para auxiliar nos testes, segue servidor de exemplo em código aberto, para validação da operação.

{% embed url="<https://github.com/integracaoca/exemplos_controle_de_acesso/tree/main/Servidor%20Auto%20CGI%20-%20Python>" %}


---

# 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/linha-de-faciais/registro-automatico-de-cgi/funcionamento.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.
