Protocolo MQTT para integração de agentes
Configuração do intermediário, inscrição em tópicos e ativação de agentes orientada por mensagens.
Protocolo MQTT para integração de agentes é uma aula grátis de AI Agents no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de AI Agents, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de AI Agents inclui 4 aulas no total.
MQTT e agentes de IoT
MQTT (Transporte de Telemetria por Filas de Mensagens) é um protocolo leve de publicação e assinatura projetado para ambientes de IoT com baixa largura de banda e alta latência. Os agentes podem assinar tópicos MQTT para receber dados de sensores em tempo real e publicar comandos de volta para os dispositivos.
Instalação do paho-mqtt
A biblioteca paho-mqtt é o cliente MQTT padrão para Python. Instale-a com pip. Ela é compatível com MQTT 3.1.1 e 5.0, oferece criptografia TLS e é compatível com os três níveis de QoS.
# pip install paho-mqtt
import paho.mqtt.client as mqtt
# Create a client instance
client = mqtt.Client(client_id='agent_001', protocol=mqtt.MQTTv311)
# Optional: set credentials if broker requires authentication
client.username_pw_set(username='agent_user', password='YOUR_PASSWORD')
# Optional: enable TLS for secure connections
# client.tls_set('/path/to/ca.crt')
print('MQTT client created:', client._client_id)Conexão ao intermediário
Conecte-se a um intermediário MQTT (por exemplo, Mosquitto, HiveMQ, EMQX ou um intermediário na nuvem). A chamada connect não bloqueia; use loop_start() para executar o loop de rede em uma thread em segundo plano.
import paho.mqtt.client as mqtt
import time
BROKER_HOST = 'broker.hivemq.com' # public test broker
BROKER_PORT = 1883
KEEP_ALIVE_SECONDS = 60
def on_connect(client, userdata, flags, rc):
status = {
0: 'Connected successfully',
1: 'Refused: wrong protocol',
2: 'Refused: client ID rejected',
3: 'Refused: server unavailable',
4: 'Refused: bad credentials',
5: 'Refused: not authorised'
}
print(f'Connect result: {status.get(rc, f"Unknown code {rc}")}')
client = mqtt.Client(client_id='agent_001')
client.on_connect = on_connect
client.connect(BROKER_HOST, BROKER_PORT, keepalive=KEEP_ALIVE_SECONDS)
client.loop_start() # background thread
time.sleep(1) # wait for connectionAssinando um Tópico
Os tópicos são cadeias hierárquicas, como sensors/temperature ou factory/line1/pressure. Use # como curinga para todos os subtópicos ou + como curinga para um único nível. Associe uma função de retorno on_message para processar as mensagens recebidas.
import json
class FakeMsg:
def __init__(self, topic, payload):
self.topic = topic
self.payload = payload
class FakeMQTTClient:
def __init__(self):
self.on_message = None
self.userdata = {}
def user_data_set(self, userdata):
self.userdata = userdata
def subscribe(self, topic, qos=0):
print(f'Subscribed to {topic} (qos={qos})')
def simulate_message(self, topic, payload_bytes):
self.on_message(self, self.userdata, FakeMsg(topic, payload_bytes))
class Agent:
def process_sensor_data(self, topic, payload):
print(f'Agent processing {topic} -> {payload}')
def on_message(client, userdata, msg):
topic = msg.topic
try:
payload = json.loads(msg.payload.decode('utf-8'))
except (json.JSONDecodeError, UnicodeDecodeError):
payload = msg.payload.decode('utf-8', errors='replace')
print(f'Received on {topic}: {payload}')
userdata['agent'].process_sensor_data(topic, payload)
agent_state = {'agent': Agent()}
client = FakeMQTTClient()
client.user_data_set(agent_state)
client.on_message = on_message
client.subscribe('sensors/temperature', qos=1)
client.subscribe('sensors/+/humidity', qos=1)
client.subscribe('factory/#', qos=1)
client.simulate_message('sensors/temperature', b'{"value": 21.5}')Níveis de QoS Explicados
O MQTT tem três níveis de Qualidade de Serviço: QoS 0 — no máximo uma vez (mais rápido, mas as mensagens podem ser perdidas); QoS 1 — pelo menos uma vez (mensagem confirmada, mas pode haver duplicatas); QoS 2 — exatamente uma vez (garantido, mas mais lento). Escolha com base na sua tolerância à perda de dados e à latência.
# QoS level guidelines for IoT agents:
# QoS 0 — temperature readings updated every second
# (loss of one reading is acceptable)
client.subscribe('sensors/temperature', qos=0)
# QoS 1 — alert notifications (must arrive, duplicates are OK)
client.subscribe('sensors/alerts', qos=1)
# QoS 2 — billing/counting events (each event must be processed exactly once)
client.subscribe('meters/energy_consumed', qos=2)
# When publishing, specify QoS:
client.publish(
topic='agents/response',
payload='{"action": "turn_on_cooling"}',
qos=1,
retain=False
)
print('Published command with QoS 1')Mensagens Retidas
Uma mensagem retida é o último valor publicado para um tópico, que o servidor armazena e envia imediatamente a qualquer novo assinante. Isso é ideal para tópicos de estado de sensores: uma nova instância do agente que entra na rede sabe imediatamente o valor atual do sensor, sem precisar esperar a próxima atualização.
# Publishing with retain=True persists the last value on the broker
client.publish(
topic='sensors/thermostat/current_temp',
payload='{"value": 22.5, "unit": "celsius"}',
qos=1,
retain=True # broker stores this message
)
# Any new subscriber will receive this immediately on subscribe,
# even if it was published hours ago.
# To clear a retained message, publish empty payload:
client.publish(
topic='sensors/thermostat/current_temp',
payload='', # empty payload clears retention
retain=True
)
print('Retained message cleared')Construindo um Agente de Sensores MQTT
Um agente de sensores assina tópicos de sensores brutos, valida os dados recebidos e decide se deve acionar uma ação. A lógica de decisão usa o LLM apenas para casos complexos; verificações simples de limiar são tratadas em Python puro para obter mais velocidade.
import anthropic
class SensorAgent:
def __init__(self, mqtt_client, llm_api_key: str):
self.client = mqtt_client
self.llm = anthropic.Anthropic(api_key=llm_api_key)
self.readings = []
def process_sensor_data(self, topic: str, payload: dict):
value = payload.get('value')
if value is None:
return
self.readings.append({'topic': topic, 'value': value})
# Fast path: simple threshold
if topic == 'sensors/temperature' and value > 35:
self._trigger_action('COOLING_ON', f'Temperature {value}C exceeds threshold')
# Slow path: complex reasoning via LLM
elif len(self.readings) >= 10:
self._llm_analyze()
def _trigger_action(self, action: str, reason: str):
payload = '{"action": "' + action + '", "reason": "' + reason + '"}'
self.client.publish('agents/actions', payload, qos=1)
print(f'Action triggered: {action} — {reason}')
def _llm_analyze(self):
summary = str(self.readings[-10:])
result = self.llm.messages.create(
model='claude-opus-4-5', max_tokens=128,
messages=[{'role': 'user', 'content':
f'Sensor readings: {summary}. Any anomalies?'}]
)
print('LLM analysis:', result.content[0].text)
self.readings = []MQTT sobre WebSocket
O MQTT sobre WebSocket (porta 8083 ou 8084 para TLS) permite que painéis e agentes baseados em navegador se conectem a servidores MQTT sem uma conexão TCP nativa. Configure o paho-mqtt para usar o transporte WebSocket com a opção transport='websockets'.
import paho.mqtt.client as mqtt
# MQTT over WebSocket configuration
ws_client = mqtt.Client(
client_id='dashboard_agent',
transport='websockets', # use WS instead of TCP
protocol=mqtt.MQTTv311
)
# WebSocket path (broker-specific)
ws_client.ws_set_options(path='/mqtt', headers=None)
# TLS over WebSocket (WSS, port 8084)
# ws_client.tls_set() # uses system CA store
ws_client.connect(
host='broker.hivemq.com',
port=8884, # WSS port
keepalive=60
)
ws_client.loop_start()
print('Connected via WebSocket')Última Vontade e Testamento
A Última Vontade e Testamento (LWT) do MQTT permite que o servidor publique uma mensagem em nome de um Client caso o Client se desconecte inesperadamente. Use isso para avisar outros agentes de que um agente de sensores ficou offline, permitindo que eles mudem para um modo alternativo.
import paho.mqtt.client as mqtt
client = mqtt.Client(client_id='agent_001')
# Set LWT before connecting
client.will_set(
topic='agents/status/agent_001',
payload='{"status": "offline", "reason": "unexpected_disconnect"}',
qos=1,
retain=True # retain so new subscribers see the last known status
)
def on_connect(client, userdata, flags, rc):
if rc == 0:
# Publish 'online' status on connect (overrides LWT retain)
client.publish(
'agents/status/agent_001',
'{"status": "online"}',
qos=1, retain=True
)
client.on_connect = on_connect
client.connect('broker.hivemq.com', 1883, keepalive=60)
client.loop_start()Boas Práticas para o Projeto de Tópicos
Um bom projeto de tópicos torna o código dos agentes mais fácil de manter e dimensionar. Use uma hierarquia: location/device_type/device_id/measurement. Evite espaços e caracteres especiais. Mantenha os tópicos curtos — eles acrescentam sobrecarga a cada mensagem.
# Good topic hierarchy examples:
# factory/line1/sensor_042/temperature
# home/living_room/thermostat_01/setpoint
# agents/agent_001/commands/turn_on
# agents/agent_001/status
TOPIC_SCHEMA = {
'sensor_data': '{location}/{device_type}/{device_id}/{measurement}',
'agent_command': 'agents/{agent_id}/commands/{action}',
'agent_status': 'agents/{agent_id}/status',
'alert': 'alerts/{severity}/{location}'
}
def build_topic(schema_key: str, **kwargs) -> str:
template = TOPIC_SCHEMA[schema_key]
return template.format(**kwargs)
# Usage:
topic = build_topic('sensor_data',
location='factory', device_type='temp_sensor',
device_id='042', measurement='celsius')
print(topic) # factory/temp_sensor/042/celsiusDesconexão e Reconexão Limpas
Os agentes em ambientes de IoT devem lidar adequadamente com interrupções de rede. Use a lógica de reconexão integrada do paho-mqtt: defina reconnect_on_failure=True e assine novamente os tópicos a cada reconexão, pois as assinaturas não são mantidas por padrão (a menos que sejam usadas sessões persistentes).
import paho.mqtt.client as mqtt
import time
SUBSCRIPTIONS = [
('sensors/temperature', 1),
('sensors/humidity', 1),
('agents/commands', 2)
]
def on_connect(client, userdata, flags, rc):
if rc == 0:
print('Connected — re-subscribing to topics')
for topic, qos in SUBSCRIPTIONS:
client.subscribe(topic, qos=qos)
else:
print(f'Connection failed with code {rc}')
client = mqtt.Client(client_id='agent_reliable', clean_session=True)
client.on_connect = on_connect
client.reconnect_delay_set(min_delay=1, max_delay=30)
client.connect_async('broker.hivemq.com', 1883, keepalive=60)
client.loop_start()
# Graceful shutdown:
# client.disconnect()
# client.loop_stop()Verificação de Conhecimento
Qual nível de QoS garante que uma mensagem seja entregue exatamente uma vez?
Resumo: MQTT para Integração de Agentes
Excelente! O que você aprendeu nesta lição:
- paho-mqtt:
connect(),loop_start(),subscribe(),publish() - Níveis de QoS: 0 = no máximo uma vez, 1 = pelo menos uma vez, 2 = exatamente uma vez
- Mensagens retidas: o servidor armazena o último valor; novos assinantes o recebem imediatamente
- LWT: o servidor publica uma mensagem de indisponibilidade após uma desconexão inesperada
- Reconexão: assine novamente em
on_connect; usereconnect_delay_set
A seguir: processamento de fluxos de dados de séries temporais — janelas deslizantes, médias móveis e detecção de picos.
Perguntas Frequentes
A aula “Protocolo MQTT para integração de agentes” é grátis?
Sim — o texto completo de “Protocolo MQTT para integração de agentes” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de AI Agents, atualize para CoddyKit PRO. O curso de AI Agents inclui 4 aulas no total.
O que vou aprender em “Protocolo MQTT para integração de agentes”?
Configuração do intermediário, inscrição em tópicos e ativação de agentes orientada por mensagens. Você pratica AI Agents com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar AI Agents?
Nenhuma experiência prévia é necessária. AI Agents no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Protocolo MQTT para integração de agentes”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de AI Agents?
Sim. Cada aula de AI Agents inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Protocolo MQTT para integração de agentes
- Processamento de dados de séries temporais em agentes
- Resposta automatizada a eventos de sensores
- Implantação de agentes leves na borda