Wir stellen das einfachste ZigBee-Netzwerk zusammen, programmieren unter Mbed und kommunizieren über MQTT

Dieser Artikel ist ein großartiger Schulungsworkshop für Einsteiger zur Verwendung des XBee-Moduls in Verbindung mit einem Mikrocontroller mit integriertem Mbed-Betriebssystem. ZigBee ist ein langer und fest verwurzelter Standard in Smart-Home-Systemen (zum Beispiel wird es zusammen mit Z-Wave im Samsung SmartThings-Hub verwendet, siehe unseren Artikel ). Es zeichnet sich durch geringen Stromverbrauch, Benutzerfreundlichkeit und vor allem durch die Fähigkeit zum Erstellen aus selbstkonfigurierende Mesh-Netzwerke. Sie werden aus dem Workshop sehen, dass dies tatsächlich so ist - wir werden die Struktur eines solchen Netzwerks durch ein praktisches Visualizer-Dienstprogramm untersuchen.

Es wird davon ausgegangen, dass Sie bereits wissen, was ZigBee ist und wofür es ist. Jetzt möchten Sie Ihr erstes XBee-Modul anschließen und Ihre Probleme damit lösen, ohne das Modul selbst zu programmieren, sondern nur als Kommunikationsschnittstelle zu verwenden. Am Ende werden wir alle Daten über ein provisorisches MQTT-Gateway überall hin senden, sogar an einen lokalen Server, sogar ins Internet. Wir haben uns entschlossen, alles am Beispiel von Mbed als das einfachste und zugänglichste für Anfänger-RTOS zu zeigen. Sie werden überzeugt sein, dass alles „out of the box“ funktioniert, und Sie können sofort mit der Erstellung Ihres Projekts beginnen, auch wenn Sie zuvor nur mit Arduino zu tun hatten.



Das Handbuch besteht aus folgenden Teilen:

  1. Anschluss und Konfiguration des XBee-Moduls
  2. Verbinden Sie die Module mit dem Netzwerk
  3. Wir konfigurieren das Modul, ohne es von der Abschirmung zu entfernen
  4. Datenabruf
  5. Daten senden
  6. Erstellen eines einfachen MQTT-Gateways

Aber zuerst eine Liste von Komponenten: Was ist wünschenswert, um all das zu tun?

Erforderliche Komponenten


  • Zwei Mbed-kompatible Boards. Wir empfehlen das STM32 Nucleo Training Board als relativ kostengünstig und beliebt für Bildungszwecke. Der dortige Programmiervorgang wird maximal vereinfacht: Sammeln Sie das Programm in einer kostenlosen Online-IDE, laden Sie die zusammengestellte Firmware herunter und legen Sie sie auf der Karte ab, die im System als Flash-Laufwerk angezeigt wird. Welches spezifische Modell zu nehmen ist, ist nicht wichtig, aber nehmen Sie nicht das älteste, achten Sie auf die Größe des Speichers. Zum Beispiel F401RE - wir geben nur zur Bestimmtheit an, damit Sie nicht in ihrer Vielfalt und zunächst unverständlichen alphabetischen Codes von STM-Prozessoren verwirrt werden.


  • XBee-. Digi. «» , , , MBee, , , , . / : , . / Pro: , , Pro .

  • XBee Shield V2 ( SeeedStudio). - , RX TX XBee-.

  • Ein USB-UART-Konverter mit Anschluss für XBee. Es wird für die Erstkonfiguration benötigt. XBee-Module selbst sind nicht mit einer USB-Schnittstelle ausgestattet (sie haben nichts damit zu tun). USB wird ausschließlich für die Kommunikation zwischen dem Modul und dem Computer benötigt und kann im Gerät mit einem viel einfacheren UART arbeiten.

    Der Schlitzabstand der XBee-Module beträgt 2,0 mm - für die Elektronik ist er im metrischen System nicht Standard (wir sind es normalerweise gewohnt, Schritt 2.54 nach amerikanischen Standards zu sehen). Daher werden solche Module leider nicht in das Steckbrett eingesetzt und benötigen immer einen Adapter.

    Jeder Adapter ist hier geeignet, wir haben diesen von Waveshare genommen:


