Node.jsでMQTTを使う
Node.jsでMQTT通信を行う方法です。
実運用よりは、IoTデバイスとのMQTT通信を行うクライアントアプリの試験サーバとして活用できるかなと思います。
MQTTはBroker、Publisher、Subscriberで通信を行います。ここではそれぞれの実装方法を紹介します。
MQTT Broker
BrokerにはAedesを使います。
インストール
npm install aedes
npm install net
ソースコード
"use strict";
const aedes = require('aedes')();
const server = require('net').createServer(aedes.handle);
const Port = 1883;
// クライアントエラー.
aedes.on('clientError', (client, error) => {
console.error('client error', client.id);
console.error(error);
})
// 接続エラー.
aedes.on('connectionError', (client, error) => {
console.error('connection error', client.id);
console.error(error);
});
// publish.
aedes.on('publish', (packet, client) => {
console.log('publish', client);
});
// subscribe.
aedes.on('subscribe', (subscriptions, client) => {
console.log('subscribe', client.id);
});
// subscribe 解除.
aedes.on('unsubscribe', (unsubscriptions, client) => {
console.log('unsubscribe', client.id);
});
// 新規クライアントが登録.
aedes.on('client', (client) => {
console.log('client', client.id);
});
// クライアントの切断.
aedes.on('clientDisconnect', (client) => {
console.log('clientDisconnect', client.id);
});
// MQTT Brokerの起動.
server.listen(Port, () => {
console.log('MQTT Broker start');
});
Publisher
PublisherとSubscriberにはmqttを使います。
インストール
npm install mqtt
ソースコード
一度だけpublishするサンプルです。
"use strict";
const mqtt = require('mqtt');
const _topic = 'apikey/v1/topic';
const mqttOpt = {
port: 1883,
};
const client = mqtt.connect('mqtt://<ホスト名>', mqttOpt);
client.on('connect', () => {
// 'mqtt test'という文字列を送信.
client.publish(_topic, 'mqtt test');
client.end();
});
オブジェクトを送りたい場合はJSON.stringify()
で一旦文字列にします。
const data = {};
data.no = 100;
data.msg = 'mqtt test';
client.publish(_topic, JSON.stringify(data));
Subscriber
ソースコード
一度メッセージを受信したら終了するサンプルです。
"use strict";
const mqtt = require('mqtt');
const _topic = 'apikey/v1/topic';
const mqttOpt = {
port: 1883,
};
const client = mqtt.connect('mqtt://<ホスト名>', mqttOpt);
client.on('connect', () => {
client.subscribe(_topic, (error) => {
if (error) {
console.error(`subscribe ${_topic} error.`);
client.end();
return;
}
console.log(`subscribe ${_topic} success.`);
});
});
client.on('message', (topic, message) => {
console.log("on messsage", topic, message);
// message is Buffer.
console.log(message.toString());
client.end();
});
実行方法
- mqtt-broker.js
- subscribe.js
- publish.js
の順で実行します。
publish.jsを実行すると、subscribe.jsのclient.on('message')
がコールされます。