Skip to content

MQTT-Anbindung ​

Die Open-Source-Version von FastBee enthält einen auf Netty basierenden MQTT-Broker, sodass keine zusätzliche Bereitstellung von EMQX erforderlich ist. Diese Seite beschreibt, wie Geräte über das MQTT-Protokoll an die Plattform angebunden werden.

Ablauf der Anbindung ​

  1. Erstellen und veröffentlichen Sie in der Produktverwaltung ein MQTT-Produkt und notieren Sie Produkt-ID, Gerätenummer, MQTT-Konto und Passwort
  2. Das Gerät oder MQTTX verbindet sich mit dem vereinbarten clientId, userName und password mit dem MQTT-Dienst
  3. Nach erfolgreicher Verbindung wird zuerst /info/post veröffentlicht, danach /property/post oder /event/post
  4. Auf der Plattformseite bestätigen Sie den geschlossenen Datenfluss über Laufzeitstatus, Ereignisprotokoll und Befehlsprotokoll in den Gerätedetails

Verbindungsinformationen ​

ParameterTCP-VerbindungWebSocket-Verbindung
AdresseServer-IPws://<Server-IP>:8083/mqtt
Port18838083
ProtokollMQTT 3.1.1MQTT over WebSocket

Geräteauthentifizierung ​

提示

  • Authentifizierungstypen: S = einfache Authentifizierung, E = verschlüsselte Authentifizierung
  • Wenn für ein Produkt der Geräte-Autorisierungscode aktiviert ist, darf der Autorisierungscode nicht leer sein
  • Die Benutzer-ID ist die ID des angemeldeten Benutzers; bei unterschiedlichen Benutzer-IDs gehören die Geräte unterschiedlichen Benutzern
  • Die Gerätenummer kann die von der Plattform erstellte Nummer sein oder eine eindeutige Kennung wie MAC/IMEI des Geräts (die Plattform registriert das Gerät dann automatisch)

Einfache Authentifizierung (für Tests empfohlen) ​

clientId = S&Gerätenummer&Produkt-ID&Benutzer-ID
userName = MQTT-Konto
password = MQTT-Passwort
password = MQTT-Passwort&Geräte-Autorisierungscode (wenn die Geräteautorisierung für das Produkt aktiviert ist)

Beispiel:

clientId = "S&D68329VL588&2&1"
userName = "fastbee"
password = "PHYFED93WSFF1DAS"

Verschlüsselte Authentifizierung (für die Produktion empfohlen) ​

clientId = E&Gerätenummer&Produkt-ID&Benutzer-ID
userName = MQTT-Konto
password = AES-verschlüsselt(MQTT-Passwort&Ablauf-Zeitstempel&Autorisierungscode(optional))
  • Das Passwort wird mit dem Produktschlüssel per AES-CBC verschlüsselt (Offset wumei-smart-open, Ausgabe Base64)
  • Der Ablauf-Zeitstempel ist auf Millisekunden genau; empfohlen werden maximal 24 Stunden

Beispiel:

clientId = "E&D68329VL588&2&1"
userName = "fastbee"
password = "/W2A/4MK+9cEGBhyBDgr2K5c62DAjAK4m0b5pvwxX6FFMzI3h1pUmaDY3BH1P2mI"

Hinweise zur AES-Verschlüsselung ​

Es wird der AES-CBC-Modus verwendet; für Tests können Sie das Online-Ver-/Entschlüsselungstool nutzen:

ParameterWert
VerschlüsselungsmodusCBC
Paddingpkcs5padding
Datenblock128 Bit
Offsetwumei-smart-open
AusgabeBase64
PasswortProduktschlüssel
Zu verschlüsselnder InhaltMQTT-Passwort&expireTime&Autorisierungscode(optional)

Abonnierte Themen (Plattform → Gerät) ​

Thema (Topic)Beschreibung
/{productId}/{deviceNum}/function/getPlattformbefehle abonnieren (Eigenschaft setzen, Funktionsaufruf)
/{productId}/{deviceNum}/info/getAnfrage für Geräteinformationen abonnieren (nach Empfang Geräteinformationen veröffentlichen)
/{productId}/{deviceNum}/monitor/getAnfrage für Echtzeitüberwachung abonnieren (liefert Anzahl und Intervall zurück)
/{productId}/{deviceNum}/ntp/getZeitsynchronisierung abonnieren (optional)
/{deviceNum}/http/upgrade/setOTA-Updates per HTTPS abonnieren
/{deviceNum}/fetch/upgrade/setOTA-Updates als Binärpaket abonnieren

Veröffentlichte Themen (Gerät → Plattform) ​