Anschluss und Konfiguration des XBee-Moduls


Das Einfachste, was Sie mit dem Modul tun können, ist, es direkt über USB an den Computer anzuschließen. Wir erhalten sofort Zugriff auf die Konfigurationsparameter.

Installieren Sie XCTU


Für die Arbeit mit XBee gibt es ein offizielles XCTU-Programm. Laden Sie es herunter und installieren Sie es. In der Dokumentation heißt es, dass Sie in Ubuntu einen Benutzer zu einer Gruppe hinzufügen müssen, um dialoutmit Ports zu arbeiten, die nicht von einem Superuser stammen. Tun Sie dies, wenn Sie dies noch nicht getan haben:

sudo usermod -a -G dialout <username>

Laden Sie das Zip-Archiv über den Link herunter, es enthält eine Datei .run. Es muss ausführbar gemacht werden (über chmod +x _in der Konsole oder: rechte Maustaste - Eigenschaften - Berechtigungen) und ausgeführt werden ./40002881_V.run.

Es ist wichtig, die Installation nicht vom Root aus (ohne sudo) zu starten , da sonst später Probleme auftreten.

Das Setup sieht ungefähr so ​​aus:



XCTU-Programm


Nach der Installation können Sie das Programm starten, indem Sie die Datei appin dem Verzeichnis ausführen, in dem Sie das Programm installiert haben (standardmäßig - ~/Digi/XCTU-NG).
 
Das Erscheinungsbild



sieht folgendermaßen aus: In diesem Programm können Sie Ihr vorhandenes Modul über einen Adapter an den USB-Anschluss anschließen. Klicken Sie mit einer Lupe auf die Schaltfläche Entdecken. Es erscheint ein Fenster, in dem Sie aufgefordert werden, einen Port auszuwählen. Wie Sie sehen können, hat das Programm den Port im System korrekt erkannt. /dev/ttyUSB0Dies ist unser USB-UART-Adapter.



Das Fenster schlägt vor, die Suche abzuhaken. Natürlich besteht die Versuchung, alles auf einmal zu überprüfen, um Ihr Modul sicher zu finden. Aber dann wird die Suche noch sehr lange dauern. In der Praxis ist es sinnvoll, die Kontrollkästchen standardmäßig aktiviert zu lassen und die gängigsten Optionen für die Datenübertragungsraten auszuwählen, wie in der folgenden Abbildung dargestellt. In der Regel sind neue Module standardmäßig 9600, und für Schulungszwecke ist dies mehr als ausreichend. Die Geschwindigkeit hier ist für uns nicht kritisch.



Wenn alles erfolgreich ist, werden Sie aufgefordert, das gefundene Modul auszuwählen:



Ein kleiner Fehler wurde festgestellt: Manchmal hatte das Modul keine nicht standardmäßige Geschwindigkeit. Das manuelle Zurücksetzen des Moduls mit der Schaltfläche Zurücksetzen während der Suche und das Zurücksetzen der Baudrate auf Standard (9600) half.

Modulparameter ändern


Weiter beschäftigen wir uns mit der Modulkonfiguration. Es fallen eine Reihe von Parametern aus, von denen die meisten zunächst unverständlich sind. Glücklicherweise müssen nur einige von ihnen für einen schnellen Start geändert werden.

Netzwerk-ID - PAN-ID. Als gemeinsamer Netzwerkschlüssel muss er für alle Geräte gleich sein, damit sie unabhängig mit dem Netzwerk verbunden sind. Geben Sie eine beliebige Zahl ein, in unserem Fall haben wir 42.



CE - Coordinator Enabled. Wenn es 1 gibt, fungiert dieses Modul als Koordinator. Wenn es 0 ist, fungiert das Modul als Router (Router) - es stellt lediglich sicher, dass Pakete das Netzwerk durch sich selbst passieren. Die meisten Hosts sind normalerweise Router. Wir brauchen einen Koordinator und zwei Router in unserem Netzwerk, also setzen Sie hier einen ein.

