So verwenden Sie MQTT in Dart

Dart ist eine Client-optimierte Sprache für die Entwicklung schneller Apps auf jeder Plattform. Sein Ziel ist es, die produktivste Programmiersprache für die plattformübergreifende Entwicklung anzubieten, gepaart mit einer flexiblen Ausführungslaufzeitplattform für App-Frameworks.

MQTT ist ein leichtgewichtiges IoT-Messaging-Protokoll basierend auf einem Publish/Subscribe-Modell, das zuverlässige Messaging-Dienste in Echtzeit für verbundene Geräte mit minimalem Code und minimaler Bandbreite bereitstellen kann. Es ist weit verbreitet in Branchen wie IoT, mobiles Internet, intelligente Hardware, Internet der Fahrzeugeund Kraft und Energie.

Dieser Artikel stellt hauptsächlich die Verwendung vor mqtt_client Bibliothek im Dart-Projekt, um die Verbindung, das Abonnement, das Senden und Empfangen von Nachrichten zwischen dem Client und zu realisieren MQTT-Broker.

Vorbereitung

Die Beispiele in diesem Artikel basieren auf der macOS-Umgebung.

Holen Sie sich das SDK

Bitte beziehen Sie sich auf:Holen Sie sich das SDK

$ brew tap dart-lang/dart
$ brew install dart
$ dart --version
Dart SDK version: 2.13.0 (stable) (Wed May 12 12:45:49 2021 +0200) on "macos_x64"

Initialisieren des Projekts

$ dart create -t console-full mqtt_demo
$ cd mqtt_demo

Die Verzeichnisstruktur ist wie folgt.

├── CHANGELOG.md
├── README.md
├── analysis_options.yaml
├── bin
│   └── mqtt_demo.dart
├── pubspec.lock
└── pubspec.yaml

Abhängigkeiten installieren

In diesem Artikel verwenden wir mqtt_client als MQTT-Client-Bibliothek und installieren Sie es, indem Sie den folgenden Befehl ausführen.

$ dart pub add mqtt_client

Dadurch wird dem Projekt eine Zeile wie diese hinzugefügt pubspec.yaml Datei:

dependencies:
  mqtt_client: ^9.6.2

Verwendung von MQTT

Wir werden die verwenden kostenloser öffentlicher MQTT-Broker bereitgestellt von EMQ. Die Serverzugriffsinformationen lauten wie folgt:

  • Makler: broker.emqx.io
  • TCP-Port: 1883
  • Websocket-Port: 8083

Verbindung zum MQTT-Server herstellen

Bearbeiten bin/mqtt_demo.dart Datei.

import 'dart:async';
import 'dart:io';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';

final client = MqttServerClient('broker-cn.emqx.io', '1883');

Future<int> main() async {
  client.logging(on: true);
  client.keepAlivePeriod = 60;
  client.onDisconnected = onDisconnected;
  client.onConnected = onConnected;
  client.pongCallback = pong;

  final connMess = MqttConnectMessage()
      .withClientIdentifier('dart_client')
      .withWillTopic('willtopic') 
      .withWillMessage('My Will message')
      .startClean() 
      .withWillQos(MqttQos.atLeastOnce);
  print('client connecting....');
  client.connectionMessage = connMess;

  try {
    await client.connect();
  } on NoConnectionException catch (e) {
    print('client exception - $e');
    client.disconnect();
  } on SocketException catch (e) {
    print('socket exception - $e');
    client.disconnect();
  }

  if (client.connectionStatus!.state == MqttConnectionState.connected) {
    print('client connected');
  } else {
    print('client connection failed - disconnecting, status is ${client.connectionStatus}');
    client.disconnect();
    exit(-1);
  }
  return 0;
}


/// The unsolicited disconnect callback
void onDisconnected() {
  print('OnDisconnected client callback - Client disconnection');
  if (client.connectionStatus!.disconnectionOrigin ==
      MqttDisconnectionOrigin.solicited) {
    print('OnDisconnected callback is solicited, this is correct');
  }
  exit(-1);
}

/// The successful connect callback
void onConnected() {
  print('OnConnected client callback - Client connection was sucessful');
}

/// Pong callback
void pong() {
  print('Ping response client callback invoked');
}

Dann ausführen

$ dart run bin/mqtt_demo.dart

Wir werden sehen, dass der Client sich erfolgreich mit dem MQTT-Broker verbunden hat.

Stellen Sie eine Verbindung zum MQTT-Broker her

Anweisungen

MqttConnectMessage: Verbindungsoptionen festlegen, einschließlich Timeout-Einstellungen, Authentifizierung und Letzte-Wunsch-Nachrichten.

Beispiel einer Zertifikatverbindung

/// Security context
SecurityContext context = new SecurityContext()
  ..useCertificateChain('path/to/my_cert.pem')
  ..usePrivateKey('path/to/my_key.pem', password: 'key_password')
  ..setClientAuthorities('path/to/client.crt', password: 'password');
client.secure = true;
client.securityContext = context;

Abonnieren

Fügen Sie den folgenden Code hinzu.

client.onSubscribed = onSubscribed;

const topic="topic/test";
print('Subscribing to the $topic topic');
client.subscribe(topic, MqttQos.atMostOnce);
client.updates!.listen((List<MqttReceivedMessage<MqttMessage?>>? c) {
  final recMess = c![0].payload as MqttPublishMessage;
  final pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
  print('Received message: topic is ${c[0].topic}, payload is $pt');
});