Thema (Topic)Beschreibung
/{productId}/{deviceNum}/property/postEigenschaften-/Funktionsdaten veröffentlichen (Echtzeitanzeige und Speicherung)
/{productId}/{deviceNum}/event/postEreignisse veröffentlichen
/{productId}/{deviceNum}/info/postGeräteinformationen veröffentlichen
/{productId}/{deviceNum}/monitor/postEchtzeit-Überwachungsdaten veröffentlichen (nur Echtzeitdiagramme, keine Speicherung)
/{productId}/{deviceNum}/ntp/postZeitsynchronisierung veröffentlichen (optional)
/{deviceNum}/http/upgrade/replyOTA-Update per HTTPS beantworten
/{deviceNum}/fetch/upgrade/replyOTA-Update als Binärpaket beantworten

提示

  • {productId} ist die Produkt-ID (nicht die Produktnummer), die Sie in den Produktdetails der Plattform finden
  • {deviceNum} ist die Gerätenummer und muss exakt mit dem Gerät auf der Plattform übereinstimmen

Datenformat ​

Gerät und Plattform tauschen Daten im JSON-Format aus.

Eigenschaften/Funktionen/Ereignisse veröffentlichen — /property/post, /event/post ​

json
[{
    "id": "temperature",
    "value": "27.43",
    "remark": "Temperatur normal"
}, {
    "id": "switch",
    "value": "1",
    "remark": "Schalter eingeschaltet"
}]
  • id: Thing-Modell-Kennung, in den Produktdetails einsehbar, innerhalb des Produkts eindeutig
  • value: Werte werden als String übertragen; boolesche Typen verwenden "0"/"1"; Enumerationstypen entsprechen den Enum-Schlüsseln; Array-Typen werden durch Kommas getrennt
  • remark: Anmerkung, im Gerätelog einsehbar

Plattformbefehle abonnieren — /function/get ​

json
[{
    "id": "gear",
    "value": "1",
    "remark": "Ausgelöst durch Szenenverknüpfung"
}, {
    "id": "switch",
    "value": "0",
    "remark": "Zeitgesteuertes Ausschalten"
}]

Geräteinformationen veröffentlichen — /info/post ​

json
{
    "rssi": -43,
    "firmwareVersion": 1.2,
    "status": 3,
    "userId": 1,
    "longitude": 0,
    "latitude": 0,
    "summary": {
        "name": "FastBee",
        "chip": "ESP32"
    }
}
FeldBeschreibung
rssiSignalstärke (ausgezeichnet [-55~0], gut [-70~-55], mäßig [-85~-70], schlecht [-100~-85])
firmwareVersionFirmware-Versionsnummer
statusGerätestatus, fest auf 3 (online) gesetzt
userIdBenutzer-ID
longitude/latitudeOptional, Geräteposition
summaryOptional, zusammenfassende Geräteinformationen

Echtzeitüberwachung — /monitor/get, /monitor/post ​

Die Plattform sendet eine Überwachungsanfrage:

json
{
    "count": 60,
    "interval": 1000
}

Das Gerät meldet die Daten mit der angegebenen Anzahl und im angegebenen Intervall:

json
[{
    "id": "temperature",
    "value": "27.43",
    "remark": ""
}]

Zeitsynchronisierung — /ntp/post, /ntp/get ​

Das Gerät veröffentlicht:

json
{
    "deviceSendTime": "1592361428000"
}

Die Plattform antwortet:

json
{
    "deviceSendTime": "1592361428000",
    "serverRecvTime": "1592366463548",
    "serverSendTime": "1592366463548"
}

Aktuelle Gerätezeit = (serverRecvTime + serverSendTime + deviceRecvTime - deviceSendTime) / 2

Regeln für Thing-Modell-Kennungen ​

  • Alle Kennungen sind innerhalb eines Produkts eindeutig, bestehen vorwiegend aus Buchstaben und Ziffern und vermeiden Sonderzeichen
  • Kennungen von Untermodellen eines Objekttyps haben das Format: parentId_childId
  • Kennungen von Array-Typen beginnen mit array_Index (Index zweistellig, z. B. array_00_power_switch); die Array-Länge darf 100 nicht überschreiten

AP-Netzwerkkonfiguration des Geräts (optional, nur für WLAN-Geräte) ​

Das Gerät öffnet einen Hotspot (Adresse 192.168.4.1); die mobile App überträgt die Konfigurationsinformationen über den Webdienst des Geräts.

Gerät erkennen ​

GET http://192.168.4.1/api/wifi/status

HTTP 200 bedeutet, dass das Gerät erkannt wurde; die Antwort enthält Geräteinformationen und den aktuellen Netzwerkstatus.

