关键词

使用JavaScript和MQTT开发物联网应用示例解析

下面是关于“使用JavaScript和MQTT开发物联网应用示例解析”的完整攻略,以及其中的两个示例说明。

什么是MQTT

MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅的消息协议,常用于物联网设备和服务器之间的通信。MQTT协议的特点在于轻量和易于使用。在MQTT中,客户端可以订阅某个主题,并收到与此主题相关联的消息。当某个设备发送一条消息时,它会发布到特定的主题。所有订阅此主题的客户端都会收到这条消息。因此,MQTT协议在物联网应用中非常受欢迎。

使用MQTT进行通信

在JavaScript应用中使用MQTT,需要使用一个MQTT客户端库。常见的MQTT客户端库有MQTT.jspaho-mqtt,它们都提供了在JavaScript中进行MQTT通信的API。

首先,需要创建一个MQTT客户端实例,然后使用它来连接到MQTT代理。连接成功后,可以将客户端订阅到一个或多个主题,也可以将消息发布到一个或多个主题。以下是使用MQTT.js库的示例代码:

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://test.mosquitto.org');

client.on('connect', () => {
  console.log('MQTT Connected!');
  client.subscribe('my/topic');
});

client.on('message', (topic, message) => {
  console.log(`Received message on topic "${topic}": ${message.toString()}`);
});

client.publish('my/topic', 'Hello, MQTT!');

示例1:使用MQTT控制LED灯

下面是一种使用MQTT控制LED灯的示例。我们可以使用MQTT.js库并结合一些硬件来实现这个示例。

硬件要求

  • 一块WiFi开发板,例如ESP8266或ESP32
  • 一个LED灯
  • 一块面包板和一些杜邦线

程序设计

首先,需要将电路连接好。我们需要将LED连接到开发板的引脚,并使用一个电阻器来限制电流,这样可以避免LED烧坏。接下来,需要使用MQTT.js库创建一个MQTT客户端实例,并连接到MQTT代理。当设备连接成功并订阅了某个主题时,它可以从MQTT代理接收消息。如果代理接收了一个控制LED的消息,设备将点亮或关闭LED。

const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://test.mosquitto.org');

const ledPin = D2; // 下面会说到如何定义引脚
let ledState = 0;

function setup() {
  pinMode(ledPin, OUTPUT);
  client.on('connect', () => {
    console.log('MQTT Connected!');
    client.subscribe('led/control');
  });

  client.on('message', (topic, message) => {
    console.log(`Received message on topic "${topic}": ${message.toString()}`);

    if (message.toString() === 'on') {
      ledState = 1;
      digitalWrite(ledPin, HIGH);
      client.publish('led/status', 'on');
    } else if (message.toString() === 'off') {
      ledState = 0;
      digitalWrite(ledPin, LOW);
      client.publish('led/status', 'off');
    }
  });
}

function loop() {

}

board.on('ready', () => {
  console.log('Board ready!');
  setup();
});

可以看到,当设备订阅了名为“led/control”的主题后,设备将可以从MQTT代理接收到控制指令。如果接收到的指令是“on”,设备将点亮LED,并发布一条名为“led/status”的消息到MQTT代理。如果指令是“off”,设备将关闭LED,并发布一条值为“off”的消息。

如何定义引脚

不同的WiFi开发板,如ESP8266和ESP32,可能有不同的引脚编号和名称。如果您使用的是NodeMCU开发板,可以使用下面的代码定义引脚:

const D0 = 16;
const D1 = 5;
const D2 = 4;
const D3 = 0;
const D4 = 2;
const D5 = 14;
const D6 = 12;
const D7 = 13;
const D8 = 15;
const RX = 3;
const TX = 1;

示例2:使用MQTT发送传感器数据

以下是一种将传感器数据发送到MQTT代理的示例。设备将连接到一个DHT11温湿度传感器,并使用MQTT发送传感器数据。

硬件要求

  • 一块WiFi开发板,例如ESP8266或ESP32
  • 一个DHT11温湿度传感器
  • 一块面包板和一些杜邦线

程序设计

首先需要连接DHT11传感器到开发板的引脚。接下来,需要使用MQTT.js库创建一个MQTT客户端实例,并连接到MQTT代理。在设备连接到代理并订阅了一个主题之后,可以使用setInterval函数来定期读取传感器数据,并将数据作为JSON格式的消息发送到MQTT代理。

以下是示例代码:

const mqtt = require('mqtt');
const DHT = require('dht-sensor');

const client = mqtt.connect('mqtt://test.mosquitto.org');

const sensorPin = D4; // 下面会说到如何定义引脚

function setup() {
  client.on('connect', () => {
    console.log('MQTT Connected!');
    setInterval(sendSensorData, 3000);
  });
}

function sendSensorData() {
  const data = DHT.read(DHT.DHT11, sensorPin);
  const message = JSON.stringify({
    temperature: data.temperature.toFixed(1),
    humidity: data.humidity.toFixed(1)
  });
  console.log('Sending message:', message);
  client.publish('sensors/dht11', message);
}

function loop() {

}

board.on('ready', () => {
  console.log('Board ready!');
  setup();
});

由于DHT11温湿度传感器的数据采样速度较慢(一般是2-3秒钟),因此在程序中使用了setInterval函数来定期读取传感器数据,并将数据作为JSON格式的消息发送到MQTT代理。在此例中,设备将传感器数据发布到名为“sensors/dht11”的主题。

如何定义引脚

同样,不同的WiFi开发板,如ESP8266和ESP32,可能有不同的引脚编号和名称。如果您使用的是NodeMCU开发板,可以使用以下代码定义引脚:

const D0 = 16;
const D1 = 5;
const D2 = 4;
const D3 = 0;
const D4 = 2;
const D5 = 14;
const D6 = 12;
const D7 = 13;
const D8 = 15;
const RX = 3;
const TX = 1;

本文链接:http://task.lmcjl.com/news/19135.html

展开阅读全文