探究JSMQTT技術

一、MQTT協議介紹

MQTT(Message Queue Telemetry Transport)是一種輕量級的通信協議,其特點是簡單、輕便、有些時候還比HTTP通訊更加可靠。MQTT使用發布/訂閱(publish/subscriber)消息模式,用於連接分散式設備,讓它們能夠有效地進行數據傳輸。

與HTTP通訊協議不同的是,MQTT協議採用了二進位流請求頭MQTT報文進行通訊。相比較HTTP通訊, MQTT更加緊湊、傳輸速度更快、並且具備實時性支持。MQTT協議適用於多種設備和應用場景,例如:智能家居、汽車和工業自動化等。

const mqtt = require('mqtt')
const client  = mqtt.connect('mqtt://localhost')

client.on('connect', function () {
  client.subscribe('presence', function (err) {
    if (!err) {
      client.publish('presence', 'Hello mqtt')
    }
  })
})

client.on('message', function (topic, message) {
  // message is Buffer
  console.log(message.toString())
  client.end()
})

二、JSMQTT介紹

JSMQTT是一個基於JavaScript的MQTT庫,採用標準的MQTT協議並最小化依賴,具有很多先進的功能和優點。JSMQTT庫允許開發人員以貨車車隊(pipeline)的形式訂閱和發布消息,對於大規模消息傳輸或進程處理應用非常有利。

使用JSMQTT庫能夠很快地快速實現與MQTT消息協議的通信。特別是在移動設備或者瀏覽器中使用JSMQTT,可以更加靈活性地響應用戶輸入。

三、JSMQTT應用示例

下面是一個簡單的用於控制設備的JSMQTT示例。我的設備是一個RGB LED燈,具有三個顏色通道:紅色,綠色和藍色。通過MQTT發布消息來交互。

首先,我們需要設置一個常量,表示現在我們需要連接到哪個伺服器。在這個例子中,我們將使用的是測試MQTT伺服器,mosquitto.org伺服器的公共地址(port 1883)。

const SERVER = 'mqtt://test.mosquitto.org:1883'

然後,我們要實例化一個新的JSMQTT客戶端。我們將使用connect()方法並傳入使用的伺服器的地址,然後在open事件上綁定回調函數。這個回調函數可以簡單地發送帶有顏色值的數據包到伺服器,並回顯收到的數據包。

var client = mqtt.connect(SERVER);

client.on('connect', function () {
  // 設置三個通道
  var redChannel = 'led/red';
  var greenChannel = 'led/green';
  var blueChannel = 'led/blue';

  //訂閱三個通道,並顯示信息
  client.subscribe(redChannel, function () {
    client.publish(redChannel, 'Hello mqtt')
  })
  client.subscribe(greenChannel, function () {
    client.publish(greenChannel, 'Hello mqtt')
  })
  client.subscribe(blueChannel, function () {
    client.publish(blueChannel, 'Hello mqtt')
  })

  client.on('message', function (topic, message) {
    var value = message.toString();
    console.log(topic + ': ' + value);
  })
})

最後,我們可以通過網頁上的表單控制項來控制我們的設備。我們使用白色canvas元素作為容器來控制顏色,並在每次顏色修改時向JSMQTT伺服器發送更新。

<canvas id="colorPicker" width="300" height="300"></canvas>
<input type="range" id="redSlider" value="0" min="0" max="255" />
<input type="range" id="greenSlider" value="0" min="0" max="255" />
<input type="range" id="blueSlider" value="0" min="0" max="255" />

