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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/562445.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

探索通过GPT和云平台搭建网安实战培训环境

项目背景 网络安全是一个不断演变的领域&#xff0c;面临着日益复杂的挑战和不断扩大的威胁。数字化时代&#xff0c;随着勒索攻击、数据窃取、网络钓鱼等频频出现&#xff0c;网络攻击的威胁指数和影响范围进一步增加&#xff0c;如何防范网络攻击&#xff0c;确保数据安全&a…

网络初识

网络 局域网 一个区域的网 广域网 相对概念&#xff0c;没有绝对的界限&#xff0c;全世界现在最大的广域网&#xff0c;就教做TheInternet&#xff0c;万维网 路由器 交换机和路由器&#xff0c;都是用来组建网络的重要设备 交换机 上网的设备&#xff08;电脑/手…

Jupyter Notebook更改默认打开的浏览器和工作目录

Jupyter Notebook更改工作目录 打开cmd&#xff0c;输入&#xff1a;jupyter notebook --generate-config&#xff0c;可以得到Jupyter Notebook配置文件的路径&#xff0c;找到路径下的jupyter_notebook_config.py文件&#xff0c;用记事本或者Sublime打开文件 找到&#xff…

Linux下:gcc/g++调试工具gdb

gdb 程序的发布方式有两种&#xff0c;debug模式和release模式 Linux gcc/g出来的二进制程序&#xff0c;默认是release模式 gdb mybin debug和release debug debug模式下生成的可执行程序会添加调试信息&#xff0c;所以生成的可执行程序会较大 在使用gcc/g进行编译的时…

日期类的实现

目录 Date.h Test.cpp 测试代码Test.cpp 日期类的实现 代码分享 Date.h #pragma once #include<iostream> using namespace std; #include<assert.h>class Date {//友元函数声明friend ostream& operator<<(ostream& out, Date& d);friend…

LWIP开发之静态IP为什么接收和发送不了数据

使用的硬件开发板是探索者F4 V3版本 这里用的LWIP的lwIP例程7 lwIP_NETCONN_UDP实验 问了开发板的官方和其他人都说不清楚&#xff1b;搞了两天&#xff0c;浪费了两天时间&#xff1b; 最奇葩的问题还在于只能单片机发送&#xff0c;上位机能接收。而上位机发送单片机不能接…

国产信创办公软件(流版式软件)厂家汇总以及国产信创外设汇总

国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总以及国产信创外设汇总。 国产信创办公软件&#xff08;流版式软件&#xff09;厂家汇总 在信创背景下&#xff0c;国内流版式软件的发展呈现出蓬勃的态势。信创&#xff0c;即信息技术应用创新产业&#xff0c;旨在…

通过WSL在阿里云上部署Django项目MySQL

前端用Vue&#xff0c;后端用Django&#xff0c; nginx&#xff0c;Mysql 参照&#xff1a; 通过WSL在阿里云上部署Vue项目_阿里云 wsl-CSDN博客 阿里云重登录 采用Ubuntu系统&#xff0c; apt update #检查是否已经安装 mysql --version #检查是否已经安装mysql systemct…

List的介绍

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

MySQL慢查询怎么办?需要关注Explain的哪些关键字?

目录 1-引言&#xff1a;什么是慢查询1-1 慢查询定义1-2 为什么排查慢查询 2-核心&#xff1a;慢查询排查2-1 慢查询定位2-2 慢查询解决2-2-1 Explain 排查慢查询2-2-2 Explain 重点关键字 3-总结&#xff1a;慢查询知识点小结 1-引言&#xff1a;什么是慢查询 1-1 慢查询定义…

配置静态路由实现全网互通

1、实验环境 如图下所示&#xff0c;三台路由器R1&#xff0e;R2&#xff0c;R3两两互连&#xff0c;每台路由器上都配置了Loopback地址模拟网络环境。 2、需求描述 需要在三台路由器上配置静态路由&#xff0c;以实现各网段之间的互通。 若要实现全网互通,必须明确如下两个问…

kaggle 泰坦尼克使用xgboost 得分0.73684

流程 导入所要使用的包引入kaggle的数据集csv文件查看数据集有无空值填充这些空值提取特征分离训练集和测试集调用模型 导入需要的包 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarni…

Hive基础5

一、窗口函数 聚合&#xff0c;取值函数 排序函数 over(partition by 分组字段 order by 字段 row between 起始行 and 结束行) /*创建部门表*/ CREATE TABLE dept (deptno INT PRIMARY KEY,dname VARCHAR(50) comment 部门名称,loc VARCHAR(50) comment 工作地点 ); ​ /*…

2024团体程序设计天梯赛L1-101 别再来这么多猫娘了!

题目链接L1-101 别再来这么多猫娘了&#xff01; #include<iostream> #include<stdio.h> #include<string.h> #include<string> #include<algorithm> using namespace std; string s[105], text; int n, k, ans, a[5005];int main() { // ios::s…

【项目】基于JDBC+MySQL的Java教务管理系统(附源码+论文说明)

摘要 随着信息技术的不断发展&#xff0c;教育管理也在向数字化、智能化方向迈进。Java作为一种广泛应用于企业级应用开发的编程语言&#xff0c;与数据库技术的结合更是为教务管理系统的开发提供了强大的支持。 本文将介绍基于JDBC&#xff08;Java Database Connectivity&a…

短视频不够500有效粉丝怎么涨?如何涨有效粉丝?巨量千川投流怎么涨粉的?

近期&#xff0c;一些使用抖音橱窗功能的用户遇到了一个问题&#xff0c;他们在挂橱窗时会出现“有效粉丝不足500”无法正常挂橱窗的提示。这个问题是由于抖音平台改变了规则所致。现在&#xff0c;只有通过观看视频而非刷关注的粉丝才被算作有效粉丝&#xff0c;其他的粉丝都将…

39. UE5 RPG角色释放技能时转向目标方向

在上一篇&#xff0c;我们实现了火球术可以向目标方向发射&#xff0c;并且还可以按住Shift选择方向进行攻击。技能的问题解决&#xff0c;现在人物释放技能时&#xff0c;无法朝向目标方向&#xff0c;接下来我们解决人物的问题。 实现思路&#xff1a; 我们将使用一个官方的…

(CVPR,2023)SAN:用于开放词汇语义分割的边缘适配网络

文章目录 相关论文相关资料摘要引言方法对视觉 token 的特征融合使用注意力偏差进行掩码识别分割图像生成 实验 相关论文 &#xff08;CVPR&#xff0c;2024&#xff09;SED&#xff1a;一个用于开放词汇语义分割的简单编解码器 &#xff08;CVPR&#xff0c;2024&#xff09;…

python int占几个字节

《深入理解计算机系统》这本书上面提到了在32位机器和64机器中int类型都占用4个字节。《The C Programming language》这本书&#xff0c;里面有一句话是这样的&#xff1a;Each compiler is free to choose appropriate sizes for its own hardware, subject only to the rest…

https协议的加密方式详解

各位大佬能多多点赞关注评论收藏&#xff0c;球球各位大佬们了&#xff01;&#xff01; &#xff01; 目录 1.为什么要加密&#xff1f; 2.如何加密 1.密钥&#xff08;yue,第四声&#xff09; 2.对称加密 3.非对称加密 4.公证机构 3.总结 1.为什么要加密&#xff1f;…