Skip to main content

Kalium — Integração MQTT

Documento de uso interno/restrito

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.

tela mqtt

CampoDescrição
ConexãoDefine 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 IdIdentificação única da instalação. Todos os gateways de uma instalação devem ter o mesmo Facility Id. Ex.: empresax, edificioz.
TLSMarque 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.
BrokerEndereço URL do servidor de comunicação utilizado na instalação.
PortNúmero da porta de comunicação para comunicação com o broker MQTT.
User nameNome do usuário para acesso ao broker MQTT.
PasswordSenha de acesso ao broker MQTT.
Device IdIdentificaçã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.

Conexão via Accelero Cloud

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ópicoOrigemDestino
facility/broadcast/toServidorTodos os gateways
facility/synapsis/alias/toServidorGateway ou antena específico
facility/synapsis/alias/from/#Gateway ou antena específicoServidor
facility/synapsis/+/from/#Todos os gatewaysServidor

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 msgid deve 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 msgid original. Caso seja gerada uma resposta com msgid diferente 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

ChaveValor/tipoObservações
cmd"keepalive"Valor fixo
timestampstring(12)Data/hora formato YYMMDDHHMMSS
tzint(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.

ChaveValor/tipoObservações
cmd"get_info"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(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.

ChaveValor/tipoObservações
cmd"get_version"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone
msgidint(5)0 a 60000
{
"cmd": "get_version",
"timestamp": "191231123456",
"tz": -3,
"msgid": 5399
}

Resposta — tópico ${facilityid}/synapsis/${alias}/from/ack:

ChaveValor/tipoObservações
cmd"version"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
msgidint(5)ID da mensagem original
versionstringVersã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.

Apenas KALIUM

Esta mensagem só pode ser enviada para gateways KALIUM. Não está prevista a atualização de firmware das antenas SCANDIUM via mensagens MQTT.

ChaveValor/tipoObservações
cmd"upgrade"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone
msgidint(5)0 a 60000
protocolstring(5)"http"
hoststringEndereço base do host
portintPorta de conexão (geralmente 80 ou 443)
pathstringURI 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:

ChaveValor/tipoObservações
cmd"upgrade_result"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
msgidint(5)ID da mensagem original
statusstring"processing", "success" ou "error"
{
"cmd": "upgrade_result",
"timestamp": "191231123456",
"tz": -3,
"msgid": 9483,
"status": "done"
}
note

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:

ChaveValor/tipoObservações
cmd"getconfig"Valor fixo
msgidint(5)0 a 60000
filestring(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.

info

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:

ChaveValor/tipoObservações
cmd"setconfig"Valor fixo
msgidint(5)0 a 60000
filestring(32)Nome do arquivo a ajustar
dataobjectParâ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:

ChaveValor/tipoObservações
cmd"setconfig_ack"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone
msgidint(5)ID da mensagem original
statusstring"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.

ChaveValor/tipoObservações
fixipint(1)0 = IP fixo; 1 = Usar DHCP
ipstring(15)Endereço IP a utilizar
dnsstring(15)Endereço IP do servidor DNS
gatewaystring(15)Endereço IP do gateway
subnetstring(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.

ChaveValor/tipoObservações
brokerconnectiontypestring(1)"0" = Sem conexão com broker; "1" = Accelero Cloud; "2" = Custom broker
brokermqttstring(64)URL do broker
brokerportstring(5)Porta do broker
brokerusernamestring(16)Usuário do broker
brokerpassstring(16)Senha do usuário
brokerusetlsint(1)0 = Conexão normal; 1 = Usar TLS
brokerfacilityidstring(32)Facility Id
brokerboardidstring(32)Identificação do gateway
{
"brokerconnectiontype": "1",
"brokermqtt": "meumosquitto.com.br",
"brokerport": "1883",
"brokerusername": "kalium1",
"brokerpass": "senhasecreta",
"brokerusetls": 0,
"brokerfacilityid": "TESTE",
"brokerboardid": "kalium762E9F64"
}
note

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.

ChaveValor/tipoObservações
ntponint(1)0 = Não usa servidor NTP; 1 = Usa servidor NTP
ntphoststring(64)URL do servidor NTP
ntpzoneint(3)Timezone
ntpregionstring(16)Região
ntpdaylightsavingint(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.

ChaveValor/tipoObservações
uidsarray [n]Array de filtros (máximo 8)
uids[].uidstring(32)UID de beacons a serem aceitos
uids[].alarmint(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.

ChaveValor/tipoObservações
stationstring(16)Identificação (Factory ID) da SCANDIUM
activeint(1)0 = Inativa; 1 = Ativa
reporttimestring(3)Ciclo de tempo, em segundos, para reportar beacons
distancemaxstring(3)Sensibilidade em metros. Despreza beacons além desta distância
maxagestring(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

ChaveValor/tipoObservações
cmd"keepalive"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
uptimeint(9)Tempo, em segundos, de funcionamento desde o BOOT
nrestartint(9)Quantidade de BOOTs desde a fabricação
ncmqttint(6)Quantidade de (re)conexões com o broker desde o BOOT
ping_rearmint(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

ChaveValor/tipoObservações
cmd"status"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
statusstring"connected" ou "disconnected"
{
"cmd": "status",
"timestamp": "211020071203",
"tz": -3,
"status": "connected"
}
{
"cmd": "status",
"status": "disconnected"
}

Resposta: não há.

note

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

ChaveValor/tipoObservações
cmd"info"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
boardidstringIdentificador único do controlador
versionstringVersão de firmware em uso
picstringVersão de firmware do controlador auxiliar
mediastringMídia de comunicação. "wired" ou "wireless"
iplocalstringConfiguração IP — endereço local
ipdnsstringConfiguração IP — servidor DNS
ipgatewaystringConfiguração IP — gateway
subnetmaskstringConfiguraçã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

ChaveValor/tipoObservações
cmd"beacon"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
beaconsarray [n]Array de beacons
beacons[].typeint(1)Tipo de beacon (ver tabela de tipos)
beacons[].uidstring(32)UID do beacon
beacons[].nidstring(10)Identificador do beacon
beacons[].rssiint(5)Potência do sinal recebido (dB)
beacons[].txint(5)Potência do sinal transmitido (dB)
beacons[].distfloat(5)Distância do beacon detectado (m)
beacons[].batint(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á.

note

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

ChaveValor/tipoObservações
cmd"alarm"Valor fixo
timestampstring(12)YYMMDDHHMMSS
tzint(3)Timezone configurada no gateway
statusint(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ódigoDescrição
1Eddystone UID
2Eddystone TLM
3iBeacon