<script>
  var colorPicker = document.getElementById('colorPicker');
  var redSlider = document.getElementById('redSlider');
  var greenSlider = document.getElementById('greenSlider');
  var blueSlider = document.getElementById('blueSlider');
  
  // 將RGB值轉化hex顏色並發布到伺服器中
  function updateColor(r, g, b) {
    var color = (r << 16) + (g << 8) + b;
    var colorHex = '#' + color.toString(16);
    console.log(colorHex);
    client.publish('color/set', colorHex);
  }
  
  //獲取RGB值來更新顏色
  function getRGBColor() {
    var imageData = colorPicker.getContext('2d').getImageData(0, 0, 300, 300);
    var data = imageData.data;
    var r = 0, g = 0, b = 0;
    for (var i = 0, n = data.length; i < n; i += 4) {
      r += data[i];
      g += data[i + 1];
      b += data[i + 2];
    }
    var total = imageData.width * imageData.height;
    r = Math.round(r / total);
    g = Math.round(g / total);
    b = Math.round(b / total);
    redSlider.value = r;
    greenSlider.value = g;
    blueSlider.value = b;
    return { r: r, g: g, b: b };
  }
  
  //更新RGB值及顏色
  function updateRGBColor() {
    var color = getRGBColor();
    updateColor(color.r, color.g, color.b);
  }
  
  //綁定事件
  colorPicker.addEventListener('touchmove', function (e) {
    e.preventDefault();
    updateRGBColor();
  }, false);
  
  redSlider.addEventListener('change', updateRGBColor, false);
  greenSlider.addEventListener('change', updateRGBColor, false);
  blueSlider.addEventListener('change', updateRGBColor, false);
</script>

四、小結

在這篇文章中,我們深入探究了MQTT協議,並學習了如何使用JSMQTT庫來實現與MQTT消息協議的通信。特別是本文提供的示例,可以幫助讀者更好地了解MQTT協議的應用場景。希望這篇文章能夠為讀者提供實用的幫助,讓大家更好地應用MQTT技術。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/288639.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-24 03:00
下一篇 2024-12-24 03:00

相關推薦

  • Python熱重載技術

    Python熱重載技術是現代編程的關鍵功能之一。它可以幫助我們在程序運行的過程中,更新代碼而無需重新啟動程序。本文將會全方位地介紹Python熱重載的實現方法和應用場景。 一、實現…

    編程 2025-04-29
  • Python包絡平滑技術解析

    本文將從以下幾個方面對Python包絡平滑技術進行詳細的闡述,包括: 什麼是包絡平滑技術? Python中使用包絡平滑技術的方法有哪些? 包絡平滑技術在具體應用中的實際效果 一、包…

    編程 2025-04-29
  • parent.$.dialog是什麼技術的語法

    parent.$.dialog是一種基於jQuery插件的彈出式對話框技術,它提供了一個方便快捷的方式來創建各種類型和樣式的彈出式對話框。它是對於在網站開發中常見的彈窗、提示框等交…

    編程 2025-04-28
  • 微信小程序重構H5技術方案設計 Github

    本文旨在探討如何在微信小程序中重構H5技術方案,以及如何結合Github進行代碼存儲和版本管理。我們將從以下幾個方面進行討論: 一、小程序與H5技術對比 微信小程序與H5技術都可以…

    編程 2025-04-28
  • HTML sprite技術

    本文將從多個方面闡述HTML sprite技術,包含基本概念、使用示例、實現原理等。 一、基本概念 1、什麼是HTML sprite? HTML sprite,也稱CSS spri…

    編程 2025-04-28
  • Python工作需要掌握什麼技術

    Python是一種高級編程語言,它因其簡單易學、高效可靠、可擴展性強而成為最流行的編程語言之一。在Python開發中,需要掌握許多技術才能讓開發工作更加高效、準確。本文將從多個方面…

    編程 2025-04-28
  • 開源腦電波技術

    本文將會探討開源腦電波技術的應用、原理和示例。 一、腦電波簡介 腦電波(Electroencephalogram,簡稱EEG),是一種用於檢測人腦電活動的無創性技術。它通過在頭皮上…

    編程 2025-04-27
  • 阿里Python技術手冊

    本文將從多個方面對阿里Python技術手冊進行詳細闡述,包括規範、大數據、Web應用、安全和調試等方面。 一、規範 Python的編寫規範對於代碼的可讀性和可維護性有很大的影響。阿…

    編程 2025-04-27
  • TaintGraphTraversal – 使用數據流分析技術解決污點問題

    TaintGraphTraversal是一種數據流分析技術,旨在解決應用程序中污點問題。通過在程序中跟蹤數據流和標記數據源,TaintGraphTraversal可以確定哪些數據被…

    編程 2025-04-27
  • 網路數據爬蟲技術用法介紹

    網路數據爬蟲技術是指通過一定的策略、方法和技術手段,獲取互聯網上的數據信息並進行處理的一種技術。本文將從以下幾個方面對網路數據爬蟲技術做詳細的闡述。 一、爬蟲原理 網路數據爬蟲技術…

    編程 2025-04-27

發表回復

登錄後才能評論