Flutter MQTT通信(实现聊天功能)

MQTT协议简介:

MQTT(Message Queuing Telemetry Transport)是一种轻量级的、开放的、基于发布/订阅模式的消息传输协议,最初由IBM开发。它专门设计用于在低带宽、不稳定的网络环境下进行高效的消息传输。

学习完本篇文章,带你一起做个简单的聊天功能。

一.MQTT基础功能

1.发布/订阅模式:

MQTT采用发布/订阅模式,其中消息发布者称为发布者(Publisher),消息订阅者称为订阅者(Subscriber)。发布者将消息发布到一个或多个主题(Topic),而订阅者则订阅感兴趣的主题,以接收相关的消息。

2.主题(Topic):

主题是消息的标识符,用于将消息分类和路由到感兴趣的订阅者。主题通常采用层级结构,类似于文件系统的路径,例如 sensors/temperature/room1。订阅者可以使用通配符来订阅多个主题,例如 sensors/temperature/# 表示订阅所有以 sensors/temperature/ 开头的主题。

3.QoS(服务质量):

MQTT支持三种不同级别的服务质量(QoS):

QoS 0:最多一次传输。消息发送者将消息发送一次,不进行确认,可能丢失消息。
QoS 1:至少一次传输。消息发送者将消息发送,并等待接收到消息的确认,如果未收到确认,将重新发送消息。
QoS 2:恰好一次传输。消息发送者和接收者进行握手,并确保消息只被传输一次。

4.保留消息:

MQTT支持保留消息,发布者可以发布保留消息到一个主题,并且该消息将保留在服务器上,直到被覆盖或被新的保留消息替换。订阅者可以在订阅主题时接收到最新的保留消息。

5.遗嘱消息:

发布者可以在建立连接时设置遗嘱消息,当连接意外断开时,服务器将自动发布遗嘱消息到指定的主题。

6.连接选项:

MQTT连接可以设置各种选项,包括保持连接、清除会话、用户名和密码认证等。

二.MQTT原理

在这里插入图片描述

1.执行流程

一个设备向一个 “test” 主题发送数据,每个订阅 “test” 主题的设备,就能接收到来自 “test” 主题的信息。

2.默认服务器地址(test.mosquitto.org)

test.mosquitto.org是一个常用的公共MQTT代理,用于测试和学习MQTT协议。您可以使用该地址作为MQTT客户端连接的服务器地址。默认的MQTT端口号是1883(未加密)和8883(加密)。请注意,这是一个公共测试服务器,可能会受到流量限制或服务不稳定的影响。

3.工具的使用

https://mqttx.app/downloads
在这里插入图片描述

三.代码实现

1.添加版本库

dependencies:
  mqtt_client: ^10.2.0

2.创建连接

final client =MqttServerClient('test.mosquitto.org', '');
  • 第一个参数:MQTT 代理的主机名或 IP 地址。
  • 第二个参数:客户端标识符,客户端标识符是在 MQTT 协议中用于唯一标识客户端的字符串。它用于在 MQTT代理中标识和跟踪客户端的连接。通常情况下,客户端标识符是必需的,并且必须在所有连接的客户端中是唯一的。如果两个客户端使用相同的客户端标识符连接到同一个 MQTT 代理,会出现重复连接的情况。在 MQTT协议中,当一个客户端使用相同的客户端标识符连接到代理时,代理会断开之前的连接并接受新的连接。因此,旧的连接将会被挤下线,而新的连接将会取而代之。

2.订阅主题

client.subscribe('your_topic', MqttQos.atLeastOnce);
  • 第一个参数:订阅主题的名称,订阅了主题就能监听到消息。
  • 第二个参数 : 消息类型

消息类型如下:

  • MqttQos.atMostOnce:
    表示最多一次传递。消息被发布后,不进行确认,消息可能会丢失或重复传递,适用于对消息的可靠性要求不高的场景。

  • MqttQos.atLeastOnce:
    表示至少一次传递。消息被发布后,会确保至少传递一次给订阅者,并进行确认。如果订阅者没有确认收到消息,会进行重试,直到确认为止,适用于对消息的可靠性要求较高的场景。

  • MqttQos.exactlyOnce:
    表示仅一次传递。消息被发布后,确保只传递一次给订阅者,并进行确认。通过使用消息的标识符和重传机制来确保消息不会丢失,也不会重复传递,适用于对消息的可靠性要求非常高的场景。

3.发送消息

    final MqttClientPayloadBuilder builder = MqttClientPayloadBuilder();
    builder.addUTF8String('发送的数据');

    _client!.publishMessage('订阅的主题', MqttQos.atMostOnce, builder.payload!);

4.消息监听

    _client!.updates!.listen((List<MqttReceivedMessage<MqttMessage?>>? c) {
      final MqttReceivedMessage recMess = c![0];
      final MqttPublishMessage pubMess = recMess.payload as MqttPublishMessage;
      String topic = recMess.topic;
      String pts = const Utf8Decoder().convert(pubMess.payload.message);
      print('MQTT消息监听 topic=$topic pts=$pts');
    });

三.实现一个demo

1.页面部分

主要分为三个页面:登录页,消息页,好友页。

登录之后在好友页,选择添加好友,之后打开聊天页面,就可以聊天了。

在这里插入图片描述

在这里插入图片描述

2.代码部分

代码主要分为数据库模块和消息通讯模块,项目结构如下:

在这里插入图片描述
具体代码实现:https://github.com/LionJackson/flutter_mqtt

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值