Es gibt auch die Rolle „Endgerät“ (Endgerät) - ein Modul, das keine Arbeit an der Übertragung von Paketen ausführt, sondern nur mit anderen Routern kommuniziert und seine nützlichen Funktionen ausführt. Normalerweise befindet er sich nur im Schlafmodus und wacht in festgelegten Intervallen auf und findet heraus, ob Nachrichten vorliegen. Ein solches Modul kann mit einer Batterie betrieben werden, während Router und Koordinator immer „online“ sein sollten und daher eine konstante Stromversorgung benötigen, um das gesamte Netzwerk aufrechtzuerhalten. Wir werden ein solches Beispiel jetzt nicht betrachten, da es für alle interessanter ist, die Rolle von Routern zuzuweisen und zu beobachten, wie das Netzwerk seine Konfiguration automatisch ändert.



AP - API aktivieren.Arbeitsweise. XBee-Module können in zwei Modi betrieben werden: AT oder API. Der AT-Modus ist für Anfänger einfacher, er ist ein transparenter Austausch der seriellen Schnittstelle und die Arbeit mit dem Modul über AT-Befehle. Der API-Modus ist jedoch wesentlich funktionsreicher. Er ermöglicht die Remote-Konfiguration von Modulen, enthält die Absenderadresse, gibt den Paketzustellungsstatus zurück und vieles mehr. Darüber hinaus setzen Bibliotheken für die Interaktion mit XBee voraus, dass das Gerät im API-Modus verwendet wird. Ersetzen Sie es daher sofort durch den API-Modus. Setzen Sie dazu das Gerät in das entsprechende Feld ein.



Der Name des Moduls lautet Node Identifier. Eine praktische Option, um Ihrem Modul einen lesbaren Namen zu geben. Geben wir ihm einen solchen Namen - Koordinator.



Danach können Sie die Einstellungen in das Modul flashen, indem Sie die Taste mit einem Bleistift drücken:



2. Verbinden Sie die Module mit dem Netzwerk


Jetzt werden wir sehen, welche Art von Netzwerk wir erhalten, wenn wir drei Module konfigurieren. Das XCTU-Programm hat einen ziemlich praktischen Netzwerk-Visualizer, wir werden die Topologie klar sehen.

Wir werden alle drei Module der Reihe nach mit den folgenden Parametern konfigurieren:
  • PAN ID - Gesamtzahl, zum Beispiel 42
  • AP (API Enable) - auf 1 gesetzt (im API-Modus arbeiten)
  • NI (Node Identifier) ​​- Geben Sie den Modulen verständliche Namen (Koordinator, Lampe und Schalter, wenn wir beispielsweise ein Modell des Smart Home-Systems verwenden).
  • CE (Coordinator Enable) - Setzen Sie eines der Module auf 1, es wird der Koordinator sein.

Schalten Sie dann alle Module ein. Positionieren Sie sie wie folgt: Der Koordinator befindet sich im USB-UART-Konverter, und die anderen beiden (Router) befinden sich auf den XBee Shield-Karten oben auf Nucleo.

Wenn Sie alles sorgfältig gemacht haben, wird das Schöne passieren. Die Module stellen automatisch eine Verbindung zum Netzwerk her. Sie können über den Koordinator remote mit Routern kommunizieren.

Es sieht aus wie das. Klicken Sie auf die Schaltfläche "Funkknoten im selben Netzwerk erkennen".



Sie werden sehen, dass zwei Module automatisch erkannt und hinzugefügt wurden:


Und Sie können ihre Parameter im laufenden Betrieb ändern! 

Was immer noch großartig ist: Jetzt können Sie die Netzwerkkarte sehen, wenn Sie oben rechts in den Netzwerkarbeitsmodus wechseln.



Nachdem Sie die Netzwerkknoten mit der Maus verteilt haben, sehen Sie ein Dreieck. Bitte beachten Sie, dass der Datenverkehr zum Modul ganz rechts auf zwei Arten erfolgen kann. Und wenn Sie die Module im Raum verschieben, werden Sie feststellen, dass sich das Bild geändert hat, und jetzt wird möglicherweise ein anderes Modul „extrem“. Dies ist die Essenz eines selbstkonfigurierenden Netzwerks.

