mqtt+vue2+js

[寫在前面]
官網(wǎng):https://github.com/mqttjs/MQTT.js
...等等再寫...

[版本明細]
"vue": "2.6.10",
"vue-router": "3.0.6",
"vuex": "3.1.0"
"mqtt": "^5.8.1",
"crypto-js": "^4.2.0",
"electron": "^13.6.9",
"electron-devtools-installer": "^3.1.0",

[vue.config.js]
mqtt內(nèi)部使用 ES6+ 的語法,使用過程中可能存在無法解析的情況,導致項目啟動報錯鸦概,需要在‘vue.config.js’中增加配置 transpileDependencies: ["mqtt"]

Ps. transpileDependencies 是一個Vue CLI 的配置選項枕磁,用于制定需要被轉(zhuǎn)譯的依賴包啄育。在Vue項目中,有些依賴包可能是用了ES6+的語法玖翅,而一些低版本的瀏覽器不支持這些語法脚曾,因此需要將這些依賴包轉(zhuǎn)譯成ES5語法东且,以便在低版本瀏覽器中正常運行。

[接口數(shù)據(jù)]

  1. getMqttConnectInfo
    返回值:
    data: {
    host: "mqtt.xxxx.net", // "mqtt域名",
    port: 8084, // "mqtt端口",
    secretKey: "mmmmmmm", //"mqtt密鑰本讥,mqtt密碼 = md5(clientId,secretKey) ",
    timestamp: 1758796, // "mqtt服務器時間戳",
    token: "tokentokentoke token", //"clientid = token|sighmethod=md5,timestamp=nowdate ",
    topic: "/message/yyyy", //"訂閱主題",
    username: "username", //"mqtt用戶名",
    },

[開始啦]

mqtt.js:

import mqtt from "mqtt";
import crypto from "crypto-js";
class MQTT {
  url = ""; // mqtt地址
  topic = ""; //
  token = ""; //
  secretKey = "";
  username = "";
  password = ""; //密碼
  // 初始化類實例
  constructor(params) {
    console.log("mqtt實例", params);
    this.topic = params.topic; // 訂閱的topic
    this.token = params.token;
    this.secretKey = params.secretKey;
    this.url = params.url;
    this.username = params.username;
    this.password = params.password;
  }

  //初始化mqtt
  init(config) {
    const connectUrl = this.url || "wss://mqtt.djcps.com:8084/mqtt";
    const token = this.token; //token
    const username = this.username; // 用戶名
    const secretKey = this.secretKey; //密鑰

    //生成clientid (注意時間戳使用當前時間的珊泳,不要使用后端返回的,會導致密碼失敗)
    var clientId = token + "|" + "signmethod=hmacmd5,timestamp=" + Date.now();
    //生成password (這里使用HmacMD5加密囤踩, 沒有使用普通的md5)
    var password = crypto.HmacMD5(clientId, secretKey).toString();

    const options = {
      clean: true,
      protocolVersion: 4,
      protocolId: "MQTT",
      rejectUnauthorized: false,
      connectTimeout: config.connectTimeout,
      reconnectPeriod: config.reconnectPeriod,
      clientId: clientId,
      username: username,
      password: password,
      keepalive: 60,
      // 其他
      // protocol: "ws",
      // host: this.url,
      // ws: 8084,
      // wss: 8084,
      // port: 8008,
      // endpoint: "/mqtt",
    };

    // const connectUrl = `${options.protocol}://${options.host}:${options.port}${options.endpoint}`;
    // 使用地址鏈接
    this.client = mqtt.connect(connectUrl, options);
    // 消息處理
    this.client.on("message", (topic, message) => {
      let mqData = JSON.parse(message.toString());
      console.log("收到消息", topic, message, mqData);
      //接收消息
      if (config.messageCallback) {
        config.messageCallback(topic, mqData);
      }
    });
    // 重連處理
    this.client.on("reconnect", (error) => {
      console.log("正在重連:", error);
    });
    // 鏈接失敗
    this.client.on("error", (error) => {
      console.log("鏈接失敗", error);
    });
  }
  //取消訂閱
  unsubscribes() {
    this.client.unsubscribe(this.topic, (error) => {
      if (!error) {
        console.log("取消訂閱成功");
      } else {
        // console.log('取消訂閱失敗');
      }
    });
  }
  //連接
  link() {
    this.client.on("connect", (con) => {
      let qosValue = this.qos;
      this.client.subscribe(this.topic, { qosValue }, (error, res) => {
        if (!error) {
          console.log("訂閱成功");
        } else {
          console.log("訂閱失敗");
        }
      });
    });
  }
  // // 發(fā)送信息
  // SendMessage(topic, sendMsg) {
  //   let options = this.qos;
  //   this.client.publish(
  //     "rscu/sensor/exterior/up/id",
  //     sendMsg,
  //     options,
  //     (err, a) => {
  //       if (!err) {
  //         console.log("發(fā)送信息成功");
  //         // this.$message.success("發(fā)送信息成功");
  //       } else {
  //         console.log("發(fā)送信息失敗");
  //       }
  //     }
  //   );
  // }
  // //收到的消息
  // get(callback) {
  //   this.client.on("message", callback);
  // }
  //結(jié)束鏈接
  over() {
    this.client.end();
    console.log("結(jié)束鏈接");
  }
}
export default MQTT;