Konfigurationsschnittstelle ​

POST http://192.168.4.1/api/wifi/config?SSID=<WLAN-Name>&password=<WLAN-Passwort>&userId=<Benutzer-ID>
ParameterBeschreibung
SSIDWLAN-Name (erforderlich, kompatibel mit ssid in Kleinbuchstaben)
passwordWLAN-Passwort (erforderlich, kompatibel mit dem Alias pwd)
userIdBenutzer-ID (erforderlich)
deviceNumGerätenummer (optional)
extraProduktnummer (optional)

HTTP 200 bedeutet erfolgreiche Netzwerkkonfiguration (das Gerät wechselt anschließend automatisch in den STA-Modus), 400 bedeutet fehlende Pflichtparameter, 500 bedeutet, dass das Speichern fehlgeschlagen ist. Eine ausführliche Beschreibung der Schnittstelle finden Sie in „Netzwerkkonfiguration · AP-Provisioning-API für Smartphone/Mobile" (Chinesisch).

Test mit MQTTX ​

  1. Laden Sie den MQTTX-Client herunter
  2. Neue Verbindung anlegen:
    • Host: mqtt://<Server-IP>, Port: 1883
    • Client ID: S&Gerätenummer&Produkt-ID&1
    • Username: MQTT-Konto
    • Password: MQTT-Passwort
  3. Abonnieren Sie /{productId}/{deviceNum}/function/get
  4. Veröffentlichen Sie Geräteinformationen an /{productId}/{deviceNum}/info/post
  5. Veröffentlichen Sie Eigenschaftsdaten an /{productId}/{deviceNum}/property/post
  6. Beobachten Sie Online-Status und Laufzeitdaten des Geräts in der Plattformkonsole

Abnahmecheckliste für die Integration ​

SchrittPrüfinhaltErfolgskriterium
1Produkt veröffentlichtProduktstatus ist „veröffentlicht"
2MQTTX-VerbindungGerätedetails zeigen „online"
3/info/postGeräteinformationen, Signal- und Versionsfelder aktualisiert
4/property/postLaufzeitstatus zeigt Thing-Modell-Eigenschaftswerte
5/event/postGemeldete Ereignisse erscheinen im Ereignisprotokoll
6/function/getGerät empfängt den von der Plattform gesendeten Befehl
7ErgebnisrückmeldungGerät meldet das Ergebnis zurück, Plattformstatus wird aktualisiert
8Regeln/SzenenZugehörige Regeln, Szenen und Alarme werden ausgelöst

Häufige Fehler ​

Verbindung abgelehnt ​

  1. Ist der Port 1883 auf dem Server geöffnet?
  2. Ist der integrierte MQTT-Broker gestartet?
  3. Hat das clientId das richtige Format (S&Gerätenummer&Produkt-ID&Benutzer-ID)?
  4. Ist für das Produkt der Geräte-Autorisierungscode aktiviert?
  5. Ist das Gerät deaktiviert?

Gerät online, aber Eigenschaften aktualisieren sich nicht ​

  1. Lautet das Veröffentlichungsthema /{productId}/{deviceNum}/property/post?
  2. Verwenden Sie für productId die Produkt-ID (nicht die Produktnummer)?
  3. Stimmt deviceNum exakt mit der Gerätenummer überein?
  4. Hat der Nachrichtentext das JSON-Array-Format?
  5. Stimmt id exakt mit der Thing-Modell-Kennung überein?
  6. Entspricht value dem Datentyp?

Gerät empfängt Plattformbefehle nicht ​

  1. Hat das Gerät /{productId}/{deviceNum}/function/get abonniert?
  2. Ist das Gerät noch online?
  3. Handelt es sich beim Thing-Modell um eine beschreibbare Funktion oder eine setzbare Eigenschaft?
  4. Hat der Benutzer die Berechtigung für Gerätedetails und Befehlsausgabe?

Regel oder Alarm wurde nicht ausgelöst ​

  1. Gelangen die Gerätedaten in den Laufzeitstatus der Plattform?
  2. Sind Produkt, Gerät und Variable, die an die Szene oder Regel gebunden sind, korrekt?
  3. Stimmt der Bedingungsausdruck mit dem Typ des gemeldeten Werts überein?
  4. Ist die Alarmkonfiguration aktiviert?

Umwandlung mit Regelskripten ​

Wenn das Gerät ein eigenes Datenformat verwendet, können Sie im Regelskript eine Umwandlungslogik schreiben, die die Rohdaten in das Standardformat der Plattform überführt. Details siehe Regelskripte (Chinesisch).

Verwandte Dokumente ​