3. Richten Sie das XBee-Modul ein, ohne es von der Abschirmung zu entfernen


Natürlich wird es interessanter sein, mit dem XBee-Modul nicht über einen Computer zu arbeiten, sondern es mit einem Programm auf dem Mikrocontroller zu steuern. Das heißt, es wird an die STM32Nucleo-Karte angeschlossen.
Lassen Sie uns diskutieren, wie das XBee-Modul mit dem Mikrocontroller kommunizieren kann. Beginnen wir mit einer kleinen Aufgabe: Wie konfiguriere ich ein Modul, ohne es vom Erweiterungsschild zu entfernen? Sie müssen zugeben, dass das Hin- und Herbewegen des Moduls unpraktisch ist. Gleichzeitig möchten Sie mit den Parametern experimentieren. Es ist seltsam, warum Sie ein separates USB-UART-Modul benötigen, da sich theoretisch eines auf der STM32Nucleo-Karte befindet.

Die Lösung ist einfach: Wir müssen die Nucleo-Karte in eine Brücke zwischen dem XBee-Modul und dem USB-Konverter auf der Karte verwandeln.

Allgemeine Beschreibung der Idee


Der von uns verwendete STM32-Mikrocontroller verfügt über mehrere integrierte UART-Schnittstellen. Jede solche Schnittstelle repräsentiert einen Kommunikationskanal. Einer von ihnen ist an den USB-UART-Konverter angeschlossen, damit wir über USB im Terminal mit dem Computer kommunizieren können. Zwei andere werden noch nicht verwendet. Wir werden das XBee-Modul mit einem von ihnen verbinden, das auch einen solchen Kommunikationskanal hat. Sie können einen beliebigen UART auswählen, den wir für die Bestimmtheit von UART1 ausgewählt haben.

Die Pinbelegung kann in MBed oben rechts angezeigt werden, indem Sie die Platinenauswahltaste und dann die Registerkarte Pinbelegung drücken. Aus Gewohnheit kann es schwierig sein, dieses farbenfrohe Bild wahrzunehmen. Hier gibt es viele Dinge, da die Karte viele Schnittstellen hat und es zwei Pin-Nummern gibt: relativ zum Mikrocontroller (PA_5, PA_6 - Pin-Nummerierung) und relativ zur Karte (D13, D12 - Beschriftungen auf der Nucleo-Karte, dieselben Nummern in der Nähe der Anschlüsse).


 
Es stellt sich heraus, dass auf dem Mikrocontroller die UART1-Schnittstelle mit dem XBee-Modul und UART2 - wie zuvor - mit dem Computer kommuniziert. Der interne Code leitet UART1 zu UART2 und umgekehrt um.



Bei Verbindungen sieht es folgendermaßen aus:



Aus einem Mikrocontroller eine „Brücke“ machen


In unserem Fall können wir Jumper auf dem Schild die Nummern einstellen, an die wir das ZigBee-Modul anschließen möchten. Das TX-Kommunikationsmodul wird an Pin 2 der Karte (PA_9 am Mikrocontroller) und RX an Pin 8 (auch bekannt als PA_10) angeschlossen.

Es wird so aussehen:



Der Code, den wir genommen haben, heißt Serial Bridge. Dies ist die „Brücke“ zwischen den beiden Kommunikationskanälen. Wir laden den Code in den Mikrocontroller, der alles, was vom Computer über UART2 zur Eingabe kommt, an UART1 weiterleitet und umgekehrt. Als hätten wir eine Pipe zwischen zwei Informationsquellen eingefügt (Linuxsoids wird es verstehen). Wir haben ein XBee-Modul an UART1 angeschlossen.
Der Code ist sehr einfach. Sie müssen nur die PIN-Nummern ändern, an die das Gerät angeschlossen ist. Das heißt, machen Sie sie PA_9 und PA_10, wie oben angegeben.
#include "mbed.h"
// Make a serial bridge from a serial I/O device on mbed to the PC
Serial pc(USBTX, USBRX); // tx, rx
Serial device(PA_9, PA_10); // tx, rx
// Defaults to 9600 baud on each device - use .baud(baudrate) to change
int main() {
 pc.printf("Hello!");
 while(1) {
   if(pc.readable()) {
     device.putc(pc.getc());
   }
   if(device.readable()) {
     pc.putc(device.getc());
   }
 }
}

