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

news2024/9/20 3:27:59

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32嵌入式物联网开发实战笔记-C编程基础知识点【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 5.1 C 语言基础知识复习 本节我们给大家介绍一下 C 语言基础知识&#xff0c;对于 C 语言比较熟练的开发者&#xff0c;可以跳过此节&#xff0c;对于基础比较薄弱的开发者&…

HCF-Net:用于红外小目标检测的分层上下文融合网络

摘要 红外小目标检测是一项重要的计算机视觉任务&#xff0c;涉及在红外图像中识别和定位微小物体&#xff0c;这些物体通常仅包含几个像素。然而&#xff0c;由于物体尺寸极小以及红外图像中通常复杂的背景&#xff0c;这项任务面临困难。在本文中&#xff0c;我们提出了一种…

40.Vue 应用

Vue 应用 应用实例 每个 Vue 应用都是通过 createApp函数创建一个新的 应用实例 import { createApp } from vueconst app createApp({/* 根组件选项 */ })根组件 我们传入 createApp 的对象实际上是一个组件&#xff0c;每个应用都需要一个“根组件”&#xff0c;其他组件…

HarmonyOS NEXT 使用XComponent + Vsync 实现自定义动画

介绍 XComponent 提供了应用在 native 侧调用 OpenGLES 图形接口的能力&#xff0c;本文主要介绍如何配合 Vsync 事件&#xff0c;完成自定义动画。在这种实现方式下&#xff0c;自定义动画的绘制不在 UI 主线程中完成&#xff0c;即使主线程卡顿&#xff0c;动画效果也不会受…

【Camera Sensor Driver笔记】二、点亮指南之Sensor Module XML

Camera Sensor module XML详解&#xff1a; cameraId 与 slot id 一一对应 &#xff08;即&#xff1a;dtsi中相对应的sensor的 cell-index &#xff09; moduleName 模组厂名称 sensorName sensor 名称 actuatorName 马达名称 oisName …

Xavier 初始化

Xavier 初始化 为什么在 W [ l ] n p . r a n d o m . r a n d n ( s h a p e ) n p . s q r t ( 1 n [ l − 1 ] ) W^{[l]}np.random.randn(shape)\times np.sqrt(\frac{1}{n^{[l-1]}}) W[l]np.random.randn(shape)np.sqrt(n[l−1]1​) 中需要乘以 n p . s q r t ( 1 n […

宽带上网技术发展(xDSL、PON)

文章目录 xDSL&#xff08;x数字用户线&#xff0c;x Digital Subscriber Line&#xff09;IDSL(基于ISDN数字用户线路)ADSL(不对称数字用户线路)RADSL(速率自适应数字用户线路)HDSL(高速率数字用户线路)VDSL(极高速率数字用户线路)SDSL(单对线路/对称数字用户线路) PON&#x…

Linux驱动开发——(三)并发与竞争

目录 一、并发与竞争简介 二、原子操作 2.1 原子操作简介 2.2 原子整形操作API 2.3 原子位操作API 2.4 原子操作驱动代码 三、自旋锁 3.1 自旋锁简介 3.2 自旋锁API 3.3 自旋锁驱动代码 四、信号量 4.1 信号量简介 4.2 信号量API 4.3 信号量驱动代码 一、并发与…

SpringCloud系列(4)--SpringCloud微服务工程构建

前言&#xff1a;在上节我们新建了一个SpringCloud父工程&#xff0c;这一节主要是构建微服务工程&#xff0c;通过实现订单模块和支付模块来熟悉微服务的概念和构建过程。 1、在父工程下新建模块 2、选择模块的项目类型为Maven并选择模块要使用的JDK版本 3、填写子模块的名称&…

算法|最大堆、最小堆和堆排序的实现(JavaScript)

一些概念 堆&#xff1a;特殊的完全二叉树&#xff0c;具有特定性质的完全二叉树。大根堆&#xff1a;父节点 > 子节点小根堆&#xff1a;父节点 < 子节点 二叉堆也属于完全二叉树&#xff0c;所以可以用数组表示。 若下标从1开始&#xff0c;左节点为 2*i &#xff0…

Java的Future机制详解

Java的Future机制详解 一、为什么出现Future机制二、Future的相关类图2.1 Future 接口2.2 FutureTask 类 三、FutureTask的使用方法四、FutureTask源码分析4.1 state字段4.2 其他变量4.4 构造函数4.5 run方法及其他 一、为什么出现Future机制 常见的两种创建线程的方式。一种是…

高架学习笔记之软件架构风格

目录 零、什么是软件架构风格 一、常见的软件架构风格 二、数据流风格 2.1. 批处理风格 2.2. 管道-过滤器风格 三、调用/返回风格 3.1. 主/子程序风格 3.2. 面向对象风格 3.3. 层次型风格 3.4. 客户端/服务器风格 3.4.1. 两层C/S体系结构 3.4.2. 三层C/S体系结构 …

MBD_入门篇_20_Simulink子系统

20.Simulink子系统 20.1 概述 Simulink的子系统&#xff0c;相当于代码的function函数&#xff0c;但是模型的子系统又不完全等效于代码的函数。虚拟子系统并不会生成函数&#xff0c;而是以代码块的形式放在相应的调用位置上。模型层面我们使用子系统去做模块化的设计&#xf…

Mini-Gemini: 探索多模态视觉语言模型的新境界

一、背景 在数字化时代&#xff0c;人工智能的发展正以前所未有的速度推进。特别是在多模态学习领域&#xff0c;结合视觉和语言的能力已成为研究的热点。最近&#xff0c;一篇名为“Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models”的文章在arX…

[已解决]react打包部署

react打包部署 问题 npm install 命令无反应 思路 换成 yarn install 安装完hadoop的环境后&#xff0c;使用node的yarn会报错&#xff1a; 我们在cmd使用where yarn&#xff0c;如下&#xff1a; 看你想保留哪一个&#xff0c;我平时node用的多&#xff0c;就把hadoop的y…

飞书API(5):查看多维表 28 种数据类型的数据结构

一、引入 前面我们用于测试的数据集其实都是比较常用的数据&#xff0c;比如说文本、数字、单选等&#xff0c;但飞书多维表并不仅仅只有这些数据&#xff0c;截止发文&#xff0c;飞书多维表应用上支持28种数据类型&#xff0c;在数据层面飞书官方只提供了23种数据类型&#…

Cadence软件安装

Cadence软件 iscape 用于安装cadence家的安装软件 解压缩安装包tar -xvf IScape04.23.tar.gz运行bash IScape/iscape/bin/iscape.sh 设置默认安装路径(可选)IC618 这里使用的是IC618.320版本作为示例,其他版本安装过程差不多 安装 首先安装终端模拟器,不然安装之后会失败…

【前端】校园二手书交易系统javascript+css+html (源码)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

Vnode是如何产生的?

源码 流程图 源码解读 Vue.js2.0中有两种生成方式&#xff1a;第一种是直接在Vue对象的option中添加render字段&#xff1b;第二种是像Vue.js 1.x版本那样写一个模板或者指定一个el根元素&#xff0c;它会首先转换成模板&#xff0c;经过HTMI语法解析器生成一个 ast 抽象语法树…

JAVAEE——IP协议

文章目录 IP协议IP协议报头格式IP协议报头的各个区段四位版本四位首部长度八位服务类型16位总长度16位标识&#xff0c;3位标志&#xff0c;13位片偏移八位生存时间八位协议 地址管理IP地址解决提议1&#xff1a;动态分配Ip地址解决提议2&#xff1a;NAT机制 IP协议 IP协议报头…