Kalium — Integração MQTT
Este documento descreve a API de desenvolvedor do protocolo de integração do gateway BLE Kalium. O conteúdo é de uso interno/restrito e não deve ser publicado no portal público.
Este documento especifica o protocolo e as mensagens trocadas entre o gateway KALIUM e o servidor de controle de acesso quando um broker MQTT atua como intermediário da comunicação. A estrutura de tópicos, o formato das mensagens e o fluxo de informações descritos aqui são tudo o que é necessário para integrar o gateway a um software de controle de acesso.
O gateway KALIUM gerencia até oito (8) antenas SCANDIUM em sua rede MESH local. As mensagens de e para as antenas SCANDIUM são tratadas pela KALIUM de forma totalmente transparente — o KALIUM é o único do par que fala MQTT.
Fontes: o protocolo MQTT descrito neste documento vem do Manual de Integração da KALIUM, v1.05 (dez/2021). Já a tela de configuração MQTT (seção Configuração MQTT no gateway) é derivada do Manual de Hardware da KALIUM, v1.7 (mai/2023, firmware 1.0.9) — ou seja, a tela é mais recente que o protocolo.
Visão geral do protocolo
- Todas as mensagens utilizam formato JSON.
- Espera-se que o broker MQTT tenha suporte ao padrão MQTT V3.1.
- O fluxo de mensagens tem quatro naturezas:
- Mensagens enviadas de forma independente e automática pelo gateway KALIUM ou pelas antenas SCANDIUM (keepalives, atualizações de status).
- Mensagens enviadas pela KALIUM/SCANDIUM sempre que ocorrem eventos específicos (detecção de beacons, alterações de estado da comunicação).
- Mensagens enviadas de forma independente e automática pelo servidor (keepalives).
- Mensagens enviadas pelo servidor sempre que ocorrem eventos específicos (alterações de configuração que devem se refletir na KALIUM ou nas antenas SCANDIUM).
- Algumas mensagens exigem resposta. Por exemplo, uma mensagem de atualização de firmware enviada pelo servidor exige que o gateway KALIUM gere uma mensagem que informe o status do comando.
Configuração MQTT no gateway
O gateway KALIUM possui, no modo de configuração, uma tela MQTT (menu MQTT da tela inicial) onde são informados os parâmetros para estabelecer a conexão com o servidor de comunicação MQTT.