Es ist wichtig, dass der Compiler Ihnen keinen Fehler meldet, wenn Sie die Reihenfolge der Schlussfolgerungen verwechseln - beispielsweise einen Fehler machen und PA_10, PA_9 anstelle von PA_9, PA_10 schreiben - und das Programm beim Neustart einen Fehler in der Konsole anzeigt:
pinmap not found for peripheral

und wird nicht weitergehen, das heißt, im Prinzip wird nichts funktionieren.

Nachdem Sie diesen Code heruntergeladen und die Steckbrücken auf dem Schild richtig eingestellt haben, können Sie vom Computer aus eine sichere Verbindung zum XBee-Modul herstellen, wie Sie es zuvor mit dem USB-UART-Adapter getan haben, ohne ihn vom Schild zu entfernen. Es wird regelmäßig vom XCTU-Programm erkannt.

Auch wenn Sie diese Funktionalität nicht benötigen, überprüfen Sie dennoch, ob das Programm funktioniert, da wir im nächsten Beispiel vom Mikrocontroller aus mit dem XBee-Modul kommunizieren und die Verbindung über UART1 bereits hergestellt sein sollte (dh die Jumper sind korrekt gesetzt und die Pin-Nummern sind im Programm angegeben). .

4. Datenerfassung


Schauen wir uns zwei einfache Beispiele an: Empfangen und Senden von Daten auf Mikrocontrollerebene unter Verwendung des XBee-Moduls als externe Kommunikationsschnittstelle.

Es gibt eine offizielle Bibliothek von Herstellern - Digi-Unternehmen. Es liegt im Mbed-Repository, es gibt nützliche Kommentare zur Verwendung und Logik des Codes.

Zuerst lernen wir, wie man Daten erhält - es gibt ein einfacheres Beispiel. Wir werden ein XBee-Modul an den USB-UART-Konverter anschließen, eine Begrüßung an die Nucleo-Karte senden und diese Begrüßung an die Konsole drucken.



Öffnen Sie das Projekt in dieser Bibliothek. Importieren Sie es wie immer als Programm in den Online-Compiler.

Fix Bibliotheken für S2C-Module


Beachten Sie, dass Sie bei Modulen der S2C-Serie



anstelle der Standardbibliothek den Fix XBeeLib_Fixed verwenden müssen . Andernfalls funktionieren diese Programme nicht. Es wird dem Projekt hinzugefügt, indem einfach die XBeeLib-Bibliothek von dort entfernt und in das XBeeLibFix-Projekt importiert wird. Es muss nichts mehr geändert werden.

Also: Importieren Sie diese Bibliothek in den Online-Compiler: Das



Projektimportfenster wird angezeigt. Dort müssen Sie das Ziel auswählen - wo wir importieren:



Wählen Sie als Zielprojekt unser Beispiel XBeeZB_Receive_Data aus.



Danach wird die Bibliothek in das Projekt importiert und dann mit einem fetten Zug die falsche Version von XBeeLib gelöscht.



Beispielzusammenstellung


Sie haben also das Beispiel importiert und bei Bedarf die Bibliothek darin ersetzt.
Schauen Sie sich den Beispielcode an, es ist ganz einfach. Es definiert eine Rückruffunktion, die aufgerufen wird, wenn ein Paket empfangen wird. Diese Funktion druckt den Inhalt des empfangenen Pakets an die Konsole. Wenn wir ihr also einen Gruß schicken, wird sie ihn auch ausdrucken.

Damit das Beispiel kompiliert werden kann, müssen Sie in das Beispiel die Schlussfolgerungen schreiben, die wir für die Kommunikation mit dem XBee-Modul verantwortlich sind, da das Programm nicht weiß, mit welchen Schlussfolgerungen wir die Hardware verbunden haben.

