在 Flutter 專案中使用 MQTT

EMQX發表於2020-07-21

Flutter 是 Google 推出並開源的移動應用開發框架,主打跨平臺、高保真、高效能。開發者可以通過 Dart 語言開發 App,一套程式碼同時執行在 iOS 和 Android 平臺。 Flutter 提供了豐富的元件、介面,開發者可以快速地為 Flutter 新增 native 擴充套件。同時 Flutter 還使用 Native 引擎渲染檢視,這無疑能為使用者提供良好的體驗。

MQTT 是一種基於釋出/訂閱模式的輕量級物聯網訊息傳輸協議 ,可在嚴重受限的硬體裝置和低頻寬、高延遲的網路上實現穩定傳輸。它憑藉簡單易實現、支援 QoS、報文小等特點,佔據了物聯網協議的半壁江山。

本文主要介紹如何在 Flutter 專案中使用 MQTT,實現客戶端與 MQTT 伺服器的連線、訂閱、取消訂閱、收發訊息等功能。

專案初始化

新建專案

新建一個專案,可以參考以下連結:

安裝依賴

新增依賴到 pubspec.yaml 檔案中

dependencies: 
  mqtt_client: ^7.2.1

安裝依賴:

flutter pub get

匯入

import 'package:mqtt_client/mqtt_client.dart';

MQTT 的使用

連線 MQTT 伺服器

本文將使用 EMQ X 提供的 免費公共 MQTT 伺服器,該服務基於 EMQ X 的 MQTT 物聯網雲平臺 建立。伺服器接入資訊如下:

  • Broker: broker.emqx.io
  • TCP Port: 1883
  • Websocket Port: 8083

連線示例程式碼

Future<MqttServerClient> connect() async {
  MqttServerClient client =
      MqttServerClient.withPort('broker.emqx.io', 'flutter_client', 1883);
  client.logging(on: true);
  client.onConnected = onConnected;
  client.onDisconnected = onDisconnected;
  client.onUnsubscribed = onUnsubscribed;
  client.onSubscribed = onSubscribed;
  client.onSubscribeFail = onSubscribeFail;
  client.pongCallback = pong;

  final connMessage = MqttConnectMessage()
      .authenticateAs('username', 'password')
      .keepAliveFor(60)
      .withWillTopic('willtopic')
      .withWillMessage('Will message')
      .startClean()
      .withWillQos(MqttQos.atLeastOnce);
  client.connectionMessage = connMessage;
  try {
    await client.connect();
  } catch (e) {
    print('Exception: $e');
    client.disconnect();
  }

  client.updates.listen((List<MqttReceivedMessage<MqttMessage>> c) {
    final MqttPublishMessage message = c[0].payload;
    final payload =
    MqttPublishPayload.bytesToStringAsString(message.payload.message);

    print('Received message:$payload from topic: ${c[0].topic}>');
  });

  return client;
}

回撥方法說明

// 連線成功
void onConnected() {
  print('Connected');
}

// 連線斷開
void onDisconnected() {
  print('Disconnected');
}

// 訂閱主題成功
void onSubscribed(String topic) {
  print('Subscribed topic: $topic');
}

// 訂閱主題失敗
void onSubscribeFail(String topic) {
  print('Failed to subscribe $topic');
}

// 成功取消訂閱
void onUnsubscribed(String topic) {
  print('Unsubscribed topic: $topic');
}

// 收到 PING 響應
void pong() {
  print('Ping response client callback invoked');
}

MqttConnectMessage:設定連線選項,包含超時設定,認證以及遺願訊息等。

client.updates.listen:用於監聽已訂閱主題的訊息到達。

證書連線示例

/// 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;

其他 MQTT 操作

主題訂閱

client.subscribe("topic/test", MqttQos.atLeastOnce)

訊息釋出

const pubTopic = 'topic/test';
final builder = MqttClientPayloadBuilder();
builder.addString('Hello MQTT');
client.publishMessage(pubTopic, MqttQos.atLeastOnce, builder.payload);

取消訂閱

client.unsubscribe('topic/test');

斷開連線

client.disconnect();

測試

我們給該專案編寫了一個簡單的 UI 介面,並配合 MQTT 5.0 客戶端工具 - MQTT X 進行以下測試:

  • 連線
  • 訂閱
  • 釋出
  • 取消訂閱
  • 斷開連線

應用介面:

device.png

使用 MQTTX 作為另一個客戶端進行訊息收發:

mqttx_flutter.png

我們可以看到整個過程的日誌。

log.png

總結

至此,我們完成了在 Android 平臺上利用 Flutter 構建 MQTT 應用,實現了客戶端與 MQTT 伺服器的連線、訂閱、取消訂閱、收發訊息等功能。

Flutter 通過統一的開發語言和跨平臺特性讓開發強大的移動應用變得十分容易,它將來可能會是開發移動應用的最佳解決方案。結合 Flutter、MQTT 協議及 MQTT 雲服務,我們可以開發更多有趣的應用。

版權宣告: 本文為 EMQ 原創,轉載請註明出處。

原文連結:https://www.emqx.io/cn/blog/u...

相關文章