| Campo | Descrição |
|---|---|
| Conexão | Define se o gateway deve conectar-se ao broker MQTT Accelero Cloud, a um broker MQTT customizado ou a nenhum broker MQTT. Quando selecionada a opção "Automático", apenas o campo Facility Id deve ser preenchido. No /config_mqtt.json, o rótulo de UI "Automático" corresponde ao Accelero Cloud (brokerconnectiontype = "1"); broker customizado equivale a "2" e nenhum broker a "0". |
| Facility Id | Identificação única da instalação. Todos os gateways de uma instalação devem ter o mesmo Facility Id. Ex.: empresax, edificioz. |
| TLS | Marque esta opção caso o gateway deva estabelecer a comunicação com o broker MQTT no modo seguro (Transport Layer Security). É necessário que o servidor permita este modo de comunicação. |
| Broker | Endereço URL do servidor de comunicação utilizado na instalação. |
| Port | Número da porta de comunicação para comunicação com o broker MQTT. |
| User name | Nome do usuário para acesso ao broker MQTT. |
| Password | Senha de acesso ao broker MQTT. |
| Device Id | Identificação única e exclusiva de cada gateway na instalação. Ex.: zona A, area 51. |
Faça as alterações necessárias e clique em Salvar para confirmar.
Quando a conexão é feita através do Accelero Cloud, apenas o parâmetro Facility Id deve ser configurado, exatamente como definido no sistema de controle que administrará os gateways.
Conceitos básicos
Facility ID
Toda instalação deve possuir um Facility ID, identificador único da instalação. Por exemplo, em um condomínio fictício o Facility ID poderia ser cond5991.
O Facility ID deve ser configurado nos gateways e no servidor de acesso com o mesmo valor, e faz parte do nome do tópico na comunicação com o broker MQTT. Para garantir a maior compatibilidade possível, recomenda-se o formato:
- Máximo de 16 caracteres.
- Caracteres utilizados — regexp
[a-zA-Z0-9].
Estrutura de tópicos MQTT
A comunicação segue regras básicas na estrutura de tópicos para garantir que as mensagens sejam capturadas de forma eficiente.
O Facility ID sempre é o primeiro nível na estrutura. Por exemplo, um client que faça subscribe no tópico abaixo receberá todas as mensagens enviadas, tanto pelo servidor quanto pelos gateways:
cond5991/#
Todos os gateways fazem subscribe automático no tópico broadcast abaixo, usado pelo servidor para enviar mensagens de controle, como keepalives:
cond5991/broadcast/to
Com exceção desse tópico broadcast, o restante das mensagens sempre tem como origem ou destino um gateway KALIUM ou uma antena SCANDIUM específicos. Cada gateway ou antena possui um alias/apelido que faz parte do tópico, sempre sob o nível synapsis:
cond5991/synapsis/gateway88/to (servidor → gateway específico)
cond5991/synapsis/antena72/to (servidor → antena específica)
cond5991/synapsis/gateway88/from (gateway ou antena → servidor)
A tabela a seguir resume a forma mais simples de realizar uma integração (facility = Facility ID; alias = apelido do gateway/antena):
| Tópico | Origem | Destino |
|---|---|---|
facility/broadcast/to | Servidor | Todos os gateways |
facility/synapsis/alias/to | Servidor | Gateway ou antena específico |
facility/synapsis/alias/from/# | Gateway ou antena específico | Servidor |
facility/synapsis/+/from/# | Todos os gateways | Servidor |
Identificação das mensagens
Todas as mensagens são formatadas em JSON. A maior parte possui a chave msgid, número identificador da mensagem.
- O valor de
msgiddeve estar entre 0 e 60000. - Nas mensagens que exigem resposta (ex.: uma atualização de firmware enviada pelo servidor), a resposta sempre deve referenciar o
msgidoriginal. Caso seja gerada uma resposta commsgiddiferente do da solicitação original, a mensagem será ignorada pelo servidor.
Valores JSON
É importante respeitar o tipo de dado (string/int) na formatação JSON. Mensagens que não respeitem o tipo esperado são ignoradas e não tratadas pelo gateway.
Dada a especificação "msgID": integer(5) e "timestamp": string(12):
{
"msgID": 123,
"timestamp": "190101121314"
}
São inválidas mensagens com "msgID": "123" (string no lugar de int) ou "timestamp": 190101121314 (numérico no lugar de string).
Alguns valores possuem tamanho máximo, indicado entre parênteses (ex.: string(12)). Esse limite deve ser respeitado — "msgID": 123456 é inválido para um campo integer(5).
Há campos obrigatórios e opcionais. Caso falte um valor obrigatório, a mensagem é ignorada. No caso de valores opcionais, a ausência implica o uso de um valor default pré-determinado.
Mensagens enviadas pelo servidor
Salvo indicação contrária, o tópico de envio dessas mensagens é ${facilityid}/synapsis/${alias}/to (e o broadcast para keepalive), e o tópico de resposta (quando há) é ${facilityid}/synapsis/${alias}/from/ack.
Keepalive
O servidor deve publicar periodicamente um keepalive para que os gateways determinem se podem enviar ao servidor as informações coletadas ou se devem entrar em modo de contingência. Caso o gateway não receba keepalive por mais de 2 minutos, entra automaticamente em contingência e só sai ao receber um keepalive com timestamp válido. Em contingência, o gateway deixa de enviar mensagens ao servidor. Sugere-se publicar com a flag retain_message ativa.
Tópico: ${facilityid}/broadcast/to
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "keepalive" | Valor fixo |
timestamp | string(12) | Data/hora formato YYMMDDHHMMSS |
tz | int(3) | Timezone |
{
"cmd": "keepalive",
"timestamp": "191231123456",
"tz": -3
}
Resposta: não há.
Solicitar envio de status (get_info)
Solicita ao gateway que envie uma atualização de status, com informações como versão atual etc.
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "get_info" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone |
{
"cmd": "get_info",
"timestamp": "191231123456",
"tz": -3
}
Resposta: não há resposta direta. O gateway enviará imediatamente uma mensagem de atualização de status (ver Info).
Buscar versão (get_version)
Obtém a versão do gateway com resposta específica. Útil para testes de comunicação.
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "get_version" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone |
msgid | int(5) | 0 a 60000 |
{
"cmd": "get_version",
"timestamp": "191231123456",
"tz": -3,
"msgid": 5399
}
Resposta — tópico ${facilityid}/synapsis/${alias}/from/ack:
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "version" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
msgid | int(5) | ID da mensagem original |
version | string | Versão de firmware em uso |
{
"cmd": "version",
"timestamp": "191231123456",
"tz": -3,
"msgid": 5399,
"version": "1.0.2"
}
Upgrade de firmware (upgrade)
Instrui o gateway a realizar upgrade de firmware. A mensagem deve conter um endereço HTTP de onde obter o firmware; o gateway faz um GET no endereço, baixa, valida e inicia automaticamente a atualização.
Esta mensagem só pode ser enviada para gateways KALIUM. Não está prevista a atualização de firmware das antenas SCANDIUM via mensagens MQTT.
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "upgrade" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone |
msgid | int(5) | 0 a 60000 |
protocol | string(5) | "http" |
host | string | Endereço base do host |
port | int | Porta de conexão (geralmente 80 ou 443) |
path | string | URI do arquivo |
{
"cmd": "upgrade",
"timestamp": "191231123456",
"tz": -3,
"msgid": 9483,
"protocol": "http",
"host": "www.iongrade.com.br",
"port": 80,
"path": "/firmware/kalium_firmware_v1_3.bin"
}
Resposta (gerada no início e após o upgrade) — tópico ${facilityid}/synapsis/${alias}/from/ack:
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "upgrade_result" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
msgid | int(5) | ID da mensagem original |
status | string | "processing", "success" ou "error" |
{
"cmd": "upgrade_result",
"timestamp": "191231123456",
"tz": -3,
"msgid": 9483,
"status": "done"
}
A tabela da resposta lista status como "processing", "success" ou "error", mas o exemplo do manual usa "done". Conferir o valor exato com o firmware antes de tratar a mensagem.
Arquivos de configuração
A leitura e o ajuste de parâmetros usam um par de comandos genéricos: getconfig / getconfig_ack (leitura) e setconfig / setconfig_ack (ajuste). O campo file identifica o arquivo de configuração; o objeto data contém os parâmetros, que variam por arquivo.
Ler arquivos de configuração (getconfig)
Lê os parâmetros de configuração da KALIUM. A mensagem contém o nome do arquivo; a resposta contém os dados.
Mensagem — tópico ${facilityid}/synapsis/${alias}/to:
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "getconfig" | Valor fixo |
msgid | int(5) | 0 a 60000 |
file | string(32) | Nome do arquivo a ler |
{
"cmd": "getconfig",
"msgid": 16041,
"file": "/config_ethernet.json"
}
Resposta — tópico ${facilityid}/synapsis/${alias}/from/ack. O cabeçalho (cmd: "getconfig_ack", timestamp, tz, msgid, file) é comum; o objeto data traz os campos específicos do arquivo lido (ver tabelas a seguir).
Ajustar arquivos de configuração (setconfig)
Envia parâmetros de configuração da KALIUM. A mensagem tem um cabeçalho com o nome do arquivo e o objeto data com os campos a alterar. Os dados são armazenados em memória não-volátil. Algumas mudanças têm efeito imediato; outras exigem reboot da KALIUM.
Nas mensagens setconfig os parâmetros não são obrigatórios — podem ser enviados apenas os que se deseja alterar; os demais são mantidos intactos.
Mensagem — tópico ${facilityid}/synapsis/${alias}/to:
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "setconfig" | Valor fixo |
msgid | int(5) | 0 a 60000 |
file | string(32) | Nome do arquivo a ajustar |
data | object | Parâmetros do comando (depende do arquivo) |
{
"cmd": "setconfig",
"msgid": 16041,
"file": "/config_time.json",
"data": {
"ntpon": 1,
"ntphost": "ntp.iongrade.com.br",
"ntpzone": "-3",
"ntpdaylightsaving": 0
}
}
Resposta (comum a todos os setconfig) — tópico ${facilityid}/synapsis/${alias}/from/ack:
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "setconfig_ack" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone |
msgid | int(5) | ID da mensagem original |
status | string | "done" ou "error" |
{
"cmd": "setconfig_ack",
"timestamp": "191231123456",
"tz": -3,
"msgid": 8431,
"status": "done"
}
Campos do objeto data por arquivo
As tabelas abaixo listam os campos do objeto data de cada arquivo de configuração. Os mesmos campos valem para a leitura (getconfig_ack) e para o ajuste (setconfig).
/config_ethernet.json — ETHERNET
Parâmetros da conexão de rede Ethernet RJ45. Exige reboot para ter efeito.
| Chave | Valor/tipo | Observações |
|---|---|---|
fixip | int(1) | 0 = IP fixo; 1 = Usar DHCP |
ip | string(15) | Endereço IP a utilizar |
dns | string(15) | Endereço IP do servidor DNS |
gateway | string(15) | Endereço IP do gateway |
subnet | string(15) | Máscara da rede |
{
"fixip": 1,
"ip": "192.168.17.253",
"dns": "192.168.17.1",
"gateway": "192.168.17.1",
"subnet": "255.255.255.0"
}
/config_mqtt.json — MQTT
Parâmetros da conexão com o broker MQTT. Exige reboot para ter efeito.
| Chave | Valor/tipo | Observações |
|---|---|---|
brokerconnectiontype | string(1) | "0" = Sem conexão com broker; "1" = Accelero Cloud; "2" = Custom broker |
brokermqtt | string(64) | URL do broker |
brokerport | string(5) | Porta do broker |
brokerusername | string(16) | Usuário do broker |
brokerpass | string(16) | Senha do usuário |
brokerusetls | int(1) | 0 = Conexão normal; 1 = Usar TLS |
brokerfacilityid | string(32) | Facility Id |
brokerboardid | string(32) | Identificação do gateway |
{
"brokerconnectiontype": "1",
"brokermqtt": "meumosquitto.com.br",
"brokerport": "1883",
"brokerusername": "kalium1",
"brokerpass": "senhasecreta",
"brokerusetls": 0,
"brokerfacilityid": "TESTE",
"brokerboardid": "kalium762E9F64"
}
No manual, o campo brokerboardid está rotulado como "Aurum Id" (resíduo do manual da controladora Aurum, do qual o protocolo deriva). Na KALIUM ele identifica o gateway (Device Id).
/config_time.json — TIME
Parâmetros da conexão com o servidor NTP. Exige reboot para ter efeito.
| Chave | Valor/tipo | Observações |
|---|---|---|
ntpon | int(1) | 0 = Não usa servidor NTP; 1 = Usa servidor NTP |
ntphost | string(64) | URL do servidor NTP |
ntpzone | int(3) | Timezone |
ntpregion | string(16) | Região |
ntpdaylightsaving | int(1) | 0 = Não ajusta horário de verão; 1 = Ajusta horário de verão |
{
"ntpon": 1,
"ntphost": "ntp.iongrade.com.br",
"ntpzone": "-3",
"ntpregion": "20",
"ntpdaylightsaving": 0
}
/config_uidfilter.json — UIDFILTER
Filtros de beacons. O array uids pode conter no máximo 8 filtros.
| Chave | Valor/tipo | Observações |
|---|---|---|
uids | array [n] | Array de filtros (máximo 8) |
uids[].uid | string(32) | UID de beacons a serem aceitos |
uids[].alarm | int(1) | 0 = UID normal; 1 = UID de beacons de alarme |
{
"uids": [
{ "uid": "31323334353637383930", "alarm": 0 },
{ "uid": "31323334353637383931", "alarm": 1 },
{ "uid": "696f6e6772616465746865626573742e", "alarm": 0 },
{ "uid": "696f6e6772616465746865626573742f", "alarm": 1 },
{ "uid": "0200dc9ee411e726c0df2af009094630", "alarm": 1 }
]
}
/config_scandiumNN.json — SCANDIUM n
Para cada antena subordinada ao gateway há um arquivo de configuração. O nome é formado pelo prefixo config_scandium seguido do número de identificação da antena, de 01 a 08, mais .json. O arquivo da antena 3, por exemplo, é config_scandium03.json.
| Chave | Valor/tipo | Observações |
|---|---|---|
station | string(16) | Identificação (Factory ID) da SCANDIUM |
active | int(1) | 0 = Inativa; 1 = Ativa |
reporttime | string(3) | Ciclo de tempo, em segundos, para reportar beacons |
distancemax | string(3) | Sensibilidade em metros. Despreza beacons além desta distância |
maxage | string(3) | Tempo, em segundos, de retenção de beacons detectados. São "esquecidos" se não forem detectados novamente após este tempo |
{
"station": "scandiumE57EF0A3",
"active": 1,
"reporttime": "5",
"distancemax": "25",
"maxage": "10"
}
Mensagens enviadas pela KALIUM/SCANDIUM
Keepalive
A KALIUM e as antenas SCANDIUM enviam periodicamente um keepalive para que o servidor monitore seu status. A mensagem é publicada com a flag retain_message ativa.
Tópico: ${facilityid}/synapsis/${alias}/from/keepalive
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "keepalive" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
uptime | int(9) | Tempo, em segundos, de funcionamento desde o BOOT |
nrestart | int(9) | Quantidade de BOOTs desde a fabricação |
ncmqtt | int(6) | Quantidade de (re)conexões com o broker desde o BOOT |
ping_rearm | int(6) | Quantidade de falhas de ping do gateway |
{
"cmd": "keepalive",
"timestamp": "211020075934",
"tz": -3,
"uptime": 4519,
"nrestart": 8,
"ncmqtt": 2,
"ping_rearm": 0
}
Resposta: não há.
Status
A KALIUM e as antenas SCANDIUM enviam periodicamente uma mensagem com o status atual da comunicação. A mensagem é publicada com a flag retain_message ativa.
No caso da KALIUM, o status "disconnected" é enviado pelo broker via LWT (Last Will Testament) — ou seja, é publicado caso o broker detecte a falha de comunicação com a KALIUM. Para as SCANDIUM, as mensagens de status são enviadas pela KALIUM.
Tópico: ${facilityid}/synapsis/${alias}/from/status
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "status" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
status | string | "connected" ou "disconnected" |
{
"cmd": "status",
"timestamp": "211020071203",
"tz": -3,
"status": "connected"
}
{
"cmd": "status",
"status": "disconnected"
}
Resposta: não há.
A estrutura da mensagem de status é apresentada no manual com a chave msg em vez de cmd, mas os exemplos usam cmd. Adotamos cmd (provável erro de digitação na fonte); confirmar com o firmware antes de tratar a mensagem.
Info
A KALIUM e as antenas SCANDIUM enviam periodicamente mensagens de informação para que o servidor as monitore. A mensagem é publicada com a flag retain_message ativa.
Tópico: ${facilityid}/synapsis/${alias}/from/info
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "info" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
boardid | string | Identificador único do controlador |
version | string | Versão de firmware em uso |
pic | string | Versão de firmware do controlador auxiliar |
media | string | Mídia de comunicação. "wired" ou "wireless" |
iplocal | string | Configuração IP — endereço local |
ipdns | string | Configuração IP — servidor DNS |
ipgateway | string | Configuração IP — gateway |
subnetmask | string | Configuração IP — máscara de rede |
Exemplo de mensagem da KALIUM:
{
"cmd": "info",
"timestamp": "191231123456",
"tz": -3,
"boardid": "kaliumC71F9C98",
"version": "1.0.3",
"pic": "1.4",
"media": "wired",
"iplocal": "192.168.17.77",
"ipdns": "192.168.17.1",
"ipgateway": "192.168.17.1",
"subnetmask": "255.255.0.0"
}
Exemplo de mensagem da SCANDIUM (apenas boardid e version):
{
"cmd": "info",
"timestamp": "191231123456",
"tz": -3,
"boardid": "scandium987AF98C",
"version": "1.0.2"
}
Resposta: não há.
Beacon
As antenas SCANDIUM enviam mensagens com informações dos beacons detectados. A frequência de envio é configurada por antena (campo reporttime em SCANDIUM n).
Tópico: ${facilityid}/synapsis/${alias}/from/beacon
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "beacon" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
beacons | array [n] | Array de beacons |
beacons[].type | int(1) | Tipo de beacon (ver tabela de tipos) |
beacons[].uid | string(32) | UID do beacon |
beacons[].nid | string(10) | Identificador do beacon |
beacons[].rssi | int(5) | Potência do sinal recebido (dB) |
beacons[].tx | int(5) | Potência do sinal transmitido (dB) |
beacons[].dist | float(5) | Distância do beacon detectado (m) |
beacons[].bat | int(3) | Estado da bateria (%) |
beacons[].sts | "alarm" | Opcional. Beacon de alarme |
{
"cmd": "beacon",
"timestamp": "201213081655",
"tz": -3,
"beacons": [
{
"type": 3,
"uid": "696f6e6772616465746865626573742f",
"nid": "0000000021",
"rssi": "-74",
"tx": "-59",
"dist": "6.3",
"bat": "0",
"sts": "alarm"
},
{
"type": 3,
"uid": "696f6e6772616465746865626573742e",
"nid": "0000000003",
"rssi": "-87",
"tx": "-59",
"dist": "50.1",
"bat": "100"
}
]
}
Resposta: não há.
A tabela da fonte lista o campo de status do beacon como status, mas o exemplo usa a chave sts. Adotamos sts (conforme o exemplo); confirmar com o firmware.
Alarm
As antenas SCANDIUM enviam mensagens informando se foram detectados beacons de alarme.
Tópico: ${facilityid}/synapsis/${alias}/from/beacon
| Chave | Valor/tipo | Observações |
|---|---|---|
cmd | "alarm" | Valor fixo |
timestamp | string(12) | YYMMDDHHMMSS |
tz | int(3) | Timezone configurada no gateway |
status | int(1) | 0 = Sem alarme; 1 = Beacon de alarme detectado |
{
"cmd": "alarm",
"timestamp": "201213081655",
"tz": -3,
"status": 0
}
{
"cmd": "alarm",
"timestamp": "201213081735",
"tz": -3,
"status": 1
}
Resposta: não há.
Tabela — Tipos de Beacon
Valores possíveis do campo type no array beacons das mensagens Beacon:
| Código | Descrição |
|---|---|
1 | Eddystone UID |
2 | Eddystone TLM |
3 | iBeacon |