Daher gehen wir zur Datei config.h und den darin enthaltenen Zeilen:

//#define RADIO_TX NC /* TODO: specify your setup's Serial TX pin connected to the XBee module DIN pin */
//#define RADIO_RX NC /* TODO: specify your setup's Serial RX pin connected to the XBee module DOUT pin */

Kommentar aus, und anstelle von NC schreiben wir gemäß den Schlussfolgerungen, mit denen wir die Jumper verbunden haben:

#define RADIO_TX PA_9
#define RADIO_RX PA_10

Ebenso ändern wir die Zeilen:

//#define DEBUG_TX NC /* TODO: specify your setup's Serial TX for debugging */
//#define DEBUG_RX NC /* TODO: specify your setup's Serial RX for debugging (optional) */

Wir schreiben:

#define DEBUG_TX USBTX
#define DEBUG_RX USBRX

Wenn beim Kompilieren ein Fehler device.hauftritt , den Sie nicht finden können , aktualisieren Sie einfach die Mbed-Bibliothek in der Projektstruktur (klicken Sie mit der rechten Maustaste darauf -> Aktualisieren).

Danach wird das Programm erfolgreich kompiliert und Sie können es auf die Karte herunterladen.

Laufendes Beispiel


Nachdem Sie sich die Konsole angesehen haben, die das Nucleo-Board schreibt, sehen Sie Folgendes:



Wie senden wir Daten? Die einfachste Option: über die Konsole im XCTU-Programm. Wählen Sie im Hauptmenü des Programms: Extras - Pakete senden.



Unten befindet sich ein Fenster mit den Worten Pakete senden. Erstellen Sie ein neues Paket, indem Sie rechts auf das „Plus“ klicken. Ein Fenster zum Erstellen eines neuen Pakets wird angezeigt. Wählen Sie dort die Registerkarte HEX.



Geben Sie dort eine solche Datenübertragung ein:
7E 00 19 10 01 00 00 00 00 00 00 FF FF FF FE 00 00 48 65 6C 6C 6F 20 58 42 65 65 21 5A
(über die Schaltfläche "Ausgewähltes Paket senden" rechts neben der Paketliste)

Das Ergebnis wird in der Konsole des Abhörmoduls angezeigt:



Bitte beachten Sie, dass nur der letzte Teil des von Ihnen gesendeten Bytesatzes gedruckt wurde. Dies ist die tatsächliche Nutzlast der Nachricht. Beachten Sie auch, dass der Empfänger diese nicht ausgibt, wenn Sie "nur Bytes" (eine zufällige Kombination von Bytes) senden.

Wenn Sie eine Reihe von Bytes
48 65 6C 6C 6F 20 58 42 65 65 21
einfügen in einen HEX-ASCIII-Konverter (z. B. einen ), stellen Sie sicher, dass dies "Hallo XBee!" Bedeutet.

Eine sehr einfache Aufgabe für die unabhängige Ausführung: Ändern Sie den Beispielcode so, dass der Nachrichtentext in ASCII und nicht in HEX angezeigt wird und Sie diesen Text im Terminal lesen können.

5. Daten senden


In Analogie zum vorherigen Beispiel betrachten wir nun das Senden von Daten.



Alles ist hier, wie im vorherigen Beispiel. Nur mit dem Unterschied, dass wir jetzt das Beispiel XBeeZB_Send_Data öffnen.

Beispielzusammenstellung


Es ist wichtig, dass Sie, wenn Sie ein S2C-Modul haben (es ist deutlich darauf geschrieben),



die Bibliothek erneut mit einem Fix verbinden, da sonst nichts für Sie funktioniert. Wie das geht, wird im vorherigen Beispiel beschrieben. 

Außerdem müssen Sie hier für eine erfolgreiche Kompilierung die verwendeten Controller-Pins angeben. Sie können sie einfach aus dem vorherigen Beispiel kopieren.

