AI-agenter · leksjon

MQTT-protokollen for agentintegrasjon

Konfigurer megler, abonner på emner og aktiver agenter basert på meldinger.

Leksjon 1 av 413 trinn

MQTT-protokollen for agentintegrasjon er en gratis leksjon i AI-agenter på CoddyKit. Dette er leksjon 1 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i AI-agenter, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i AI-agenter inneholder totalt 4 leksjoner.

MQTT- og IoT-agenter

MQTT (Message Queuing Telemetry Transport) er en lettvektsprotokoll for publisering og abonnement, utviklet for IoT-miljøer med lav båndbredde og høy forsinkelse. Agenter kan abonnere på MQTT-emner for å motta sensordata i sanntid og publisere kommandoer tilbake til enheter.

Installere paho-mqtt

Biblioteket paho-mqtt er standardklienten for MQTT i Python. Installer det med pip. Det støtter MQTT 3.1.1 og 5.0, TLS-kryptering og alle tre QoS-nivåene.

# 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)

Koble til broker

Koble til en MQTT-broker (f.eks. Mosquitto, HiveMQ, EMQX eller en skybasert broker). Kallet connect er ikke-blokkerende; bruk loop_start() til å kjøre nettverksløkken i en bakgrunnstråd.

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 connection

Abonnere på et topic

Topic-er er hierarkiske strenger som sensors/temperature eller factory/line1/pressure. Bruk # som jokertegn for alle underliggende topic-er, eller + som jokertegn for ett enkelt nivå. Knytt en on_message-callback til for å behandle innkommende meldinger.

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}')

QoS-nivåer forklart

MQTT har tre Quality of Service-nivåer: QoS 0 — send og glem (raskest, meldinger kan gå tapt), QoS 1 — minst én gang (meldingen bekreftes, men kan bli duplisert), QoS 2 — nøyaktig én gang (garantert, tregest). Velg nivå basert på hvor mye datatap og ventetid som kan aksepteres.

# 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')

Retained-meldinger

En retained message er den sist publiserte verdien for et topic som brokeren lagrer og umiddelbart sender til alle nye abonnenter. Dette er ideelt for topic-er som beskriver sensortilstand: Når en ny agentinstans kobler seg til nettverket, kjenner den den gjeldende sensorverdien umiddelbart uten å måtte vente på neste oppdatering.

# 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')

Bygge en MQTT-sensoragent

En sensoragent abonnerer på rå sensortopic-er, validerer innkommende data og avgjør om en handling skal utløses. Beslutningslogikken bruker LLM-en bare i komplekse tilfeller; enkle terskelsjekker håndteres i ren Python for å oppnå høy hastighet.

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 over WebSocket

MQTT over WebSocket (port 8083 eller 8084 for TLS) gjør at nettleserbaserte dashbord og agenter kan koble seg til MQTT-brokere uten en innebygd TCP-tilkobling. Konfigurer paho-mqtt til å bruke WebSocket-transporten med alternativet 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')

Last Will and Testament

MQTTs Last Will and Testament (LWT) gjør at brokeren publiserer en melding på vegne av en klient hvis klienten kobles fra uventet. Bruk dette til å varsle andre agenter om at en sensoragent har gått offline, slik at de kan bytte til en reservemodus.

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()

Beste praksis for topic-design

God topic-design gjør agentkoden enklere å vedlikeholde og skalere. Bruk et hierarki: location/device_type/device_id/measurement. Unngå mellomrom og spesialtegn. Hold topic-ene korte — de legger til overhead i hver melding.

# 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/celsius

Korrekt frakobling og gjenoppkobling

Agenter i IoT-miljøer må håndtere nettverksavbrudd på en robust måte. Bruk den innebygde gjenoppkoblingslogikken i paho-mqtt: angi reconnect_on_failure=True og abonner på nytt ved hver gjenoppkobling, siden abonnementer ikke lagres som standard (med mindre det brukes persistente økter).

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()

Kunnskapssjekk

Hvilket QoS-nivå garanterer at en melding leveres nøyaktig én gang?

Oppsummering: MQTT for agentintegrasjon

Utmerket! Dette lærte De i denne leksjonen:

  • paho-mqtt: connect(), loop_start(), subscribe(), publish()
  • QoS-nivåer: 0 = høyst én gang, 1 = minst én gang, 2 = nøyaktig én gang
  • Retained-meldinger: brokeren lagrer den siste verdien, og nye abonnenter mottar den umiddelbart
  • LWT: brokeren publiserer en offlinemelding ved uventet frakobling
  • Gjenoppkobling: abonner på nytt i on_connect; bruk reconnect_delay_set

Neste tema: behandling av tidsseriedatastrømmer — rullerende vinduer, glidende gjennomsnitt og deteksjon av topper.

Gratis å komme i gang

Lær deg AI-agenter med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
60
Leksjoner
239

Ofte stilte spørsmål

Er leksjonen «MQTT-protokollen for agentintegrasjon» gratis?

Ja – hele teksten i «MQTT-protokollen for agentintegrasjon» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av AI-agenter-kurset, kan du oppgradere til CoddyKit PRO. Kurset i AI-agenter inneholder totalt 4 leksjoner.

Hva lærer jeg i «MQTT-protokollen for agentintegrasjon»?

Konfigurer megler, abonner på emner og aktiver agenter basert på meldinger. Du øver på AI-agenter med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med AI-agenter?

Ingen tidligere erfaring er nødvendig. AI-agenter på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 1 av 4.

Hvor lang tid tar leksjonen «MQTT-protokollen for agentintegrasjon»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne AI-agenter-leksjonen?

Ja. Alle AI-agenter-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. MQTT-protokollen for agentintegrasjon
  2. Behandling av tidsseriedata i agenter
  3. Automatiserte svar på sensorhendelser
  4. Distribusjon av lette agenter på edge-enheter
← Tilbake til AI-agenter