Flutter MQTT服务插件pip_services3_mqtt的使用

Flutter MQTT服务插件pip_services3_mqtt的使用

Pip.Services Logo

MQTT消息传递服务插件(Dart)

此模块是Pip.Services多语言微服务工具包的一部分。

该MQTT模块包含一组用于使用Mqtt协议进行消息传递的组件。其中包括实现与消息交互的组件:MqttMessageQueueMqttConnectionResolver

该模块包含以下包:

  • Build - 工厂默认实现
  • Connect - 设置连接到MQTT代理的组件
  • Queues - 使用MQTT协议通过消息队列工作的组件

快速链接:


使用

在项目的pubspec.yaml文件中添加以下依赖项:

dependencies:
  pip_services3_mqtt: ^版本号

然后从命令行安装包:

pub get

开发

对于开发,你需要安装以下前提条件:

  • Dart SDK 2
  • Visual Studio Code 或其他你选择的IDE
  • Docker

安装依赖项:

pub get

运行自动化测试:

pub run test

生成API文档:

./docgen.ps1

在提交更改之前,可以使用Docker化构建和测试:

./build.ps1
./test.ps1
./clear.ps1

联系方式

Dart版本的Pip.Services由以下人员创建和维护:

  • Sergey Seroukhov
  • Levichev Dmitry

文档由以下人员编写:

  • Levichev Dmitry

示例代码

example/main.dart

import 'dart:async';
import 'dart:io';
import 'package:pip_services3_commons/pip_services3_commons.dart';
import 'package:pip_services3_messaging/pip_services3_messaging.dart';
import 'package:pip_services3_mqtt/pip_services3_mqtt.dart';

// 定义接收消息的接口实现
class TestMessageReciver implements IMessageReceiver {
  MessageEnvelope? message;

  // 接收消息的异步回调方法
  [@override](/user/override)
  Future receiveMessage(MessageEnvelope envelope, IMessageQueue queue) async {
    message = envelope;
    return null;
  }
}

void main() async {
  late MqttMessageQueue queue;

  // 获取环境变量或设置默认值
  var brokerHost = Platform.environment['MQTT_SERVICE_HOST'] ?? 'localhost';
  var brokerPort = Platform.environment['MQTT_SERVICE_PORT'] ?? 1883;
  var brokerTopic = Platform.environment['MOSQUITTO_TOPIC'] ?? '/test';

  // 如果主机或端口为空,则退出
  if (brokerHost.isEmpty && brokerPort.isEmpty) {
    return;
  }

  // 配置MQTT消息队列
  var queueConfig = ConfigParams.fromTuples([
    'connection.protocol',
    'mqtt',
    'connection.host',
    brokerHost,
    'connection.port',
    brokerPort,
    'topic',
    brokerTopic
  ]);

  queue = MqttMessageQueue();
  queue.configure(queueConfig);

  // 打开队列并清空消息
  await queue.open(null);
  await queue.clear(null);

  // 同步通信示例
  var envelope1 = MessageEnvelope('123', brokerTopic, 'Test message');
  MessageEnvelope? envelope2;

  // 发送消息
  await queue.send(null, envelope1);

  // 检查消息数量
  var count = await queue.readMessageCount(); // count = 1

  // 接收消息
  envelope2 = await queue.receive(null, 10000); 
  // envelope2.message = envelope1.message

  //====================================================================
  // 异步通信示例
  var reciver = TestMessageReciver();
  queue.beginListen(null, reciver);

  // 等待消息接收
  await Future.delayed(Duration(milliseconds: 1000), () {});

  // 发送消息
  await queue.send(null, envelope1);

  // 等待接收完成
  await Future.delayed(Duration(milliseconds: 1000), () {});

  // 读取消息
  envelope2 = reciver.message; 
  // envelope1.message = envelope2.message

  // 停止监听
  queue.endListen(null);

  // 关闭队列
  await queue.close(null);
}

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

1 回复

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


