Flutter MQTT通信插件kinnow_mqtt的使用

Flutter MQTT通信插件kinnow_mqtt的使用

1. 生命周期管理

Kinnow Mqtt客户端会自动重试连接如果连接失败。如果连接断开后重新连接成功,它也会自动进行重连。生命周期将在后续部分详细解释。

2. 详细的洞察

Kinnow Mqtt客户端函数将返回任何相应的确认数据包。例如,调用subscribe将返回由代理发送的SubAck数据包。对于publishQos1调用,将返回PubAck。对于没有调用触发的事件(如ping请求和响应),提供了一个事件流。

3. 适用于不可靠网络

该库旨在处理不可靠网络。客户端确保操作完成,无论连接状态如何。这意味着用户在开始任何操作之前不需要监控连接状态。

客户端生命周期

客户端生命周期

名称来源

Kinnow(发音为kee-noo)是一种在巴基斯坦和印度种植的水果。它与橙子非常相似,但口感稍微不那么酸,果肉更多。

贡献

项目仍处于初期阶段,需要您的帮助!如果您遇到任何问题,请务必报告。如果您有任何功能请求,请在问题中提及。

路线图

  1. 添加对Websockets的支持。
  2. Mqtt消息存储(正在开发中)。
  3. 实现认证数据包。
  4. 处理服务器发起的断开连接。

使用示例

import 'package:kinnow_mqtt/kinnow_mqtt.dart';

void main() async {
  // 创建一个MQTT客户端实例
  final client = KinnowMqttClient(
    TcpMqttNetworkConnection("your.brokers.address.here.com", 1883)
  );

  // 设置连接参数
  final connPkt = ConnectPacket(
    cleanStart: true,
    lastWill: null,
    keepAliveSeconds: 60,
    username: null,
    password: null,
  );

  // 开始连接并监听事件流
  final eventStream = client.begin(connPkt);
  eventStream.listen((event) => print(event.runtimeType));

  // 发布QoS 0的消息
  await client.publishQos0(TxPublishPacket(
    false,
    "kinnowTestTopic",
    StringOrBytes.fromString("A QoS 0 message"),
  ));

  // 发布QoS 1的消息
  final puback = await client.publishQos1(TxPublishPacket(
    false,
    "kinnowTestTopic",
    StringOrBytes.fromString("A QoS1 message"),
  ));

  if (puback != null) {
    print("puback received");
  }

  // 发布QoS 2的消息
  final qos2res = await client.publishQos2(TxPublishPacket(
    false,
    "kinnowTestTopic",
    StringOrBytes.fromString("A QoS2 message"),
  ));

  if (qos2res != null) {
    print("pubrec and pubcomp received");
  }

  // 订阅主题
  final suback = await client.subscribe(SubscribePacket([
    TopicSubscription("KinnowSubTopic1", MqttQos.atMostOnce),
    TopicSubscription("KinnowSubTopic2", MqttQos.atLeastOnce),
    TopicSubscription("KinnowSubTopic3", MqttQos.exactlyOnce),
  ]));

  if (suback != null) {
    print("suback received");

    int idx = 0;
    for (final reason in suback.reasonCodes) {
      print("topic $idx success ${reason.name}");
      idx++;
    }
  }

  // 监听接收到的消息
  client.receivedMessagesStream.listen(
    (event) => print("Packet Received \n \t topic: ${event.topic},\n \t qos: ${event.qos},\n \t payload: ${event.payload.asString}"),
  );

  // 等待15秒后断开连接
  await Future.delayed(const Duration(seconds: 15));
  client.disconnect();
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用kinnow_mqtt插件来实现MQTT通信的代码示例。这个示例将展示如何连接到MQTT代理、订阅主题和发布消息。

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

dependencies:
  flutter:
    sdk: flutter
  kinnow_mqtt: ^latest_version  # 替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来是示例代码:

import 'package:flutter/material.dart';
import 'package:kinnow_mqtt/kinnow_mqtt.dart';

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late MqttClient _client;
  String _clientId = 'flutterClient';
  String _broker = 'mqtt.eclipse.org'; // 公共MQTT代理地址
  int _port = 1883; // MQTT默认端口
  String _topic = 'test/topic';
  String _message = 'Hello MQTT';

  @override
  void initState() {
    super.initState();
    connect();
  }

  Future<void> connect() async {
    _client = MqttClient(_broker, _port, _clientId);
    _client.keepAliveInterval = 60;
    _client.logging(on: true);

    final MqttConnectOptions connOpts = MqttConnectOptions.builder()
        .clientIdentifier(_clientId)
        .cleanSession(true)
        .keepAliveInterval(60)
        .automaticReconnect(true)
        .withWillTopic(_topic)
        .withWillMessage('Client has disconnected unexpectedly')
        .withWillQos(MqttQos.atLeastOnce);

    try {
      await _client.connect(connOpts).then((_) {
        print('Connected');
        _client.updates!.listen((List<MqttReceivedMessage<MqttMessage>> c) {
          final MqttPublishMessage receivedMessage =
              c[0].payload as MqttPublishMessage;
          final MqttMessage receivedPayload = receivedMessage.payload;
          final String pt =
              MqttPublishPayload.bytesToStringAsString(receivedPayload.message,
                  encoding: MqttPayloadFormat.UTF8);
          print('Message received: topic is <${c[0].topic}>, payload is <-- $pt -->');
        });

        subscribe();
      }).catchError((e) {
        print('Exception has been thrown: $e');
        _client.disconnect();
      });
    } catch (e) {
      print('Exception has been thrown: $e');
      _client.disconnect();
    }
  }

  Future<void> subscribe() async {
    try {
      await _client.subscribe(_topic, MqttQos.atLeastOnce);
      print('Subscribed to topic: $_topic');
    } catch (e) {
      print('Exception has been thrown: $e');
    }
  }

  Future<void> publish() async {
    MqttMessageBuilder builder = MqttMessageBuilder();
    builder.addString(_message);
    MqttMessage message = builder.toMessage();
    MqttPublishMessage pubMsg = MqttPublishMessage.builder()
        .topic(_topic)
        .qos(MqttQos.atLeastOnce)
        .payload(message);

    _client.publishMessage(pubMsg);
    print('Message published');
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter MQTT Demo'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              ElevatedButton(
                onPressed: () {
                  publish();
                },
                child: Text('Publish Message'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    // 清理MQTT客户端连接
    if (_client.isConnected()) {
      _client.disconnect();
    }
    super.dispose();
  }
}

这个示例代码做了以下几件事情:

  1. 连接到MQTT代理:使用MqttClient类连接到MQTT代理(在这个例子中是mqtt.eclipse.org)。
  2. 订阅主题:在成功连接到MQTT代理后,订阅一个主题(test/topic)。
  3. 发布消息:通过点击按钮发布消息到订阅的主题。
  4. 监听消息:监听并打印从MQTT代理接收到的消息。

请注意,kinnow_mqtt插件的具体API可能会有所变化,因此建议查阅最新的kinnow_mqtt文档(如果可用)以获取最新的使用信息和API参考。

此外,由于公共MQTT代理可能有连接限制,如果你在生产环境中使用MQTT,建议搭建自己的MQTT代理服务器。

回到顶部