在 Flutter 項目中使用 MQTT

Flutter 是 Google 推出並開源的移動應用開發框架,主打跨平臺、高保真、高性能。開發者能夠經過 Dart 語言開發 App,一套代碼同時運行在 iOS 和 Android 平臺。 Flutter 提供了豐富的組件、接口,開發者能夠快速地爲 Flutter 添加 native 擴展。同時 Flutter 還使用 Native 引擎渲染視圖,這無疑能爲用戶提供良好的體驗。android

MQTT 是一種基於發佈/訂閱模式的輕量級物聯網消息傳輸協議 ,可在嚴重受限的硬件設備和低帶寬、高延遲的網絡上實現穩定傳輸。它憑藉簡單易實現、支持 QoS、報文小等特色,佔據了物聯網協議的半壁江山。android-studio

本文主要介紹如何在 Flutter 項目中使用 MQTT,實現客戶端與 MQTT 服務器的鏈接、訂閱、取消訂閱、收發消息等功能。bash

項目初始化

新建項目

新建一個項目,能夠參考如下連接:服務器

安裝依賴

添加依賴到 pubspec.yaml 文件中網絡

dependencies: 
  mqtt_client: ^7.2.1

安裝依賴:app

flutter pub get

導入框架

import 'package:mqtt_client/mqtt_client.dart';

MQTT 的使用

鏈接 MQTT 服務器

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

  • 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:設置鏈接選項,包含超時設置,認證以及遺願消息等。async

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...

相關文章
相關標籤/搜索