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 進行以下測試:
-
連接
-
訂閱
-
發布
-
取消訂閱
-
斷開連接
應用界面:
使用 MQTTX 作為另一個客戶端進行消息收發:
我們可以看到整個過程的日志。
總結
至此,我們完成了在 Android 平台上利用 Flutter 構建 MQTT 應用,實現了客戶端與 MQTT 服務器的連接、訂閱、取消訂閱、收發消息等功能。
Flutter 通過統一的開發語言和跨平台特性讓開發強大的移動應用變得十分容易,它將來可能會是開發移動應用的最佳解決方案。結合 Flutter、MQTT 協議及 MQTT 雲服務,我們可以開發更多有趣的應用。
版權聲明: 本文為 EMQ 原創,轉載請注明出處。