欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue3中如何使用mqtt數(shù)據(jù)傳輸

 更新時間:2024年11月01日 16:15:55   作者:寶拉不想努力了  
這篇文章主要為大家詳細(xì)介紹了vue3中如何使用mqtt數(shù)據(jù)傳輸,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

使用版本

"mqtt": "^5.8.0",

安裝指令

npm install mqtt --save
------
yarn add mqtt

配置

connection: {
  protocol: "ws",
  host: "broker.emqx.io",
  port: 8083,
  endpoint: "/mqtt",
  clean: true,
  connectTimeout: 30 * 1000, // ms
  reconnectPeriod: 4000, // ms
  clientId: "emqx_vue_" + Math.random().toString(16).substring(2, 8),
  // 隨機(jī)數(shù) 每次不能重復(fù)
  username: "emqx_test",
  password: "emqx_test",
},

連接

import mqtt from "mqtt";
let client = {}
client = mqtt.connect(url, options)

client.on('connect', (e) => {
  // 訂閱主題
  
})

訂閱主題

client.subscribe(topic, { qos: 1 }, (err) => {
  if (!err) {
    console.log('訂閱成功')
  } else {
    console.log('消息訂閱失??!')
  }
})

消息發(fā)布

給后端發(fā)送格式,是和后端約定好的數(shù)據(jù)格式,一般為JSON傳輸。