/// The subscribed callback
void onSubscribed(String topic) {
  print('Subscription confirmed for topic $topic');
}

Dann ausführen

$ dart run bin/mqtt_demo.dart

Wir sehen, dass wir die erfolgreich abonniert haben MQTT-Thema.

Abonnieren Sie das MQTT-Thema

Nachricht veröffentlichen

client.published!.listen((MqttPublishMessage message) {
  print('Published topic: topic is ${message.variableHeader!.topicName}, with Qos ${message.header!.qos}');
});

const pubTopic="test/topic";
final builder = MqttClientPayloadBuilder();
builder.addString('Hello from mqtt_client');

print('Subscribing to the $pubTopic topic');
client.subscribe(pubTopic, MqttQos.exactlyOnce);

print('Publishing our topic');
client.publishMessage(pubTopic, MqttQos.exactlyOnce, builder.payload!);

Wir sehen, dass die Nachricht erfolgreich veröffentlicht wurde, und wir erhalten sie.

Veröffentlichen Sie MQTT-Nachrichten

Komplette Prüfung

Wir verwenden den folgenden Code für den vollständigen Test.

import 'dart:async';
import 'dart:io';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:mqtt_client/mqtt_server_client.dart';

final client = MqttServerClient('broker-cn.emqx.io', '1883');

Future<int> main() async {
  client.logging(on: false);
  client.keepAlivePeriod = 60;
  client.onDisconnected = onDisconnected;
  client.onConnected = onConnected;
  client.onSubscribed = onSubscribed;
  client.pongCallback = pong;

  final connMess = MqttConnectMessage()
      .withClientIdentifier('dart_client')
      .withWillTopic('willtopic') 
      .withWillMessage('My Will message')
      .startClean() 
      .withWillQos(MqttQos.atLeastOnce);
  print('Client connecting....');
  client.connectionMessage = connMess;

  try {
    await client.connect();
  } on NoConnectionException catch (e) {
    print('Client exception: $e');
    client.disconnect();
  } on SocketException catch (e) {
    print('Socket exception: $e');
    client.disconnect();
  }

  if (client.connectionStatus!.state == MqttConnectionState.connected) {
    print('Client connected');
  } else {
    print('Client connection failed - disconnecting, status is ${client.connectionStatus}');
    client.disconnect();
    exit(-1);
  }

  const subTopic="topic/sub_test";
  print('Subscribing to the $subTopic topic');
  client.subscribe(subTopic, MqttQos.atMostOnce);
  client.updates!.listen((List<MqttReceivedMessage<MqttMessage?>>? c) {
    final recMess = c![0].payload as MqttPublishMessage;
    final pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);
    print('Received message: topic is ${c[0].topic}, payload is $pt');
  });

  client.published!.listen((MqttPublishMessage message) {
    print('Published topic: topic is ${message.variableHeader!.topicName}, with Qos ${message.header!.qos}');
  });

  const pubTopic="topic/pub_test";
  final builder = MqttClientPayloadBuilder();
  builder.addString('Hello from mqtt_client');

  print('Subscribing to the $pubTopic topic');
  client.subscribe(pubTopic, MqttQos.exactlyOnce);

  print('Publishing our topic');
  client.publishMessage(pubTopic, MqttQos.exactlyOnce, builder.payload!);

  print('Sleeping....');
  await MqttUtilities.asyncSleep(80);

  print('Unsubscribing');
  client.unsubscribe(subTopic);
  client.unsubscribe(pubTopic);

  await MqttUtilities.asyncSleep(2);
  print('Disconnecting');
  client.disconnect();

  return 0;
}

/// The subscribed callback
void onSubscribed(String topic) {
  print('Subscription confirmed for topic $topic');
}

/// The unsolicited disconnect callback
void onDisconnected() {
  print('OnDisconnected client callback - Client disconnection');
  if (client.connectionStatus!.disconnectionOrigin ==
      MqttDisconnectionOrigin.solicited) {
    print('OnDisconnected callback is solicited, this is correct');
  }
  exit(-1);
}

/// The successful connect callback
void onConnected() {
  print('OnConnected client callback - Client connection was sucessful');
}

/// Pong callback
void pong() {
  print('Ping response client callback invoked');
}

Konsolenausgabe.

Dart MQTT-Test

Zusammenfassung

An diesem Punkt haben wir die Verbindung zum abgeschlossen öffentlicher MQTT-Server unter Verwendung der mqtt_client-Bibliothek in Dart und implementierte die Verbindung, die Nachrichtenveröffentlichung, das Abonnement und den Test zwischen Client und MQTT-Server.

Als nächstes können die Leser auschecken Der leicht verständliche Leitfaden zum MQTT-Protokoll eine Reihe von Artikeln, die von EMQ bereitgestellt werden, um mehr über die Funktionen des MQTT-Protokolls zu erfahren, fortgeschrittenere Anwendungen von MQTT zu erkunden und mit der Entwicklung von MQTT-Anwendungen und -Diensten zu beginnen.

Ursprünglich erschienen bei https://www.emqx.com.

Similar Posts

Leave a Reply

Your email address will not be published. Required fields are marked *