pip_services3_mqtt 是一个用于在 Flutter 应用程序中使用 MQTT 协议的插件。MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息传输协议,广泛应用于物联网(IoT)和低带宽、不稳定网络环境中的通信。

以下是如何在 Flutter 项目中使用 pip_services3_mqtt 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 pip_services3_mqtt 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  pip_services3_mqtt: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 以获取依赖。

2. 导入包

在你的 Dart 文件中导入 pip_services3_mqtt 包:

import 'package:pip_services3_mqtt/pip_services3_mqtt.dart';

3. 创建 MQTT 客户端

你可以创建一个 MQTT 客户端来连接 MQTT 代理并发布/订阅消息。

void main() async {
  // 创建 MQTT 客户端
  var mqttClient = MqttClient();

  // 配置 MQTT 客户端
  mqttClient.configure(ConfigParams.fromTuples([
    'connection.protocol', 'mqtt',
    'connection.host', 'localhost',
    'connection.port', 1883,
    'credential.username', 'user',
    'credential.password', 'password',
  ]));

  // 打开连接
  await mqttClient.open(null);

  // 订阅主题
  mqttClient.subscribe('test/topic', (message) {
    print('Received message: $message');
  });

  // 发布消息
  mqttClient.publish('test/topic', 'Hello, MQTT!');

  // 关闭连接(可选)
  await mqttClient.close(null);
}

4. 配置 MQTT 客户端

MqttClient 可以通过 ConfigParams 进行配置,常见的配置参数包括:

  • connection.protocol: 连接协议,通常是 mqttmqtts(带有 SSL/TLS 的 MQTT)。
  • connection.host: MQTT 代理的主机名或 IP 地址。
  • connection.port: MQTT 代理的端口号,默认是 1883(MQTT)或 8883(MQTTS)。
  • credential.username: 连接 MQTT 代理的用户名(可选)。
  • credential.password: 连接 MQTT 代理的密码(可选)。

5. 发布和订阅消息

  • 订阅消息: 使用 subscribe 方法订阅一个主题,并提供一个回调函数来处理接收到的消息。
  • 发布消息: 使用 publish 方法向指定的主题发布消息。

6. 打开和关闭连接

  • 打开连接: 使用 open 方法打开与 MQTT 代理的连接。
  • 关闭连接: 使用 close 方法关闭与 MQTT 代理的连接。

7. 处理错误

在实际应用中,你可能需要处理连接错误、消息发送失败等情况。你可以在 openpublish 等方法中使用 try-catch 块来捕获和处理异常。

try {
  await mqttClient.open(null);
} catch (e) {
  print('Failed to connect to MQTT broker: $e');
}

8. 完整示例

以下是一个完整的示例,展示了如何使用 pip_services3_mqtt 插件在 Flutter 中进行 MQTT 通信:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: MqttExample(),
    );
  }
}

class MqttExample extends StatefulWidget {
  [@override](/user/override)
  _MqttExampleState createState() => _MqttExampleState();
}

class _MqttExampleState extends State<MqttExample> {
  var mqttClient = MqttClient();
  List<String> messages = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    connectToMqtt();
  }

  void connectToMqtt() async {
    mqttClient.configure(ConfigParams.fromTuples([
      'connection.protocol', 'mqtt',
      'connection.host', 'localhost',
      'connection.port', 1883,
      'credential.username', 'user',
      'credential.password', 'password',
    ]));

    try {
      await mqttClient.open(null);
      mqttClient.subscribe('test/topic', (message) {
        setState(() {
          messages.add(message);
        });
      });
      mqttClient.publish('test/topic', 'Hello, MQTT!');
    } catch (e) {
      print('Failed to connect to MQTT broker: $e');
    }
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('MQTT Example'),
      ),
      body: ListView.builder(
        itemCount: messages.length,
        itemBuilder: (context, index) {
          return ListTile(
            title: Text(messages[index]),
          );
        },
      ),
    );
  }

  [@override](/user/override)
  void dispose() {
    mqttClient.close(null);
    super.dispose();
  }
}
回到顶部