Wir betrachten den Beispielcode selbst. Es mainwerden verschiedene Methoden zum Senden von Daten verwendet. Wählen Sie die einfachste: Senden Sie Daten an den Koordinator. Wir müssen nicht einmal die Adresse des Koordinators registrieren, da er bereits im Netzwerk registriert ist. Ohne das Beispiel zu ändern, kommentieren wir daher alle Zeilen am Ende:
send_data_to_coordinator(xbee);
//send_broadcast_data(xbee);
//send_data_to_remote_node(xbee, remoteDevice);
//send_explicit_data_to_remote_node(xbee, remoteDevice);

Und wenn Sie beginnen, sehen Sie Folgendes:



(Wenn Sie es nicht sehen, starten Sie einfach die Karte neu.)

Wie kann ich sicherstellen, dass die Daten den Koordinator erreichen? Beispielsweise verfügt XCTU über einen Netzwerkkonsolenmodus. Wird durch den Knopf oben rechts eingeschaltet. In diesem Modus sehen Sie alle Pakete im Netzwerk. Gleichzeitig sollten Sie natürlich eine serielle Verbindung mit dem Koordinator haben. Und vergessen Sie nicht, oben links auf die Schaltfläche Öffnen zu klicken, um sie grün zu machen.



Sie können detaillierte Informationen zu jedem Paket im Netzwerk anzeigen, indem Sie sie in der Liste links auswählen:



Wenn Sie zum Ende des Paketinhalts scrollen, wird eine Zeile mit dem Text "send_data_to_coordinator" angezeigt:



Sie können andere Methoden zum Senden von Daten ausprobieren, aber dort (zum Beispiel zum Senden an einen separaten ausgewählten Knoten) müssen Sie die Knotenadresse registrieren. Sie können die Adressen aller Module im XCTU-Programm sehen. Das Registrieren bestimmter Adressen wird im Beispiel ausführlich beschrieben.

6. Wir machen das MQTT-Gateway


Alles ist großartig, aber jetzt möchte ich irgendwie mit diesen Daten außerhalb des XBee-Netzwerks arbeiten, zum Beispiel im Internet. Eine Möglichkeit, dies zu tun, besteht darin, den Übersetzer von XBee in das beliebte MQTT-Protokoll einzufügen. Dann können wir auf übliche Weise Ereignisbenachrichtigungen abonnieren und Befehle über die Benutzeroberfläche senden. Dieses Programm kann sich überall befinden (wenn Sie einen externen statt eines lokalen MQTT-Servers verwenden) und nicht nur auf unserem Computer.

Unten finden Sie eine Anleitung. Kurz gesagt, das auf dem Computer gestartete Programm tauscht Daten vom Netzwerkkoordinator über eine USB-Verbindung aus. Sie wird diese Daten an das MQTT-Protokoll übertragen.


Installieren und konfigurieren Sie XBMQ


Das Programm, das wir als MQTT-Gateway verwenden werden, heißt XBMQ, es ist offen und kostenlos. Existiert in zwei Versionen:

Die Java-Version wird berücksichtigt, obwohl dies nicht allzu grundlegend ist: Wir werden sie sowieso nicht programmieren, wir werden sie nur installieren und verwenden.
Damit das Programm funktioniert, benötigen Sie die RXTX-Bibliothek. Sie kann einfach aus dem Repository installiert werden:
sudo apt-get install librxtx-java

Und natürlich benötigen Sie das JDK (Java Development Kit). Es gibt zwei Versionen - von Oracle und OpenJDK wird die zweite empfohlen. OpenJDK ist höchstwahrscheinlich bereits auf Ihrem System installiert. Wenn nicht, installieren Sie es erneut. Java benötigt maximal 8, da javax.xml.bind von Java 11 ausgeschlossen ist und Sie eine Alternative mit JDK-8 als Standardoption auswählen oder eine Konfiguration für diesen Fall erstellen müssen.

Laden Sie das Repository des XBMQ-Programms herunter:
git clone https://github.com/angryelectron/xbmq-java

Nach dem Herunterladen der Quellcodes sammeln wir die Binärdatei des Programms. Mannschaft
ant dist

