Layer 1 DETImótica logo DETImótica

Equipamento agregador que está conectado à rede do MakerLab e recebe todas as mensagens MQTT enviadas pelos módulos de sensorização.

Dispõe também de uma ligação à rede da Universidade de Aveiro através da VPN da mesma, por onde os dados recebidos são encaminhados para o broker da instância Eclipse Hono alojada no Instituto de Telecomunicações.

Assim, de um ponto de vista de alto-nível, o equipamento efetua as funções de uma bridge MQTT.

Durante o desenvolvimento do projeto foi utilizado um Raspberry Pi (2B ou 4B) para esse efeito.

Broker MQTT

O broker local para o qual toda a telemetria é enviada pelos microcontroladores pode estar alojado em qualquer servidor acessível dentro da rede do MakerLab.

Durante o desenvolvimento do projeto o local escolhido foi a própria gateway, sendo que o software selecionado foi o Mosquitto (imagem Docker: eclipse-mosquitto)

As configurações utilizadas podem ser encontradas no repositório respetivo.

Receção, desencriptação, e encaminhamento de mensagens

A lógica de receção, desencriptação, e encaminhamento de mensagens é assegurada por um programa multi-threaded em Python (gateway.py).

A thread principal conecta-se ao broker MQTT local e subscreve o tópico ‘telemetry’ e todos os seus subtópicos (i.e. ‘telemetry/#’).

As mensagens dos microcontroladores com valores de um determinada métrica deverão ser enviadas para o tópico: ‘telemetry/<ID do sensor/métrica>’ e, conforme o exposto na secção anterior, ter sido encriptadas com a sua chave única AES-128 e posteriormente codificadas em base64.

Exemplo:

telemetry/7d245a97-66c7-49eb-9940-dbb9cb24f5ec HLhUwpmNgorg7W6lf4WZhcSXMThCJ8wHcv+wavM=

Para o processamento das mensagens é utilizado um modelo producer/consumer com múltiplas threads.

No momento de receção, a mensagem é mantida numa fila até uma das worker threads se encontrar disponível para a desencriptar, verificar a sua integridade, e proceder ao seu encaminhamento para o broker da instância Eclipse Hono.

A mensagem, uma vez desencriptada, deverá ter o seguinte formato (no caso do LoPy é assegurado automaticamente):

{'value': <valor observado pelo sensor>}    // Exemplo: {'value': 1018.56}

Existe ainda uma thread adicional para manter o estado da conexão com o broker remoto. Durante o desenvolvimento do projeto foi utilizado um máximo de 20 worker threads concorrentes.

Configuração

De forma a assegurar um elevado nível de parametrização, o ficheiro gateway_config.json (exemplificado em baixo) permite a configuração de várias facetas da lógica de receção e encaminhamento.

{
    "remote": {   // Configurações do broker remoto
            "host": "iot.av.it.pt",
            "port": 1883,
            "tenant_id": "detimotic",
            "device_prefix": "device_", // prefixo ao UUID da métrica
            "telemetry_topic": "telemetry",
            "value_description": "value"
    },
    "local": {   // Configurações do broker local
            "host": "localhost",
            "port": 1883,
            "uname": "detimotic",
            "telemetry_topic": "telemetry",
            "value_description": "value",
            "max_workers": 20
    },
    "security": {
            "kdf_iterations": 1974  // Iterações do PBKDF2
    }
}

Exemplo de configuração do ficheiro gateway_config.json

Existe ainda o ficheiro escondido .secret_config.json (exemplificado em baixo) que não deverá ser público e onde são introduzidos os parâmetros de autenticação e segurança.

{
    "local_broker_pw": "mqtt_password",
    "hono_sensors_pw" : "pw_that_proves_gw_identity_to_hono",
    "secret_key": "secure_key_for_generating_aes_keys",
    "secret_salt": "random_str123"
}

Exemplo de configuração do ficheiro .secret_config.json