一、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/n/288639.html