wird ein Projekt für alle wichtigen Betriebssysteme zusammenstellen. Das endgültig kompilierte Programm befindet sich im Ordner dist.
Konfigurieren Sie nun dieses Programm. Datei öffnen
dist/xbmq.properties

und dort sehen:
#
# Xbmq Properties.
#
#port = /dev/ttyUSB0
#baud = 9600
#rootTopic = ab123
#broker = tcp://test.mosquitto.org:1883
#username = user
#password = password

Kommentieren Sie Ihre Parameter aus und ändern Sie sie. Die Parameter lauten wie folgt: ZigBee-Koordinator-Verbindungsport, Geschwindigkeit, Stammthema (alle Daten fallen hinein), MQTT-Serveradresse, Benutzername und Kennwort (falls der Server dies erfordert).

In diesem Beispiel hat sich nur die Serveradresse geändert - auf den lokalen mqtt-Server (Standardmücke von Linux). Alles andere wurde standardmäßig belassen:

port = /dev/ttyUSB0
baud = 9600
rootTopic = ab123
broker = tcp://127.0.0.1:1883
username = user
password = password

Vor dem nächsten Schritt müssen Sie den lokalen Moskito-MQTT-Server installieren und ausführen: 
sudo apt-get install mosquitto


XBMQ-Start


Schließlich kann das Programm gestartet werden. Führen Sie das Programm aus, nachdem Sie den USB-UART-Konverter mit dem eingesetzten Koordinatormodul verbunden haben:
./dist/xbmq.sh

Wenn Sie das Skript ausführen, sehen wir die Zeile in der Konsole:
INFO - Starting XBMQ gateway ab123/0013A2004154EA46

Zuletzt - das ist genau die Adresse unseres Koordinators. Wenn Sie alle Themen mit einem externen MQTT-Client abonnieren, werden sofort zwei Meldungen angezeigt:
  • Im Thema ab123/0013A2004154EA46/online- wird 1 sein, dies ist Last Will (ein gutes Beispiel dafür, wie diese "speziellen" Parameter im wirklichen Leben verwendet werden)
  • Das Thema ab123/0013A2004154EA46/logenthält denselben Debugging-Satz "XBMQ-Gateway starten ...", den Sie bereits in der Konsole gesehen haben

Versuchen Sie nun, eine Nachricht von einem anderen externen XBee-Modul zu senden. Nehmen Sie beispielsweise ein Beispiel für das Senden von Daten.

Wenn Sie im Programm MQTT.fx alle Themen abonnieren (#), wird


Folgendes angezeigt : Das Programmfenster MQTT.fx. Wenn Sie also

das zuvor untersuchte Beispiel mit dem Senden einer Nachricht an den Koordinator ausführen, wird dieser Text ("send_data_to_coordinator") als Teil angezeigt MQTT-Paket. Das für uns übliche übergeordnete Thema ist das in der Programmkonfiguration angegebene ( ab123 , Sie können es in Ihr eigenes ändern). Als nächstes kommt die Adresse des Koordinators und dann die Adresse des Moduls, von dem die Nachricht stammt. Schließlich heißt dieses Thema DataOut, da es sich um ausgehende Daten handelt. 

Natürlich sehen Sie ein solches Bild in jedem anderen MQTT-Client, sei es MQTTLens oder auch nurmosquitto_subin der Konsole.

Ein paar abschließende Kommentare:
  • In guter Weise sollte dieses Programm im Daemon-Modus funktionieren. Hierfür gibt es eine xbmqd-Datei, und README erklärt, wie man sie verwendet.
  • xbmqBeachten Sie, dass wir dieses Programm nicht gleichzeitig mit XCTU ausführen können , da es den Port enthält.

Jetzt können Sie mit dem MQTT-Protokoll mit Ihrem System arbeiten und komplexe, interessante Programme schreiben!


Tatyana Volkova - Die Autorin des Schulungsprogramms im Internet der Dinge verfolgt „Samsung IT Academy“, eine Spezialistin für Corporate Social Responsibility-Programme im Samsung Research Center

All Articles