使用:

import MQTT from "./mqtt";

  created() {
    this.startMqtt();
    this.scanner = new Scanner();
    console.log(this.scanner);
    this.scanner.listener(this.scannerAdd);
  },
  destroyed() {
    this.endMqtt();
    this.PublicMqtt = null;
    this.scanner.end();
  },

  methods: {
    // 連接mqtt
    startMqtt() {
      const _machineInfo = JSON.parse(localStorage.getItem("machineInfo"));
      Api.get_mqttConnectInfoNoAuth(_machineInfo.deviceId)
        .then((res) => {
          console.log("請求token", res);
          if (res.success) {
            const mqttConfig = res.data;
            mqttConfig.url =
              "wss://" + mqttConfig.host + ":" + mqttConfig.port + "/mqtt";
            //設置訂閱地址
            this.PublicMqtt = new MQTT(mqttConfig);
            //初始化mqtt
            this.PublicMqtt.init({
              reconnectPeriod: 5000, //重連時間間隔
              connectTimeout: 5000,
              messageCallback: this.getMqttMessage, // 接收消息
            });
            //鏈接mqtt
            this.PublicMqtt.link();
          } else {
            console.log("未連接芯片");
          }
        })
        .catch((err) => {
          console.log(err);
        })
        .finally(() => {});
    },
    getMqttMessage(topic, message) {
      console.log("接收到消息", topic, message);
    },
    // 斷開鏈接
    endMqtt() {
      if (this.PublicMqtt) {
        this.PublicMqtt.unsubscribes();
        this.PublicMqtt.over();
      }
    },
    // 發(fā)送信息 監(jiān)測有沒有鏈接 沒有彈框
    // send(topic, message) {
    //   console.log("send方法被觸發(fā)", topic, message);
    //   if (this.PublicMqtt) {
    //     let mqttPayload = JSON.parse(message);
    //     mqttPayload.dynamicType = "";
    //     message = JSON.stringify(mqttPayload);
    //     this.PublicMqtt.SendMessage(topic, message);
    //   } else {
    //     this.$message.error("尚未連接");
    //   }
    // },
  }

其他

  1. 加密方式有 js-md5 ts-md5 crypto.HmacMD5旨椒,這里使用最后一個
//js使用
var key = md5('hello');
console.log("加密后:"key) //加密后:5d41402abc4b2a76b9719d911017c592

//ts使用
var key = Md5.hashStr('hello');
console.log("加密后:"key) //加密后:5d41402abc4b2a76b9719d911017c592

crypto.HmacMD5(clientId, secretKey).toString();
  1. 獲取到mqtt消息之后晓褪,需要通過 JSON.parse 進行處理堵漱,直接打印消息無法獲取
let mqData = JSON.parse(message.toString());
  1. 如果有如下報錯, 可能是生成密鑰的時候涣仿,時間戳不是當前時間戳導致的
mqtt Connection refused: Bad username or password
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末勤庐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子好港,更是在濱河造成了極大的恐慌愉镰,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钧汹,死亡現(xiàn)場離奇詭異丈探,居然都是意外死亡,警方通過查閱死者的電腦和手機拔莱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門碗降,熙熙樓的掌柜王于貴愁眉苦臉地迎上來隘竭,“玉大人,你說我怎么就攤上這事讼渊《矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵爪幻,是天一觀的道長菱皆。 經(jīng)常有香客問我,道長挨稿,這世上最難降的妖魔是什么仇轻? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮奶甘,結(jié)果婚禮上拯田,老公的妹妹穿的比我還像新娘。我一直安慰自己甩十,他們只是感情好船庇,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侣监,像睡著了一般鸭轮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橄霉,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天窃爷,我揣著相機與錄音,去河邊找鬼姓蜂。 笑死按厘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的钱慢。 我是一名探鬼主播逮京,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼束莫!你這毒婦竟也來了懒棉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤览绿,失蹤者是張志新(化名)和其女友劉穎策严,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饿敲,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡妻导,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倔韭。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡暑脆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出狐肢,到底是詐尸還是另有隱情添吗,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布份名,位于F島的核電站碟联,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏僵腺。R本人自食惡果不足惜鲤孵,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辰如。 院中可真熱鬧普监,春花似錦、人聲如沸琉兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌蟋。三九已至廊散,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間梧疲,已是汗流浹背允睹。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留幌氮,地道東北人缭受。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像该互,于是被迫代替她去往敵國和親米者。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容