Integração TCP/UDP
O protocolo TCP/UDP destina-se a dispositivos que utilizam uma linguagem de comandos simples diretamente através de um socket de rede — sem API web, sem modelo de registos: leitores de áudio e matrizes profissionais (AUDAC XMP44 e módulos SourceCon), projetores (PJLink), ecrãs e amplificadores atrás de conversores RS-232 para IP, e placas personalizadas com microcontroladores. Define as tramas de comando que o HyperVisu envia quando um valor se altera, os padrões de correspondência que extraem valores das tramas que o equipamento devolve, e tramas de interrogação opcionais para polling. Todo o conhecimento específico do dispositivo reside na configuração, nenhum no servidor.
Cada ligação corresponde a um dispositivo, por TCP (uma ligação persistente, mantida aberta e reconectada automaticamente) ou UDP (datagramas). Por TCP, todos os objetos do dispositivo partilham esse único socket — exatamente o que os dispositivos que aceitam apenas um cliente (como o XMP44) exigem.
Do que necessita: o endereço IP e a porta do dispositivo, a sua referência de comandos (sintaxe da trama, delimitador, os comandos e o feedback devolvido), e se o dispositivo envia as alterações de estado por iniciativa própria (push) ou se necessita de ser interrogado.
Ligações. O TCP/UDP é multi-ligação: uma ligação por dispositivo (consulte “Ligações”). Campos:
| Campo | Descrição |
|---|---|
| Device address | Endereço IP ou hostname do dispositivo. |
| Port | A porta TCP ou UDP onde o dispositivo escuta (AUDAC XMP44: 5001). |
| Poll Interval (seconds) | Intervalo de releitura do dispositivo. 0 para um dispositivo que envia o seu estado por push. |
| Transport | TCP · persistent connection ou UDP · datagrams. |
| Frame delimiter | O que separa duas tramas — \r\n para quase todos os protocolos de texto. |
| Payload encoding | ASCII text para protocolos de texto, HEX bytes para protocolos binários. |
| Listen port | Apenas UDP. Para um dispositivo que envia para uma porta fixa; deixe vazio para que as respostas regressem pela porta de origem do servidor. |
| Heartbeat frame / Every | Apenas TCP, opcional. Trama enviada numa ligação inativa para evitar que o dispositivo a encerre (pelo menos a cada 5 s); a pré-visualização Frame sent mostra-a com carateres de controlo visíveis. |
| Connect timeout | Tempo limite de espera para o dispositivo aceitar a ligação (ms, padrão 5000). |
| Delay between commands | Muitos dispositivos descartam comandos consecutivos; aumente este valor se algum for ignorado (ms, padrão 50). |
| Read everything on connect | Ativado: o HyperVisu envia todas as interrogações uma vez assim que o dispositivo responde, para que a app mostre o estado real sem esperar pelo primeiro ciclo de polling. |
A janela Add connection solicita o Instance Name, o Device address, a Port, o Poll Interval (seconds), o Transport e o Frame delimiter (valores padrão 30, TCP · persistent connection e \r\n). Os outros campos encontram-se em Framing and timing na ligação guardada: selecione a nova ligação, configure-os e clique em Save connection.
O botão Test na janela Add connection abre um socket para o endereço introduzido. Isto confirma que o dispositivo está acessível, não que compreende as suas tramas. Numa ligação guardada, enquanto o serviço já mantém a ligação única ao dispositivo, o Test reporta o estado em tempo real e a contagem de tramas de entrada e saída em vez de abrir um segundo socket.

Associação de um objeto (consulte “Associação TCP/UDP” abaixo). Por cada objeto define uma Key — um pequeno texto presente em todas as respostas que contêm este valor: apenas as tramas recebidas que contêm a chave são testadas contra o padrão de correspondência do objeto (no caso da AUDAC, o nome do comando de feedback: OG1, FREQ2). A comparação diferencia maiúsculas de minúsculas e a chave não pode conter :. Dois objetos podem partilhar a mesma chave, por exemplo um objeto de comando e o seu respetivo objeto de feedback. O sistema armazena <ligação>:<chave>. O restante é a string de tipo de dados do objeto, gerada a partir dos campos do editor:
| Campo | Armazenado como | Significado |
|---|---|---|
| Payload encoding | ASCII / HEX | Primeiro token da string. Não altera o que é enviado nem a leitura das respostas: a codificação ativa é a da ligação, definida em Framing and timing. |
| Command template | SEND= | Enviado quando o valor se altera (objetos Out e In/Out). ${value} é substituído pelo valor. |
| Different commands for ON and OFF → Command for ON / Command for OFF | SEND1= / SEND0= | Para objetos booleanos cujo dispositivo utiliza dois comandos distintos (SPPLAY1 / SPSTOP1) em vez de um único comando com argumento 0/1. Deixe OFF vazio para botões de impulso (ação única). |
| Query template | POLL= | Enviado em cada ciclo de polling e uma vez ao ligar (objetos In e In/Out). Deixe vazio para dispositivos que enviam dados por push. |
| Match pattern | MATCH= | Aplicado a cada trama recebida que contenha a chave; o conteúdo capturado torna-se o valor. Sem isto, um objeto de entrada nunca recebe qualquer valor. |
| Scale / Offset | SCALE= / OFFSET= | Leitura: valor = bruto × escala + offset; a escrita utiliza a operação inversa. Apenas para capturas numéricas. |
| Acknowledge pattern / Acknowledge timeout (ms) | ACK= / ACKTIMEOUT= | Opcional. Quando definido, a escrita só é considerada bem-sucedida se uma trama corresponder ao padrão dentro do tempo limite (padrão 2000 ms). |
Os Modelos utilizam ${value}, além de ${value:d} para arredondar um valor escalado para um número inteiro (um slider de 0–100 % num dispositivo que requer argumentos inteiros), ${value:02d} para um número inteiro com zeros à esquerda e ${value:1f} para um número fixo de casas decimais; em modo HEX, ${value:u8}, ${value:u16be}, ${value:u16le}, ${value:u32be}, ${value:u32le} para bytes de tamanho fixo. \r, \n, \t e \xNN são sequências de escape de bytes. Em modo ASCII, se um modelo omitir o delimitador, este é adicionado automaticamente.
Os Padrões de correspondência utilizam estes identificadores; todo o restante texto é comparado literalmente:
| Identificador | Captura / ação |
|---|---|
\v | um número |
\h | valor hexadecimal, lido como número |
\a | texto, até ao próximo literal no padrão (para objetos de texto) |
\iTexto\i | ignora e avança para além de "Texto" |
\sN | ignora N carateres |
\d \w \. | um dígito / uma palavra / qualquer caráter |
O editor apresenta a secção Frame sent com carateres de controlo visíveis (# | D001 | hv | SOG1 | 28 | U | <CR><LF>) e a string gravada. Frame sent é uma pré-visualização, não um registo real de tráfego: cada ${value…} é substituído pelo valor de exemplo 28, sem a formatação do valor nem a escala, e para objetos com comandos ON e OFF separados é exibido apenas o comando ON. Não mostra o delimitador adicionado automaticamente pelo servidor em modo ASCII. Confirme sempre os comandos e respostas reais diretamente no dispositivo.

Comportamento a ter em conta
- Direção. Os objetos In realizam correspondência (e polling, se tiverem interrogação definida); os objetos Out enviam; os objetos In/Out fazem ambos — o eco do próprio dispositivo serve de confirmação, tal como nos objetos de estado KNX.
- Uma trama, múltiplos objetos. Cada trama recebida é comparada com todos os objetos In da ligação que contenham a respetiva chave, pelo que uma única trama de estado pode atualizar vários objetos. Modelos de interrogação idênticos são enviados apenas uma vez por ciclo de polling.
- TCP. Em caso de falha, a ligação é restabelecida com intervalos progressivos; após a reconexão, as interrogações são reexecutadas se a opção Read everything on connect estiver ativa. As tramas de saída passam por uma fila de espera espaçada pelo Delay between commands.
- UDP. Cada datagrama corresponde a uma trama. Envios não solicitados por push requerem a definição de Listen port.
- Os comandos enviados enquanto o dispositivo está inacessível falham sem bloquear o sistema; a app apresenta o último estado conhecido.
Exemplo prático — Leitor multimédia AUDAC XMP44
O XMP44 escuta em TCP na porta 5001, aceita apenas um cliente e utiliza tramas no formato # | D001 | <origem> | <comando> | <argumento> | <checksum> | <CR><LF> — a letra U é aceite como checksum literal. A regulação do ganho de saída faz-se com SOG1 | <arg> onde arg = 8 − dB; o equipamento responde com uma trama de atualização … | OG1 | <arg> | …, a qual também emite quando o ganho é alterado no painel frontal. Reproduzir e parar são dois comandos distintos (SPPLAY1, SPSTOP1).
-
Crie uma ligação TCP/UDP (consulte “Ligações”): endereço
192.168.1.60, porta5001, transporte TCP, delimitador\r\n, intervalo de polling30. Clique em Test e, em seguida, em Create connection. Selecione a nova ligação e, em Framing and timing, mantenha a opção Read everything on connect ativa e configure o heartbeat# | D001 | hv | GTPS | 0 | U | \r\na cada120s. Clique em Save connection. -
Em Devices, adicione um widget Audio "XMP44 player" e selecione esta ligação em Protocol.
-
No objeto volume (In/Out): chave
OG1, modelo de comando# | D001 | hv | SOG1 | ${value:d} | U | \r\n, modelo de interrogação# | D001 | hv | GOG1 | 0 | U | \r\n, padrão de correspondência\i | OG1 | \i\v, escala-1, offset8— desta forma, −20 dB é enviado como28e um valor28recebido é lido como −20 dB. -
No objeto play (Out, booleano): chave
PLAY1, Different commands for ON and OFF: ON# | D001 | hv | SPPLAY1 | 0 | U | \r\n, OFF# | D001 | hv | SPSTOP1 | 0 | U | \r\n. -
No objeto track title (In, texto): chave
SON1, interrogação# | D001 | hv | GSON1 | 0 | U | \r\n, correspondência\i | SON1 | \i\a |. -
Clique em Save object em cada um dos objetos, clique depois em Apply changes na barra lateral e confirme. Ao mover a barra de volume é enviado o comando
SOG1, o ecoOG1do equipamento confirma o novo nível e qualquer alteração feita no painel frontal do dispositivo é refletida na app.
💡 Dica: Mantenha a documentação de comandos do equipamento aberta durante a associação — a chave é o nome de feedback (
OG1), que nos equipamentos AUDAC difere do nome do comando de escrita (SOG1).
Associação TCP/UDP
Os objetos TCP/UDP são configurados na janela de definições do objeto (consulte “Definições de Objeto, Registo e Notificações”). Os separadores são:
Endereçamento da trama
| Campo | Descrição |
|---|---|
| Key | Texto presente em todas as respostas que contêm o valor deste objeto — por exemplo OG1. Apenas as tramas recebidas que contêm a chave são testadas contra o padrão de correspondência; a comparação diferencia maiúsculas de minúsculas. Não é permitido o caráter :. A chave não necessita de ser única: dois objetos podem partilhar a mesma chave, como um objeto de comando e o seu respetivo feedback. O endereço guardado é <ligação>:<chave>. |
| Payload encoding | ASCII text para protocolos de texto, HEX bytes para protocolos binários. |
Comandos enviados (objetos de saída)
| Campo | Descrição |
|---|---|
| Command template | Enviado quando o valor se altera. ${value} é substituído pelo valor (${value:d} arredonda para número inteiro); \r \n \xNN são sequências de escape de bytes. |
| Different commands for ON and OFF | Objetos booleanos: apresenta os campos Command for ON e Command for OFF para equipamentos que utilizam dois comandos distintos em vez de um único com argumento 0/1. Deixe OFF vazio para botões de impulso (ação única). |
| Acknowledge pattern / Acknowledge timeout (ms) | Opcional. Quando definido, o comando só é considerado bem-sucedido se uma trama corresponder a este padrão dentro do tempo limite. |
Valores lidos (objetos de entrada)
| Campo | Descrição |
|---|---|
| Query template | Enviado em cada ciclo de polling e uma vez ao ligar. Deixe vazio para dispositivos que transmitem dados por push. |
| Match pattern | Aplicado a cada trama recebida que contenha a chave; o conteúdo capturado torna-se o valor. Identificadores: \v número · \h hexadecimal lido como número · \a texto, até ao próximo literal · \iTexto\i ignora "Texto" · \sN ignora N carateres · \d \w \. dígito / palavra / qualquer caráter. Sem padrão de correspondência, o objeto nunca recebe valor. |
| Scale / Offset | Leitura: valor = bruto × escala + offset; a escrita utiliza a operação inversa. |
Abaixo dos separadores, a secção Frame sent mostra a trama de saída gerada para um valor de exemplo com carateres de controlo visíveis (… | 28 | U | <CR><LF>), e Stored as apresenta a string de configuração que será guardada. A sintaxe dos padrões, modelos e um exemplo prático AUDAC encontram-se na secção TCP/UDP acima.
