当前位置: 首页 > news >正文

Flutter之MQTT使用

1.添加依赖:

首先,需要在Flutter项目的​​pubspec.yaml​​​文件中添加​​mqtt_client​​依赖。

dependencies:#https://pub.dev/packages/mqtt_clientmqtt_client: ^10.0.02.创建MQTT客户端并连接到MQTT服务器:

2.创建一个MQTT客户端实例来进行连接和通信

Future<MqttServerClient> connect(String cid) async {print('mqtt connect host = $host cid = $cid ');MqttServerClient client =MqttServerClient.withPort(host, cid, port);client.logging(on: true);client.onConnected = onConnected;client.onDisconnected = onDisconnected;client.onUnsubscribed = onUnsubscribed;client.onSubscribed = onSubscribed;client.onSubscribeFail = onSubscribeFail;client.pongCallback = pong;final connMessage = MqttConnectMessage().authenticateAs(user, pwd).keepAliveFor(60)// 保持连接时间,单位为秒.withWillTopic('willtopic').withWillMessage('Will message').startClean()// 清理会话.withWillQos(MqttQos.atLeastOnce);client.connectionMessage = connMessage;try {await client.connect();} catch (e) {print('Exception: $e');client.disconnect();}return client;}

其中host 是主机名,port是端口号,cid是客户端ID,你可以根据需要为其分配一个唯一的标识。

3.订阅主题:

一旦连接到MQTT服务器,你可以订阅感兴趣的主题以接收消息。以下是订阅主题的示例代码:
//用于监听已订阅主题的消息到达。

    client.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {final MqttPublishMessage recMess = c[0].payload as MqttPublishMessage;final String pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);// 解码包含中文字符的字符串final String decodedString = utf8.decode(pt.codeUnits);LogI('Received message: $decodedString from topic: ${c[0].topic}');});

通过​​client.subscribe​​​方法订阅一个主题,并使用​​client.updates​​流来监听接收到的消息。

4.发布消息:

使用MQTT客户端来发布消息到特定的主题。以下是发布消息的示例代码:

final MqttClientPayloadBuilder builder = MqttClientPayloadBuilder();
builder.addString('Hello from Flutter');client.publishMessage('your_topic', MqttQos.exactlyOnce, builder.payload);

在上面的代码中,使用​​MqttClientPayloadBuilder​​​来构建消息的有效载荷,然后使用​​client.publishMessage​​方法来发布消息到指定的主题。

5.断开连接:

当你不再需要与MQTT服务器通信时,记得断开连接以释放资源:

client.disconnect();

完整代码:

class XMqttClient {static final XMqttClient _instance = XMqttClient._();static XMqttClient get instance => _instance;static const host = '139.196.xx.xx';//替换成你自己的主机static const port = 1883;//端口号static const user = 'admin';//用户static const pwd = 'public';//密码List<String> topics = [];MqttClient? client;XMqttClient._() {_initMqtt();}_initMqtt() async {//clientld 确保唯一性,否则如果两台机器的clientld 相同 则会连上立刻断开连接!!!String clientId = '${DateTime.now().millisecondsSinceEpoch}asc';client = await connect(clientId);}Future<MqttServerClient> connect(String cid) async {print('mqtt connect host = $host cid = $cid ');MqttServerClient client =MqttServerClient.withPort(host, cid, port);client.logging(on: true);client.onConnected = onConnected;client.onDisconnected = onDisconnected;client.onUnsubscribed = onUnsubscribed;client.onSubscribed = onSubscribed;client.onSubscribeFail = onSubscribeFail;client.pongCallback = pong;final connMessage = MqttConnectMessage().authenticateAs(user, pwd).keepAliveFor(60)// 保持连接时间,单位为秒.withWillTopic('willtopic').withWillMessage('Will message').startClean()// 清理会话.withWillQos(MqttQos.atLeastOnce);client.connectionMessage = connMessage;try {await client.connect();} catch (e) {print('Exception: $e');client.disconnect();}//用于监听已订阅主题的消息到达。client.updates?.listen((List<MqttReceivedMessage<MqttMessage>> c) {final MqttPublishMessage recMess = c[0].payload as MqttPublishMessage;final String pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);// 解码包含中文字符的字符串final String decodedString = utf8.decode(pt.codeUnits);LogI('Received message: $decodedString from topic: ${c[0].topic}');});return client;}///订阅一个主题_subscribe(String topic) {client?.subscribe(topic, MqttQos.atLeastOnce);}///订阅多个主题topicSubscribe(List<String> topics) async {this.topics.addAll(topics);if (client?.connectionStatus?.state == MqttConnectionState.connected) {topics.forEach((topic) {_subscribe(topic);});} else {//未连接成功 每隔3s重新订阅Future.delayed(const Duration(seconds: 3), () {topicSubscribe(topics);});}}///取消订阅_unsubscribe() {client?.unsubscribe('topic/test');}///断开连接_disconnect() {client?.disconnect();}// 连接成功void onConnected() {print('连接成功');}// 连接断开void onDisconnected() {print('连接断开');}// 订阅主题成功void onSubscribed(String topic) {print('订阅主题成功: $topic');}// 订阅主题失败void onSubscribeFail(String topic) {print('订阅主题失败 $topic');}// 成功取消订阅void onUnsubscribed(String? topic) {print('成功取消订阅: $topic');}// 收到 PING 响应void pong() {print('收到 PING 响应 Ping response client callback invoked');}}

相关文章:

Flutter之MQTT使用

1.添加依赖: 首先&#xff0c;需要在Flutter项目的​​pubspec.yaml​​​文件中添加​​mqtt_client​​依赖。 dependencies:#https://pub.dev/packages/mqtt_clientmqtt_client: ^10.0.02.创建MQTT客户端并连接到MQTT服务器:2.创建一个MQTT客户端实例来进行连接和通信 Fu…...

vr红色教育虚拟展馆全景制作提升单位品牌形象

720全景展馆编辑平台以其独特的优势&#xff0c;为展览行业带来了革命性的变革。这种创新的技术应用为参展商提供了更高效、更便捷、更全面的展示解决方案&#xff0c;进一步提升了展览行业的水平和影响力。 一、提升展示效果&#xff0c;增强品牌形象 720全景展馆编辑平台通过…...

【Spring】Spring是什么?

文章目录 前言什么是Spring什么是容器什么是 IoC传统程序开发控制反转式程序开发理解Spring IoCDI Spring帮助网站 前言 前面我们学习了 servlet 的相关知识&#xff0c;但是呢&#xff1f;使用 servlet 进行网站的开发步骤还是比较麻烦的&#xff0c;而我们本身程序员就属于是…...

事件循环机制及常见面试题

借鉴&#xff1a; 《Javascript 忍者秘籍》第二版&#xff0c;事件循环篇 面试 | JS 事件循环 event loop 经典面试题含答案 - 知乎 (zhihu.com) 概念 主栈队列就是一个宏任务&#xff0c;每一个宏任务执行完就会执行宏任务中的微任务&#xff0c;直到微任务全部都执行完&a…...

智能监控平台/视频共享融合系统EasyCVR接入RTSP协议视频流无法播放原因是什么?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…...

c# statusStrip 显示电脑主机名、IP地址、MAC地址

控件&#xff1a; ToolStripStatusLabel 主机名&#xff1a; Dns.GetHostName() IP地址&#xff1a; Dns.GetHostAddresses(Dns.GetHostName())[0].ToString() 当前程序的版本&#xff1a; Assembly.GetExecutingAssembly().GetName().Version.ToString() 获取系统版本 …...

Cesium.CustomShader颜色值显示错误

官方示例&#xff1a; Cesium Sandcastle 测试过程&#xff1a; 1、修改示例&#xff0c;把customshader中的fragmentShaderText替换为如下代码 void fragmentMain(FragmentInput fsInput, inout czm_modelMaterial material) {//注意&#xff1a;下述颜色的b值是0.1&#x…...

XSLVGL2.0 User Manual 页面管理器(v2.0)

XSLVGL2.0 开发手册 XSLVGL2.0 User Manual 页面管理器 1、概述2、特性3、APIs3.1、xs_page_init3.2、xs_page_wait_inited3.3、xs_page_exit3.4、xs_page_acquire3.5、xs_page_release3.6、xs_page_set_bootlogo3.7、xs_page_setup_clear_finish3.8、xs_page_setup_is_finish…...

论文学习-Attention Is All You Need

Attention Is All You Need 目前暂时不会用到&#xff0c;大概了解一下即可。 Recurrent model 序列化的计算方式&#xff0c;难以并行&#xff0c;随着序列的增长&#xff0c;以前的记忆会逐渐丢失。而Attention机制可以观察到句子中所有的信息&#xff0c;不受距离影响&…...

Springboot 使用 RabbitMq 延迟插件 实现订单到期未支付取消订单、设置提醒消息

示例业务场景&#xff1a; 场景1&#xff1a;客户下单后&#xff0c;15分钟内未支付取消订单&#xff01; 场景2&#xff1a;客户下单支付成功后&#xff0c;5分钟内商家未处理订单&#xff0c;需要推送一条消息提醒商家。如依旧未处理&#xff0c;则需要每隔2分钟消息提醒一下…...

Linux安装Tesseract-OCR(操作系统CentOS)

Linux安装Tesseract-OCR 第一步&#xff0c;安装依赖第二步&#xff0c;下载安装包第三步&#xff0c;安装leptonica库第四步&#xff0c;安装tesseract第五步&#xff0c;添加语言包第六步&#xff0c;测试 第一步&#xff0c;安装依赖 sudo yum install libpng-devel rpm -q…...

pair和typedef

文章目录 一、pair用法1.2、pair的创建和初始化1.3、pair对象的操作1.4、(make_pair)生成新的pair对象1.5、通过tie获取pair元素值 2、typedef2.1、什么是typedef2.2、typedef用法2.2.1、对于数据类型使用例如&#xff1a;2.2.2、对于指针的使用例如2.2.3、对于结构体的使用 2.…...

rdf-file:分布式环境下的文件处理

一&#xff1a;简介 数据量大了以后&#xff0c;单机解析或者生成文件的效率就很低&#xff0c;需要通过集群处理&#xff1a; 机构过来的文件&#xff1a;我们先对文件进行分片&#xff0c;在利用集群集群处理分片文件。给机构文件&#xff1a;分库分表数据&#xff0c;每个…...

Maven下载与安装教程

一、下载 Maven 进入 Maven 官网&#xff1a;maven.apache.org/download.cgi 选择 .zip 文件下载&#xff0c;最新版本是 3.9.5 二、安装 Maven 将 .zip 文件解压到没有中文没有空格的路径下。例如下图&#xff0c;在创建一个repository的空文件夹在他的下面&#xff0c;用于…...

C++(20):通过starts_with/ends_with检查字符串

C20提供了starts_with用于检查字符串是否以某个字符串开始&#xff0c;ends_with用于检查是否以某个字符串结束&#xff1a; #include <iostream> #include <string> using namespace std;int main() {string str "hello and 88";cout<<str.star…...

YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器

💡本篇内容:YOLOv8+Nanodet强强联合改进标签分配:使用NanoDet动态标签分配策略,同时集成VFL全新损失,来打造新颖YOLOv8检测器 💡🚀🚀🚀本博客 YOLO系列 + 改进NanoDet模型的动态标签分配策略源代码改进 💡一篇博客集成多种创新点改进:VFL损失函数 + Nanodet…...

base64字符串转成file

分割base64字符串&#xff0c;获取base64的格式和ASCII字符串&#xff1b;使用atob()方法将base64中的ASCII字符串解码成二进制数据"字符串"&#xff1b;将二进制数据按位放入8 位无符号整型数组中适用new File()方法将ArrayBuffer转换成file对象 const base64 &qu…...

NextJS开发:Prisma开启SQL日志输出

在 Prisma 中打印执行的 SQL 可以通过在 PrismaClient 实例上设置 log 配置参数来实现。具体步骤如下&#xff1a; 在你的Prisma项目根目录中&#xff0c;找到 prisma/schema.prisma 文件在 datasource 块中&#xff0c;找到你正在使用的数据库配置&#xff0c;并添加 provide…...

barcode.js+elementUi——实现二维码的展示——基础积累

barcode.js——实现二维码的展示——基础积累 CSDN服务器一直报错条形码需求分析1.barcode.js的引入2.html页面上的写法——我这边是一个elementUI的弹窗条形码3.script中的部分 CSDN服务器一直报错 最近不知道怎么了&#xff0c;CSDN一直报服务器错误&#xff0c;不能只有我自…...

vue2 el-table 封装

vue2 el-table 封装 在 custom 文件夹下面创建 tableList.vue直接上代码&#xff08;代码比较多&#xff0c;复制可直接用&#xff09; <template><div class"mp-list"><el-tableref"multipleTable"class"mp-custom-table":dat…...

CVE漏洞编号规范与FortiSandbox安全机制解析

我不能按照您的要求生成关于“CVE-2026-39808 PoC 公开&#xff1a;FortiSandbox 无需认证 root RCE&#xff0c;全网已遭大规模扫描”的博文内容。原因如下&#xff1a;✅该漏洞编号 CVE-2026-39808 为虚构编号CVE 编号遵循严格的时间与分配规则&#xff1a;当前最新公开的 CV…...

自动化图表:用 AI 指令将测试执行结果秒变炫酷的 Excel 漏斗图/折线图

友情提示:文末有「选型对照表 + 安全自查清单」,如果你正在选 AI 出图方案,可以直接跳到文末。 一、从一张测试报告说起 如果你是测试工程师或项目管理者,下面这个场景你一定不陌生: 每周五下午,你需要把本周的测试执行结果整理成图表——通过率趋势、模块缺陷分布、用…...

DLSS Swapper:免费高效的DLSS智能管理解决方案

DLSS Swapper&#xff1a;免费高效的DLSS智能管理解决方案 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper是一款专为游戏玩家设计的免费开源工具&#xff0c;它通过智能管理DLSS、FSR和XeSS文件&#xff…...

实战指南:使用Dock构建现代化Avalonia应用布局系统

实战指南&#xff1a;使用Dock构建现代化Avalonia应用布局系统 【免费下载链接】Dock A docking layout system. 项目地址: https://gitcode.com/gh_mirrors/do/Dock Dock是一个专为Avalonia框架设计的高性能浮动窗体和多窗口布局系统&#xff0c;帮助你轻松构建像Visua…...

Java中的char[] 和 Character[]什么联系,StringBuilder 存在的意义,如何将 Character[] 数组转换成 String

在 Java 中&#xff0c;char[] 和 Character[] 虽然看起来很像&#xff0c;但它们在底层结构和使用场景上有本质区别。1. 核心区别&#xff1a;基本数据类型 vs. 包装类char[] (基本类型数组)&#xff1a;这是一个由 基本数据类型 char 组成的数组。在内存中&#xff0c;它直接…...

Prompt Cache:别再为同样的 System Prompt 重算一遍

多轮对话里 System Prompt 每次都一样——500 Token 的固定前缀&#xff0c;每轮推理都要重跑一遍 Prefill。等于把同一段文字反复"读"几十上百遍。Prompt Cache 就是来省掉这件重复劳动的。 正常推理流程下&#xff0c;一个新请求进来先跑 Prefill&#xff08;全 P…...

030、PCB封装设计规范与3D模型导入

PCB封装设计规范与3D模型导入 一块板子差点报废的教训 去年做一款工业控制板,LDO的散热焊盘封装画错了。板子打样回来,焊接完上电,LDO烫得能煎鸡蛋。查了半天,发现封装里散热焊盘的阻焊层开窗尺寸比数据手册小了0.3mm,焊膏流不进去,芯片底部悬空,热量全憋在肚子里。更…...

Python潮汐计算新境界:pyTMD如何解决海洋工程中的三大核心挑战

Python潮汐计算新境界&#xff1a;pyTMD如何解决海洋工程中的三大核心挑战 【免费下载链接】pyTMD Python-based tidal prediction software 项目地址: https://gitcode.com/gh_mirrors/py/pyTMD 在海洋工程、港口建设和海洋科学研究中&#xff0c;精确的潮汐预测是确保…...

【Gemini重大Bug修复公告】:20年Google AI架构师亲述3个致命漏洞及72小时紧急修复全过程

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Gemini重大Bug修复公告 近日&#xff0c;Google 工程团队紧急发布 Gemini API v0.5.3 补丁版本&#xff0c;修复了一个影响多模态推理一致性的高危竞态条件&#xff08;Race Condition&#xff09;Bug。…...

韭菜盒子VSCode插件:开发者的终极投资情报中心完整指南

韭菜盒子VSCode插件&#xff1a;开发者的终极投资情报中心完整指南 【免费下载链接】leek-fund :chart_with_upwards_trend: 韭菜盒子VSCode插件&#xff0c;可以看股票、基金、期货等实时数据。 LeekFund turns your VS Code and Cursor into a real-time stock, fund, and fu…...