Flutter MQTT协议通信插件mqtt5_client的使用

Flutter MQTT协议通信插件mqtt5_client的使用

简介

mqtt5_client 是一个用于Dart的MQTT Version 5客户端库,支持服务器和浏览器环境。它实现了MQTT Version 5协议的所有功能,包括订阅/发布消息、认证、心跳保持等。该库旨在尽可能地简化MQTT协议的使用,使得用户可以专注于消息的发布与订阅,而无需深入了解MQTT协议的具体细节。

Build Status

功能特点

  • 支持所有QoS级别(Quality of Service)的订阅和发布。
  • 支持认证机制。
  • 自动处理连接协议和心跳保持机制。
  • 支持TCP和WebSocket连接(包括安全和非安全连接)。
  • 支持完整的MQTT Version 5消息集,包括用户属性设置和接收,以及通过认证消息进行认证。

注意事项

尽管mqtt5_client已经实现了MQTT Version 5的大部分功能,但仍有部分功能尚未完全实现:

  • 连接确认消息中的参数(如最大接收量和主题别名最大值)未完全执行。
  • 订阅标识符和共享订阅不完全支持。
  • 不支持服务器重定向。
  • 原因代码仅用于协议支持,虽然接收到的原因代码会提供给用户,但客户端不一定采取行动。
  • 流控制尚未完全支持。

如果有特定的未支持功能需求,请在GitHub上提出issue。

示例代码

以下是一个简单的示例,展示了如何使用mqtt5_client进行MQTT通信:

安装

首先,在pubspec.yaml文件中添加依赖:

dependencies:
  mqtt5_client: ^2.0.0

然后运行flutter pub get来安装包。

示例代码

import 'package:mqtt5_client/mqtt5_client.dart';
import 'package:mqtt5_client/mqtt5_server_client.dart';

void main() async {
  // 创建MQTT客户端实例
  final client = MqttServerClient('broker.hivemq.com', '');

  // 设置连接信息
  client.port = 1883;
  client.logging(on: true);

  /// 设置连接回调函数
  client.onConnected = onConnected;
  client.onDisconnected = onDisconnected;
  client.onSubscribed = onSubscribed;
  client.pongCallback = pong;

  /// 添加认证信息(如果需要)
  // client.setProtocolV5();
  // client.connectMessage?.authenticateAs('username', 'password');

  /// 连接到MQTT代理
  try {
    print('EXAMPLE::Mosquitto client connecting....');
    await client.connect();
  } catch (e) {
    print('EXAMPLE::client exception - $e');
    client.disconnect();
  }

  /// 检查是否成功连接
  if (client.connectionStatus!.state == MqttConnectionState.connected) {
    print('EXAMPLE::Mosquitto client connected');
  } else {
    print('EXAMPLE::ERROR Mosquitto client connection failed - '
        'disconnecting, status is ${client.connectionStatus}');
    client.disconnect();
    exit(-1);
  }

  /// 发布消息
  final builder = MqttClientPayloadBuilder();
  builder.addString('Hello MQTT World!');
  client.publishMessage('dart/mqtt_topic', MqttQos.atMostOnce, builder.payload!);

  /// 订阅主题
  const topic = 'dart/mqtt_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(
        'EXAMPLE::Change notification:: topic is <${c[0].topic}>, payload is <-- $pt -->');
    print('');
  });

  /// 断开连接
  // client.disconnect();
}

/// 连接成功的回调函数
void onConnected() {
  print('EXAMPLE::Connected');
}

/// 断开连接的回调函数
void onDisconnected() {
  print('EXAMPLE::Disconnected');
}

/// 订阅成功的回调函数
void onSubscribed(String topic) {
  print('EXAMPLE::Subscription confirmed for topic $topic');
}

/// 心跳响应的回调函数
void pong() {
  print('EXAMPLE::Ping response client callback invoked');
}

运行结果

此代码将连接到MQTT代理broker.hivemq.com,发布一条消息并订阅一个主题。当有新的消息到达时,它将打印出消息的内容。

希望这个示例能帮助你理解如何在Flutter项目中使用mqtt5_client进行MQTT通信。如果你有任何问题或需要进一步的帮助,请随时提问!

1 回复

更多关于Flutter MQTT协议通信插件mqtt5_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个使用 mqtt5_client 插件在 Flutter 中实现 MQTT 协议通信的示例代码。这个示例展示了如何连接到 MQTT 服务器、订阅主题、发布消息以及处理连接状态变化。

首先,确保你已经在 pubspec.yaml 文件中添加了 mqtt5_client 依赖:

