溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MQTT.js入門使用的方法是什么

發(fā)布時(shí)間:2023-04-15 10:26:25 來(lái)源:億速云 閱讀:102 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“MQTT.js入門使用的方法是什么”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“MQTT.js入門使用的方法是什么”文章能幫助大家解決問(wèn)題。

    簡(jiǎn)介

    MQTT.js 是一個(gè)開源的 MQTT 協(xié)議的客戶端庫(kù),使用 JavaScript 編寫,主要用于 Node.js 和 瀏覽器環(huán)境中。是目前 JavaScript 生態(tài)中使用最為廣泛的 MQTT 客戶端庫(kù)。

    MQTT 是一種基于發(fā)布/訂閱模式的輕量級(jí)物聯(lián)網(wǎng)消息傳輸協(xié)議,可以用極少的代碼和帶寬為聯(lián)網(wǎng)設(shè)備提供實(shí)時(shí)可靠的消息服務(wù),它廣泛應(yīng)用于物聯(lián)網(wǎng)、移動(dòng)互聯(lián)網(wǎng)、智能硬件、車聯(lián)網(wǎng)、電力能源等行業(yè)。

    由于 JavaScript 單線程特性,MQTT.js 是全異步 MQTT 客戶端,MQTT.js 支持 MQTT/TCP、MQTT/TLS、MQTT/WebSocket,在不同運(yùn)行環(huán)境支持的度如下:

    • 瀏覽器環(huán)境:MQTT over WebSocket(包括微信小程序、支付寶小程序等定制瀏覽器環(huán)境)

    • Node.js 環(huán)境:MQTT、MQTT over WebSocket

    注意:不同環(huán)境里除了少部分連接參數(shù)不同,其他 API 均是相同的。且在 MQTT.js v3.0.0 及以上版本后,已經(jīng)完整支持到 MQTT 5.0。

    安裝

    使用 npm 或 yarn 安裝

    npm install mqtt --save
    
    # 或使用 yarn
    
    yarn add mqtt

    注意:如果您的 Node 環(huán)境是 v12 或 v14 及以上版本,請(qǐng)使用 MQTT.js 4.0.0 及以上版本

    使用 CDN 安裝

    瀏覽器環(huán)境中,我們還可以使用 CDN 的方式引入 MQTT.js。MQTT.js 的 bundle 包通過(guò) http://unpkg.com 管理,我們可以直接添加 unpkg.com/mqtt/dist/mqtt.min.js 來(lái)進(jìn)行使用。

    <script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script>
    <script>
      // 將在全局初始化一個(gè) mqtt 變量
      console.log(mqtt)
    </script>

    全局安裝

    除了上述的安裝方式外,MQTT.js 還提供了全局安裝的方式,使用命令行工具來(lái)完成 MQTT 的連接、發(fā)布和訂閱等。

    npm install mqtt -g

    我們會(huì)在下文中的一些使用教程中詳細(xì)描述如何使用 MQTT.js 的命令行工具。

    使用

    本文將使用 EMQX Cloud 提供的 免費(fèi)公共 MQTT 服務(wù)器 作為本次測(cè)試的 MQTT 服務(wù)器地址,服務(wù)器接入信息如下:

    • Broker: broker.emqx.io

    • TCP Port: 1883

    • SSL/TLS Port: 8883

    更多詳情請(qǐng)?jiān)L問(wèn) EMQX Cloud 官網(wǎng),或查看 EMQX Cloud 文檔。

    簡(jiǎn)單例子

    我們簡(jiǎn)單編寫一段代碼實(shí)現(xiàn)連接到 EMQX Cloud 并完成訂閱主題、收發(fā)消息的簡(jiǎn)單例子。因?yàn)樵跒g覽器環(huán)境中僅支持使用 WebSocket 連接,所以我們將使用在瀏覽器環(huán)境和 Node.js 環(huán)境兩種不同的連接參數(shù)來(lái)完成連接。不過(guò)除連接地址外,其它參數(shù)均是相同的,因此讀者可根據(jù)自己的實(shí)際情況選擇使用。

    const mqtt = require('mqtt')
    
    /***
     * 瀏覽器環(huán)境
     * 使用協(xié)議為 ws 和 wss 的 MQTT over WebSocket 連接
     * EMQX 的 ws 連接默認(rèn)端口為 8083,wss 為 8084
     * 注意需要在連接地址后加上一個(gè) path, 例如 /mqtt
     */
    const url = 'ws://broker.emqx.io:8083/mqtt'
    /***
     * Node.js 環(huán)境
     * 使用協(xié)議為 mqtt 和 mqtts 的 MQTT over TCP 連接
     * EMQX 的 mqtt 連接默認(rèn)端口為 1883,mqtts 為 8084
     */
    // const url = 'mqtt://broker.emqx.io:1883'
    
    // 創(chuàng)建客戶端實(shí)例
    const options = {
      // Clean session
      clean: true,
      connectTimeout: 4000,
      // 認(rèn)證信息
      clientId: 'emqx_test',
      username: 'emqx_test',
      password: 'emqx_test',
    }
    const client = mqtt.connect(url, options)
    client.on('connect', function () {
      console.log('Connected')
      // 訂閱主題
      client.subscribe('test', function (err) {
        if (!err) {
          // 發(fā)布消息
          client.publish('test', 'Hello mqtt')
        }
      })
    })
    
    // 接收消息
    client.on('message', function (topic, message) {
      // message is Buffer
      console.log(message.toString())
      client.end()
    })

    命令行

    在全局安裝完 MQTT.js 后,我們同樣可以使用命令行工具來(lái)完成主題訂閱消息發(fā)布接收的動(dòng)作。

    示例連接到 broker.emqx.io 并訂閱 testtopic/# 主題:

    mqtt sub -t 'testtopic/#' -h 'broker.emqx.io' -v

    示例連接到 broker.emqx.io 并向 testtopic/hello 主題發(fā)送消息

    mqtt pub -t 'testtopic/hello' -h 'broker.emqx.io' -m 'from MQTT.js'

    如需使用功能更加全面的 MQTT 命令行工具,可參考使用 MQTT X CLI。

    API 介紹

    mqtt.connect([url], options)

    連接到指定的 MQTT Broker 的函數(shù),并始終返回一個(gè) Client 對(duì)象。第一個(gè)參數(shù)傳入一個(gè) URL 值,URL 可以是以下協(xié)議:mqttmqttstcptlswswss。URL 也可以是一個(gè)由 URL.parse() 返回的對(duì)象。然后再傳入一個(gè) Options 對(duì)象,用于配置 MQTT 連接時(shí)的選項(xiàng)。當(dāng)使用 WebSocket 連接時(shí)需要注意地址后是否需要加上一個(gè) path,例如 /mqtt。

    下面列舉一些常用的 Options 對(duì)象中的屬性值:

    • Options

      • topic: 遺囑發(fā)送的 Topic

      • payload: 遺囑發(fā)布的消息

      • QoS: 遺囑發(fā)送的 QoS 值

      • retain: 遺囑發(fā)布的消息的 retain 標(biāo)志

      • keepalive: 單位為,數(shù)值類型,默認(rèn)為 60 秒,設(shè)置為 0 時(shí)禁止

      • clientId: 默認(rèn)為 'mqttjs_' + Math.random().toString(16).substr(2, 8),可以支持自定義修改的字符串

      • protocolVersion: MQTT 協(xié)議版本號(hào),默認(rèn)為 4(v3.1.1)可以修改為 3(v3.1)和 5(v5.0)

      • clean: 默認(rèn)為 true,是否清除會(huì)話。當(dāng)設(shè)置為 true 時(shí),斷開連接后將清除會(huì)話,訂閱過(guò)的 Topics 也將失效。當(dāng)設(shè)置為 false 時(shí),離線狀態(tài)下也能收到 QoS 為 1 和 2 的消息

      • reconnectPeriod: 重連間隔時(shí)間,單位為毫秒,默認(rèn)為 1000 毫秒,注意:當(dāng)設(shè)置為 0 以后將取消自動(dòng)重連

      • connectTimeout: 連接超時(shí)時(shí)長(zhǎng),收到 CONNACK 前的等待時(shí)間,單位為毫秒,默認(rèn) 30000 毫秒

      • username: 認(rèn)證用戶名,如果 Broker 要求用戶名認(rèn)證的話,請(qǐng)?jiān)O(shè)置該值

      • password: 認(rèn)證密碼,如果 Broker 要求密碼認(rèn)證的話,請(qǐng)?jiān)O(shè)置該值

      • will: 遺囑消息,一個(gè)可配置的對(duì)象值,當(dāng)客戶端非正常斷開連接時(shí),Broker 就會(huì)向遺囑 Topic 里面發(fā)布一條消息,格式為:

      • properties: MQTT 5.0 新增,可配置的對(duì)象的屬性值,詳情請(qǐng)參考:https://github.com/mqttjs/MQTT.js#mqttclientstreambuilder-options

    • 如果需要配置 SSL/TLS 連接,Option 對(duì)象會(huì)被傳遞給 tls.connect() ,因此可以在 option 中配置以下屬性

      • rejectUnauthorized: 是否驗(yàn)證服務(wù)端證書鏈和地址名稱,設(shè)置為 false 時(shí)將跳過(guò)驗(yàn)證,會(huì)暴露在中間人的攻擊之下,所以不建議在生產(chǎn)環(huán)境中使用這種配置,當(dāng)設(shè)置為 true 時(shí),將開啟強(qiáng)認(rèn)證模式,且如果是自簽名證書,請(qǐng)?jiān)谧C書配置時(shí)設(shè)置 Alt name。

      • ca: 只有在服務(wù)器使用自簽名證書時(shí)才有必要,自簽名證書中生成的 CA 文件

      • cert: 只有當(dāng)服務(wù)器需要客戶證書認(rèn)證時(shí)才有必要(雙向認(rèn)證),客戶端證書

      • key: 只有當(dāng)服務(wù)器需要客戶證書認(rèn)證時(shí)才有必要(雙向認(rèn)證),客戶端密鑰

    Client 事件

    當(dāng)連接成功后,返回的 Client 對(duì)象可通過(guò) on 方法監(jiān)聽多個(gè)事件,業(yè)務(wù)邏輯可在監(jiān)聽的回調(diào)函數(shù)中完成。以下列舉一些常用的事件:

    connect

    當(dāng)連接成功時(shí)觸發(fā),參數(shù)為 connack

    client.on('connect', function (connack) {
      console.log('Connected')
    })

    reconnect

    當(dāng)斷開連接后,經(jīng)過(guò)重連間隔時(shí)間重新自動(dòng)連接到 Broker 時(shí)觸發(fā)

    client.on('reconnect', function () {
      console.log('Reconnecting...')
    })

    close

    在斷開連接以后觸發(fā)

    client.on('close', function () {
      console.log('Disconnected')
    })

    disconnect

    在收到 Broker 發(fā)送過(guò)來(lái)的斷開連接的報(bào)文時(shí)觸發(fā),參數(shù) packet 即為斷開連接時(shí)接收到的報(bào)文,MQTT 5.0 中的功能

    client.on('disconnect', function (packet) {
      console.log(packet)
    })

    offline

    當(dāng)客戶端下線時(shí)觸發(fā)

    client.on('offline', function () {
      console.log('offline')
    })

    error

    當(dāng)客戶端無(wú)法成功連接時(shí)或發(fā)生解析錯(cuò)誤時(shí)觸發(fā),參數(shù) error 為錯(cuò)誤信息

    client.on('error', function (error) {
      console.log(error)
    })

    message

    當(dāng)客戶端收到一個(gè)發(fā)布過(guò)來(lái)的 Payload 時(shí)觸發(fā),其中包含三個(gè)參數(shù),topic、payload 和 packet,其中 topic 為接收到的消息的 topic,payload 為接收到的消息內(nèi)容,packet 為 MQTT 報(bào)文信息,其中包含 QoS、retain 等信息

    client.on('message', function (topic, payload, packet) {
      // Payload is Buffer
      console.log(`Topic: ${topic}, Message: ${payload.toString()}, QoS: ${packet.qos}`)
    })

    Client 方法

    Client 除監(jiān)聽事件外,也內(nèi)置一些方法,用來(lái)進(jìn)行發(fā)布訂閱的操作等,以下列舉一些常用的方法。

    Client.publish(topic, message, [options], [callback])

    向某一 topic 發(fā)布消息的函數(shù)方法,其中包含四個(gè)參數(shù):

    // 向 testtopic 主題發(fā)送一條 QoS 為 0 的測(cè)試消息
    client.publish('testtopic', 'Hello, MQTT!', { qos: 0, retain: false }, function (error) {
      if (error) {
        console.log(error)
      } else {
        console.log('Published')
      }
    })
    • topic: 要發(fā)送的主題,為字符串

    • message: 要發(fā)送的主題的下的消息,可以是字符串或者是 Buffer

    • options: 可選值,發(fā)布消息時(shí)的配置信息,主要是設(shè)置發(fā)布消息時(shí)的 QoS、Retain 值等。

    • callback: 發(fā)布消息后的回調(diào)函數(shù),參數(shù)為 error,當(dāng)發(fā)布失敗時(shí),該參數(shù)才存在

    Client.subscribe(topic/topic array/topic object, [options], [callback])

    訂閱一個(gè)或者多個(gè) topic 的方法,當(dāng)連接成功需要訂閱主題來(lái)獲取消息,該方法包含三個(gè)參數(shù):

    // 訂閱一個(gè)名為 testtopic QoS 為 0 的 Topic
    client.subscribe('testtopic', { qos: 0 }, function (error, granted) {
      if (error) {
        console.log(error)
      } else {
        console.log(`${granted[0].topic} was subscribed`)
      }
    })
    • topic: 可傳入一個(gè)字符串,或者一個(gè)字符串?dāng)?shù)組,也可以是一個(gè) topic 對(duì)象,{'test1': {qos: 0}, 'test2': {qos: 1}}

    • options: 可選值,訂閱 Topic 時(shí)的配置信息,主要是填寫訂閱的 Topic 的 QoS 等級(jí)的

    • callback: 訂閱 Topic 后的回調(diào)函數(shù),參數(shù)為 error 和 granted,當(dāng)訂閱失敗時(shí) error 參數(shù)才存在, granted 是一個(gè) {topic, qos} 的數(shù)組,其中 topic 是一個(gè)被訂閱的主題,qos 是 Topic 是被授予的 QoS 等級(jí)

    Client.unsubscribe(topic/topic array, [options], [callback])

    取消訂閱單個(gè)主題或多個(gè)主題,該方法包含三個(gè)參數(shù):

    // 取消訂閱名為 testtopic 的 Topic
    client.unsubscribe('testtopic', function (error) {
      if (error) {
        console.log(error)
      } else {
        console.log('Unsubscribed')
      }
    })
    • topic: 可傳入一個(gè)字符串或一個(gè)字符串?dāng)?shù)組

    • options: 可選值,取消訂閱時(shí)的配置信息

    • callback: 取消訂閱時(shí)的回調(diào)函數(shù),參數(shù)為 error,當(dāng)取消訂閱失敗時(shí) error 參數(shù)才存在

    Client.end([force], [options], [callback])

    關(guān)閉客戶端,該方法包含三個(gè)參數(shù):

    client.end()
    • force: 設(shè)置為 true 時(shí)將立即關(guān)閉客戶端,而無(wú)需等待斷開連接的消息被接受。這個(gè)參數(shù)是可選的,默認(rèn)為 false。注意:使用該值為 true 時(shí),Broker 無(wú)法接收到 disconnect 的報(bào)文

    • options: 可選值,關(guān)閉客戶端時(shí)的配置信息,主要是可以配置 reasonCode,斷開連接時(shí)的 Reason Code

    • callback: 當(dāng)客戶端關(guān)閉時(shí)的回調(diào)函數(shù)

    關(guān)于“MQTT.js入門使用的方法是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI