mqtt flutter web项目websocket

mqtt flutter web项目websocket

在网上找相关的代码学习,太少了,自己借鉴研究了一个

pubspec.yaml添加引用包

dependencies:
flutter:
sdk: flutter

fast_gbk: 1.0.0

mqtt_client: ^10.2.0

mqtt代码:

import 'package:mqtt_client/mqtt_browser_client.dart';
import 'package:mqtt_client/mqtt_client.dart';
import 'package:typed_data/typed_data.dart';
import 'package:fast_gbk/fast_gbk.dart';///有好的修改方式请联系我修改文章帮助更多人 谢谢
///https://blog.csdn.net/ZQ200720/article/details/139065097?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22139065097%22%2C%22source%22%3A%22ZQ200720%22%7D
class webMqtt {late final MqttBrowserClient client;bool isbool = false;conn(String clientid) async {client =MqttBrowserClient.withPort('ws://127.0.0.1:8083/mqtt', clientid, 8083);//client.logging(on: true); //打印详细client.onConnected = () {isbool = true;print('Connected 已连接');};client.onDisconnected = () {isbool = false;print('Disconnected 未连接');};client.onUnsubscribed = (topic) {print("未订阅:$topic");// print('Unsubscribed from $topic');};client.onSubscribed = (topic) {print("已订阅:$topic");// print('Subscribed to $topic');///在订阅成功的时候注册消息监听client.updates?.listen(_onData);};client.onAutoReconnect=(){print("onAutoReconnect");//自动重新连接时};client.onAutoReconnected=(){print("onAutoReconnected");//自动恢复时};client.onSubscribeFail=(topic){print("onSubscribeFail: $topic");//订阅失败时};try {//配置连接信息final connMessage = MqttConnectMessage().authenticateAs('your_username', 'your_password').keepAliveFor(60)//失效.withWillTopic('will_topic').withWillMessage('LWT message').startClean();client.connectionMessage = connMessage;await client.connect(); //连接if (client.connectionStatus == true) {print('Connected to MQTT broker.');// 监听发送更新事件// client.updates?.forEach((element) {//   final MqttPublishMessage recMess = element.payload as MqttPublishMessage;//   //final String pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);//   // print("2收到$subTopic消息:$pt"); //字符串//   print(recMess.payload.message.toString()); //字符串// });/*client.published?.forEach((element) {final MqttPublishMessage recMess = element.payload as MqttPublishMessage;print(recMess.payload.message.toString()); //字符串});*//*  //无法回调client.published?.listen((MqttPublishMessage message) {// Handle the incoming message.// Check if the payload is a string or binary and handle accordingly.if (message.payload is String) {print('Received string message: ${message.payload}');} else if (message.payload is List<int>) {// If the payload is binary data, you might want to convert it to a string or handle it as bytes.String messageAsString =String.fromCharCodes(message.payload as List<int>);print('Received binary message: $messageAsString');}}, onError: (error) {// Handle any errors in the stream.print('Error receiving messages: $error');}, onDone: () {// Handle the completion of the stream.print('No more messages.');});*/} else {print('Failed to connect to MQTT broker.');}} catch (e) {print('连接失败:$e');}}///消息监听_onData(List<MqttReceivedMessage<MqttMessage>> data) {/* Uint8Buffer uint8buffer = Uint8Buffer();var messageStream = MqttByteBuffer(uint8buffer);data.forEach((MqttReceivedMessage<MqttMessage> m) {///将数据写入到messageStream数组中m.payload.writeTo(messageStream);print(uint8buffer.toString());  //字节final String pt =MqttPublishPayload.bytesToString(uint8buffer);print("1收到$subTopic消息:$pt");});
*/data.forEach((MqttReceivedMessage<MqttMessage> m) {final MqttPublishMessage recMess = m.payload as MqttPublishMessage;//final String pt = MqttPublishPayload.bytesToStringAsString(recMess.payload.message);// print("2收到$subTopic消息:$pt"); //字符串print(recMess.payload.message.toString()); //字符串//乱码处理//  final bytes = gbk.encode(recMess.payload.message.toString()); //获取字节流  string -- bytesfinal status = gbk.decode(recMess.payload.message);print("接收消息:$status"); //字符串// final info = UserInfo("消息:$status", 18);// sdata().getEve(info);});}//订阅主题void subscribe(String top) {if (isbool) client.subscribe(top, MqttQos.atLeastOnce);}//取消订阅主题void unsubscribe(String top) {if (isbool) client.unsubscribe(top); //.subscribe(top, MqttQos.atLeastOnce);}//发送消息void publishMessage(String top, String mesg) {if (!isbool) {print('没有连接');return;}///int数组Uint8Buffer uint8buffer = Uint8Buffer();///字符串转成int数组 (dart中没有byte) 类似于java的String.getBytes?var codeUnits = mesg.codeUnits;uint8buffer.addAll(codeUnits);client.publishMessage(top, MqttQos.atLeastOnce, uint8buffer);}//断开连接void disconn() {if (isbool) client.disconnect();}
}

使用

import 'package:flutter/material.dart';import 'package:webwsyn/mqtt/web_mqtt.dart';Future<void> main() async {runApp(MyApp());
}class MyApp extends StatelessWidget {Widget build(BuildContext context) {return MaterialApp(title: 'Flutter Demo',home: MqttDemo(), //Column(),);}
}class MqttDemo extends StatefulWidget {_MqttDemoState createState() => _MqttDemoState();
}class _MqttDemoState extends State<MqttDemo> {webMqtt _mqttService = webMqtt();String clientid = "textmqtt";void initState() {super.initState();//connectToMqtt1();}void dispose() {super.dispose();}void _conn() {_mqttService = webMqtt();_mqttService.conn(clientid);}void _disconn() {_mqttService.disconn();}void _subscribe() {_mqttService.subscribe('test/topic');}void _unsubscribe(){_mqttService.unsubscribe('test/topic');}void _sendMessage() {_mqttService.publishMessage('test/topic', 'Hello MQTT from Flutter Web!');}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: Text('MQTT Demo'),),body: Column(children: [Center(child: ElevatedButton(onPressed: _conn,child: Text('连接'),),),Center(child: ElevatedButton(onPressed: _subscribe,child: Text('订阅'),),),Center(child: ElevatedButton(onPressed: _unsubscribe,child: Text('取消订阅'),),),Center(child: ElevatedButton(onPressed: _sendMessage,child: Text('发送'),),),Center(child: ElevatedButton(onPressed: _disconn,child: Text('断开'),),),],),);}
}

创作不易,请留下你的鼓励,谢谢

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

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

相关文章

ClickHouse 几年内数据查询及细节

在 ClickHouse 中&#xff0c;查询三年内的时间数据可以使用以下方法&#xff1a; 1. 使用日期函数 可以使用 ClickHouse 支持的日期函数来筛选出三年内的数据。例如&#xff0c;使用 today() 函数获取当天日期&#xff0c;使用 toDate() 函数将日期转换为指定格式&#xff0…

【C++】学习笔记——map和set

文章目录 十五、map和set1. 关联式容器2. set的介绍3. set的使用4. multiset5. map的介绍6. map的使用7. multimap8. map中重载的operator[] 未完待续 十五、map和set 1. 关联式容器 我们已经接触过STL中的部分容器&#xff0c;比如&#xff1a;vector 、list 、deque 等&…

Golang | Leetcode Golang题解之第99题恢复二叉搜索树

题目&#xff1a; 题解&#xff1a; func recoverTree(root *TreeNode) {var x, y, pred, predecessor *TreeNodefor root ! nil {if root.Left ! nil {// predecessor 节点就是当前 root 节点向左走一步&#xff0c;然后一直向右走至无法走为止predecessor root.Leftfor pr…

《数组逆序输出》

描述 编写程序&#xff0c;输入10个整数n存入&#xff0c;再按逆序重新存放后再输出。 输入描述 输入共10个数。 输出描述 输出共1行&#xff0c;每个数字用空格隔开。 样例输入 1 -5 -4 -3 -2 -1 0 1 2 3 4 样例输出 1 4 3 2 1 0 -1 -2 -3 -4 -5 提示 对于100%的数据…

OpenHarmony开发之MQTT讲解

相信MQTT这个名称大家都不陌生&#xff0c;物联网的开发必然会遇到MQTT相关知识的应用。那么什么是MQTT&#xff1f;它有什么特点&#xff1f;它能解决什么问题&#xff1f;它是如何工作的&#xff1f;OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;的物…

前端基础入门三大核心之HTML篇:网页基础配置全解密

前端基础入门三大核心之HTML篇&#xff1a;网页基础配置全解密 一、HTML文档的基本结构1.1 文档类型声明1.2 HTML标签结构 二、头部元数据配置2.1 字符集声明2.2 视口设置2.3 标题定义 三、网页结构布局3.1 基本元素段落标题列表 3.2 链接与图像链接图像 3.3 分区与布局使用Div…

简单快捷的图片格式转换工具:认识webp2jpg-online

经常写博客或记笔记的朋友们可能会碰到图床不支持的图片格式或图片太大需要压缩的情况。通常&#xff0c;我们会在浏览器中搜索在线图片格式转换器&#xff0c;但这些转换器往往伴有烦人的广告或要求登录&#xff0c;并且支持的转换格式有限。最近&#xff0c;我在浏览 GitHub …

hls.js实现分片播放视频

前言&#xff1a;hls.js官网&#xff1a;hls.js - npm 一、demo——在HTML中使用 <audio id"audio" controls></audio><script src"https://cdn.jsdelivr.net/npm/hls.jslatest"></script> <script>document.addEventList…

upload-labs 通关方法

目录 Less-1&#xff08;JS前端验证&#xff09; Less-2&#xff08;MIME验证&#xff09; Less-3&#xff08;黑名单&#xff0c;特殊过滤&#xff09; Less-4&#xff08;黑名单验证&#xff0c;.htaccess&#xff09; Less-5&#xff08;黑名单&#xff0c;点空格点绕过…

Qt | QCalendarWidget 类(日历)

01、QCalendarWidget 类 1、QCalendarWidget 类是 QWidget 的直接子类,该类用于日历,见下图 02、QCalendarWidget 属性 ①、dateEditAcceptDelay:int 访问函数:int dateEditAcceptDelay()const; void setDateEditAcceptDelay(int) 获取和设置日期编辑器的延迟时间(以毫秒…

给树莓派配置静态IP地址

第一步&#xff1a;查找默认网关 打开windowr&#xff1b;输入cmd&#xff0c; 输入 最后一行就是默认网关 ipconfig第二步&#xff1a;确定分配好给树莓派的IP地址 要注意&#xff1a;&#xff08;1&#xff09;静态ip地址与路由器网段保持一致&#xff08;2&#xff09;与…

将.webp图片格式转化为.jpg并放大到a4纸大小

引用-》管理NuGet程序包-》搜索GroupDocs.Conversion&#xff0c;安装上这个 核心代码 var dir1 System.IO.Path.GetDirectoryName(path1);var file1 System.IO.Path.GetFileNameWithoutExtension(path1);var full_path1 System.IO.Path.Combine(dir1, file1 ".jpg&qu…

xjoi题库一级一段题解(c语言版)

题目描述&#xff1a; 请你自行编写程序&#xff0c;输出“I LOVE OI.”&#xff08;不包括引号&#xff09;&#xff0c;请注意细节处&#xff0c;如大小写&#xff0c;句号等。 输入格式&#xff1a; 无输入 输出格式&#xff1a; I LOVE OI. 样例输入&#xff1a; 无输入 样…

Oracle23ai新特性SCHEMA级授权

Oracle23ai新特性SCHEMA级授权 1、需求简介 Oracle23ai之前的版本&#xff0c;想要实现一个用户可以访问另一个用户下的所有表&#xff0c;需要把该用户下所有的表的访问权限依次授权给该用户。这一方式存在的问题是&#xff0c;每当源端用户新创建一个表时&#xff0c;还需要…

[个人笔记] 记录CentOS7构建docker-ce的过程

容器技术 第一章 记录CentOS7构建docker-ce的过程 容器技术记录CentOS7构建docker-ce的过程CentOS 7.9基础配置centos配置网络连接, sshd, hostname, yum包更新sdb硬盘配置lvm部署docker之前, 优化centos的默认参数docker底层原理安装docker-ce社区版验证docker-ce是否正常运行…

压缩设备液压控制比例放大器

液压比例阀放大器是液压控制系统中的重要部件之一&#xff0c;用于控制输出油压方向流量和压力的精确控制。它由BEUEC比例放大器和比例电磁阀组成&#xff0c;通过调节比例放大器的增益和灵敏度参数&#xff0c;可以实现对液压系统输出油压方向流量和压力的精确控制。适用于各种…

动态IP与静态IP有什么区别?如何选择?

动态IP和静态IP都是指网络设备&#xff08;如计算机、服务器、路由器等&#xff09;在互联网上分配的IP地址的类型。 一、什么是动态IP&#xff0c;什么是静态IP&#xff1f; 1、什么是动态IP&#xff1f; 动态IP是指由Internet服务提供商&#xff08;ISP&#xff09;动态分配…

关于linux的防护,以及群集你要知道的有哪些8-使用Haproxy搭建web群集

1、Haproxy&#xff0c;LVS、Ningx三个调度器的区别&#xff1a; LVS性能最好&#xff0c;但是搭建相对复杂 Nginx的upstream模块支持群集功能&#xff0c;但是对群集节点健康检查功能不强&#xff0c;性能没有Haproxy好 2、HTTP的请求方式 GET方式 POST方式 3、返回状态码 正…

【Android】探索Android网络请求:OkHttp、Retrofit和Volley

在 Android 中&#xff0c;有许多流行的网络库可以用来进行网络请求&#xff0c;每个库都有自己的优点和适用场景。以下是几个常用的库及其简要介绍和示例代码&#xff1a; 1. OkHttp OkHttp 是一个高效的 HTTP 客户端&#xff0c;广泛用于 Android 应用中。 添加依赖 depe…

整理好了!2024年最常见 20 道 Redis面试题(四)

上一篇地址&#xff1a;整理好了&#xff01;2024年最常见 20 道 Redis面试题&#xff08;三&#xff09;-CSDN博客 七、Redis 单线程模型是如何工作的&#xff1f; Redis 是一个基于单线程模型的高性能键值存储数据库。尽管 Redis 操作大多数是单线程执行的&#xff0c;但它…