client.publish(publishTopic, `{"messageType":1,"messageContent":""}`, { qos: 0 }, (err) => {
  if (!err) {
    console.log('發(fā)送成功')
    client.subscribe(topic, { qos: 1 }, (err) => {
      if (!err) {
        console.log('訂閱成功')
      } else {
        console.log('消息訂閱失??!')
      }
    })
  } else {
    console.log('消息發(fā)送失?。?)
  }
})

取消訂閱

client.unsubscribe(topicList, (error) => {
  console.log('主題為' + topicList + '取消訂閱成功', error)
})

斷開連接

export function unconnect() {
  client.end()
  client = null
  // Message.warning('服務(wù)器已斷開連接!')
  console.log('服務(wù)器已斷開連接!')
}

mqtt封裝使用(ts版)

import type { IClientOptions, MqttClient } from 'mqtt';
import mqtt from 'mqtt';

interface ClientOptions extends IClientOptions {
  clientId: string;
}

interface SubscribeOptions {
  topic: string;
  callback: (topic: string, message: string) => void;
  subscribeOption?: mqtt.IClientSubscribeOptions;
}

interface PublishOptions {
  topic: string;
  message: string;
}

class Mqtt {
  private static instance: Mqtt;
  private client: MqttClient | undefined;
  private subscribeMembers: Record<string, ((topic: string, message: string) => void) | undefined> = {};
  private pendingSubscriptions: SubscribeOptions[] = [];
  private pendingPublications: PublishOptions[] = [];
  private isConnected: boolean = false;

  private constructor(url?: string) {
    if (url) {
      this.connect(url);
    }
  }

  public static getInstance(url?: string): Mqtt {
    if (!Mqtt.instance) {
      Mqtt.instance = new Mqtt(url);
    } else if (url && !Mqtt.instance.client) {
      Mqtt.instance.connect(url);
    }
    return Mqtt.instance;
  }

  private connect(url: string): void {
    console.log(url, clientOptions);
    if (!this.client) {
      this.client = mqtt.connect(url, clientOptions);
      this.client.on('connect', this.onConnect);
      this.client.on('reconnect', this.onReconnect);
      this.client.on('error', this.onError);
      this.client.on('message', this.onMessage);
    }
  }

  public disconnect(): void {
    if (this.client) {
      this.client.end();
      this.client = undefined;
      this.subscribeMembers = {};
      this.isConnected = false;
      console.log(`服務(wù)器已斷開連接!`);
    }
  }

  public subscribe({ topic, callback }: SubscribeOptions): void {
    if (this.isConnected) {
      this.client?.subscribe(topic, { qos: 1 }, error => {
        if (error) {
          console.log(`客戶端: ${clientOptions.clientId}, 訂閱主題: ${topic}失敗: `, error);
        } else {
          console.log(`客戶端: ${clientOptions.clientId}, 訂閱主題: ${topic}成功`);
        }
      });
      this.subscribeMembers[topic] = callback;
    } else {
      this.pendingSubscriptions.push({ topic, callback });
    }
  }

  public unsubscribe(topic: string): void {
    if (!this.client) {
      return;
    }
    this.client.unsubscribe(topic, error => {
      if (error) {
        console.log(`客戶端: ${clientOptions.clientId}, 取消訂閱主題: ${topic}失敗: `, error);
      } else {
        console.log(`客戶端: ${clientOptions.clientId}, 取消訂閱主題: ${topic}成功`);
      }
    });
    this.subscribeMembers[topic] = undefined;
  }

  public publish({ topic, message }: PublishOptions): void {
    if (this.isConnected) {
      this.client?.publish(topic, message, { qos: 1 }, e => {
        if (e) {
          console.log(`客戶端: ${clientOptions.clientId}, 發(fā)送主題為: ${topic} 的消息, 發(fā)送失敗: `, e);
        }
      });
    } else {
      this.pendingPublications.push({ topic, message });
    }
  }

  private onConnect = (e: any): void => {
    console.log(`客戶端: ${clientOptions.clientId}, 連接服務(wù)器成功:`, e);
    this.isConnected = true;
    this.processPendingSubscriptions();
    this.processPendingPublications();
  };

  private onReconnect = (): void => {
    console.log(`客戶端: ${clientOptions.clientId}, 正在重連:`);
    this.isConnected = false;
  };

  private onError = (error: Error): void => {
    console.log(`客戶端: ${clientOptions.clientId}, 連接失敗:`, error);
    this.isConnected = false;
  };

  private onMessage = (topic: string, message: Buffer): void => {
    // console.log(
    //   `客戶端: ${clientOptions.clientId}, 接收到來自主題: ${topic} 的消息: `,
    //   message.toString(),
    // );
    const callback = this.subscribeMembers?.[topic];
    callback?.(topic, message.toString());
  };

  private processPendingSubscriptions(): void {
    while (this.pendingSubscriptions.length > 0) {
      const { topic, callback, subscribeOption } = this.pendingSubscriptions.shift()!;
      this.subscribe({ topic, callback, subscribeOption });
    }
  }

  private processPendingPublications(): void {
    while (this.pendingPublications.length > 0) {
      const { topic, message } = this.pendingPublications.shift()!;
      this.publish({ topic, message });
    }
  }
}

const clientOptions: ClientOptions = {
  clean: true,
  connectTimeout: 500,
  protocolVersion: 5,
  rejectUnauthorized: false,
  username: 'admin',
  password: 'Anjian-emqx',
  clientId: `client-${Date.now()}`
};

// export default Mqtt.getInstance("ws://192.168.11.14:8083/mqtt");
// export default Mqtt.getInstance("ws://192.168.11.14:8083/mqtt");
// export default Mqtt.getInstance(JSON.parse(import.meta.env.VITE_OTHER_SERVICE_BASE_URL).mqtt);
const { protocol, host } = window.location;
export default Mqtt.getInstance(`${protocol.replace('http', 'ws')}//${host.replace('localhost', '127.0.0.1')}/mqtt/`);

注意:

1.環(huán)境配置

.env.test
VITE_OTHER_SERVICE_BASE_URL= `{
  "mqtt": "ws://192.168.11.14:8083/mqtt"
}`

2.qos設(shè)置 前后端統(tǒng)一為1

以上就是vue3中如何使用mqtt數(shù)據(jù)傳輸?shù)脑敿?xì)內(nèi)容,更多關(guān)于vue3 mqtt數(shù)據(jù)傳輸?shù)馁Y料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • VUE多個下拉框?qū)崿F(xiàn)雙向聯(lián)動效果

    VUE多個下拉框?qū)崿F(xiàn)雙向聯(lián)動效果

    這篇文章主要為大家詳細(xì)介紹了VUE多個下拉框?qū)崿F(xiàn)雙向聯(lián)動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • 使用vuedraggable實(shí)現(xiàn)從左向右拖拽功能

    使用vuedraggable實(shí)現(xiàn)從左向右拖拽功能

    這篇文章主要為大家詳細(xì)介紹了使用vuedraggable實(shí)現(xiàn)從左向右拖拽功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • vue3+vite項目配置ESlint、pritter插件過程

    vue3+vite項目配置ESlint、pritter插件過程

    這篇文章主要介紹了vue3+vite項目配置ESlint、pritter插件過程,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • vue實(shí)現(xiàn)自定義公共組件及提取公共的方法

    vue實(shí)現(xiàn)自定義公共組件及提取公共的方法

    這篇文章主要介紹了vue實(shí)現(xiàn)自定義公共組件及提取公共的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 一文詳解Vue3中簡單diff算法的實(shí)現(xiàn)

    一文詳解Vue3中簡單diff算法的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹Vue3中簡單diff算法的實(shí)現(xiàn)與使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的可以了解一下
    2022-09-09
  • vue3輸入單號和張數(shù)如何自動生成連號的單號

    vue3輸入單號和張數(shù)如何自動生成連號的單號

    最近遇到這樣的需求輸入連號事件,需要在表格中輸入物流單號,物流號碼,生成的數(shù)量,名稱,點(diǎn)擊確定自動生成固定數(shù)量的連號物流單號,本文重點(diǎn)介紹vue3輸入單號和張數(shù),自動生成連號的單號,感興趣的朋友一起看看吧
    2024-02-02
  • vue3實(shí)現(xiàn)問卷調(diào)查的示例代碼

    vue3實(shí)現(xiàn)問卷調(diào)查的示例代碼

    本文主要介紹了vue3實(shí)現(xiàn)問卷調(diào)查的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • vue中使用sessionStorage記住密碼功能

    vue中使用sessionStorage記住密碼功能

    sessionStorage不是一種持久化的本地存儲,僅僅是會話級別的存儲。這篇文章主要介紹了vue中使用sessionStorage記住密碼功能,需要的朋友可以參考下
    2018-07-07
  • Vue-pdf實(shí)現(xiàn)在線預(yù)覽PDF文件

    Vue-pdf實(shí)現(xiàn)在線預(yù)覽PDF文件

    這篇文章主要為大家詳細(xì)介紹了Vue-pdf實(shí)現(xiàn)在線預(yù)覽PDF文件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • vue移動端時彈出側(cè)邊抽屜菜單效果

    vue移動端時彈出側(cè)邊抽屜菜單效果

    這篇文章主要介紹了vue移動端時彈出側(cè)邊抽屜菜單,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-06-06

最新評論