dependencies:
  flutter:
    sdk: flutter
  mqtt5_client: ^x.y.z  # 请使用最新版本号

然后,你可以按照以下步骤在你的 Flutter 应用中实现 MQTT 通信。

1. 导入必要的包

import 'package:flutter/material.dart';
import 'package:mqtt5_client/mqtt5_client.dart';
import 'dart:async';

2. 创建 MQTT 客户端配置

class MqttClientConfig {
  final String broker;
  final String clientId;
  final int port;
  final String username;
  final String password;

  MqttClientConfig({
    required this.broker,
    required this.clientId,
    this.port = 1883,
    this.username = '',
    this.password = '',
  });
}

3. 创建 MQTT 客户端并管理连接

class MqttService {
  late Mqtt5Client client;
  late MqttClientConfig config;
  late MqttClientConnectionState connectionState;

  MqttService(MqttClientConfig config) {
    this.config = config;
    this.client = Mqtt5Client(config.broker, config.port, config.clientId);

    client.useWillTopic("clientDisconnect", MqttQos.atLeastOnce, false, "offline");
    client.setCleanStart(true);

    client.onConnected = this._onConnected;
    client.onDisconnected = this._onDisconnected;
    client.onSubscriptionGranted = this._onSubscriptionGranted;
    client.onMessageArrived = this._onMessageArrived;
    client.onConnectionLost = this._onConnectionLost;
  }

  Future<void> connect() async {
    try {
      final MqttConnectOptions connOpts = MqttConnectOptions.builder()
          .withClientId(config.clientId)
          .withCleanStart(true)
          .withAutomaticReconnect(true)
          .withCredentials(config.username, config.password)
          .build();
      await client.connect(connOpts).whenComplete(() {
        if (client.connectionState.isConnected) {
          print("Connected to broker: ${config.broker}:${config.port}");
        } else {
          print("Failed to connect to broker: ${config.broker}:${config.port}");
        }
      });
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> subscribe(String topic, MqttQos qos) async {
    try {
      await client.subscribe(topic, qos);
    } catch (e) {
      print(e.toString());
    }
  }

  Future<void> publish(String topic, String message, MqttQos qos) async {
    try {
      final MqttMessage mqttMessage = MqttMessage.builder()
          .withPayload(message)
          .withQos(qos)
          .build();
      await client.publish(topic, mqttMessage);
    } catch (e) {
      print(e.toString());
    }
  }

  void _onConnected() {
    connectionState = client.connectionState;
    print("Connected");
  }

  void _onDisconnected() {
    connectionState = client.connectionState;
    print("Disconnected");
  }

  void _onSubscriptionGranted(String topic, MqttQos qos) {
    print("Subscription granted for topic: $topic with QoS: $qos");
  }

  void _onMessageArrived(String topic, MqttMessage message) {
    print("Message arrived. Topic: $topic. Message: ${String.fromCharCodes(message.payloadAsBytes)}");
  }

  void _onConnectionLost(Throwable cause) {
    print("Connection lost! The cause is: $cause");
  }
}

4. 在 Flutter 组件中使用 MQTT 服务

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MqttHomePage(),
    );
  }
}

class MqttHomePage extends StatefulWidget {
  @override
  _MqttHomePageState createState() => _MqttHomePageState();
}

class _MqttHomePageState extends State<MqttHomePage> {
  late MqttService mqttService;

  @override
  void initState() {
    super.initState();
    final MqttClientConfig config = MqttClientConfig(
      broker: "your.mqtt.broker.address",
      clientId: "flutterClient",
      username: "yourUsername",
      password: "yourPassword",
    );
    mqttService = MqttService(config);
    mqttService.connect();
    mqttService.subscribe("test/topic", MqttQos.atLeastOnce);
    mqttService.publish("test/topic", "Hello MQTT!", MqttQos.atLeastOnce);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("MQTT Example"),
      ),
      body: Center(
        child: Text("Check console for MQTT logs"),
      ),
    );
  }
}

注意事项

  1. Broker 地址:确保 your.mqtt.broker.address 是有效的 MQTT 服务器地址。
  2. 用户认证:如果 MQTT 服务器需要用户名和密码,请确保正确配置 usernamepassword
  3. 调试:在控制台中查看日志输出,以确认连接状态、订阅和发布是否成功。

这个示例代码展示了如何使用 mqtt5_client 插件在 Flutter 应用中实现 MQTT 通信的基本功能。根据你的需求,你可以进一步扩展这个示例。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!