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 -- bytes
      final 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('断开'),
            ),
          ),
        ],
      ),
    );
  }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值