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';
本文將使用 EMQ X 提供的 免費公共 MQTT 服務器,該服務基於 EMQ X 的 MQTT 物聯網雲平臺 建立。服務器接入信息以下:socket
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;
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 進行如下測試:
應用界面:
使用 MQTTX 做爲另外一個客戶端進行消息收發:
咱們能夠看到整個過程的日誌。
至此,咱們完成了在 Android 平臺上利用 Flutter 構建 MQTT 應用,實現了客戶端與 MQTT 服務器的鏈接、訂閱、取消訂閱、收發消息等功能。
Flutter 經過統一的開發語言和跨平臺特性讓開發強大的移動應用變得十分容易,它未來可能會是開發移動應用的最佳解決方案。結合 Flutter、MQTT 協議及 MQTT 雲服務,咱們能夠開發更多有趣的應用。
版權聲明: 本文爲 EMQ 原創,轉載請註明出處。