搭建基于 nodejs 的 MQTT 服务器
一, 创建服务端
1.先从初始化一个 package.json 开始。
npm init
2.安装 mqtt 服务器必要依赖项 mosca mqtt
npm install mosca mqtt
3.根目录下创建 mqtt.js 文件,写入以下内容,创建 mqtt 简易服务器。
const mosca = require("mosca");
const MqttServer = new mosca.Server({
port: 1883
});
MqttServer.on("clientConnected", function(client) {
//当有客户端连接时的回调.
console.log("client connected", client.id);
});
/**
* 监听MQTT主题消息
* 当客户端有连接发布主题消息时
**/
MqttServer.on("published", function(packet, client) {
var topic = packet.topic;
switch (topic) {
case "temperature":
// console.log('message-publish', packet.payload.toString());
//MQTT可以转发主题消息至其他主题
//MqttServer.publish({ topic: 'other', payload: 'sssss' });
break;
case "other":
console.log("message-123", packet.payload.toString());
break;
}
});
MqttServer.on("ready", function() {
//当服务开启时的回调
console.log("mqtt is running...");
});
二,创建客户端推送
根目录下创建 publish.js 推送文件,写入以下内容:
const mqtt = require("mqtt");
const client = mqtt.connect("mqtt://127.0.0.1:1883"); //连接到mqtt服务端
//写个定时器定时每隔3秒定时推送天气信息,此业务可替换为自己的实际需求
setInterval(function() {
const value = Math.ceil(Math.random() * 40);
client.publish("temperature", value.toString(), { qos: 0, retain: true });
}, 3000);
三,创建客户端接收
根目录下创建 subscribe.js 接收文件,写入以下内容:
const mqtt = require("mqtt");
// const mqtt = require('./node_modules/mqtt/dist/mqtt.min.js')
const client = mqtt.connect("mqtt://127.0.0.1:1883"); //指定服务端地址和端口
client.on("connect", function() {
console.log("服务器连接成功");
// connected = client.connected
client.subscribe("temperature", { qos: 1 }); //订阅主题为test的消息
});
client.on("message", function(top, message) {
console.log("当前topic:", top);
console.log("当前温度:", message.toString());
});
四,测试功能
1.启动服务端 mqtt.js
根目录下命令行输入 node mqtt.js/node mqtt 运行服务端,启动成功出现以下信息:
mqtt is running…
2.启动推送客户端 publish.js
根目录下命令行输入 node publish 运行推送客户端
3.启动接收客户端 subscribe.js
根目录下命令行输入 node subscribe 运行接收客户端
不出意外,控制台将会每隔 5 秒打印以下信息
1 开一个 terminal – node mqtt
2 再一个 terminal --node publish
3 再一个 terminal --node subscribe
用vscode的话, 一共要开3个 terminal; 一个 mqtt建服务; 一个 publish发送; 一个 subscribe接收
如果在 node mqtt 时报错,
throw new SchemaError(‘Expected schema
to be an object or boolean’);
则按照下面的提示去注释代码
D:\work\web\mqtt-server\186\node_modules\jsonschema\lib\validator.js:110:11)
你的项目地址\node_modules\jsonschema\lib\validator.js:110:11)
这段, 注释掉
// if((typeof schema !== ‘boolean’ && typeof schema !== ‘object’) || schema === null){
// throw new SchemaError(‘Expected schema
to be an object or boolean’);
// }
不出意外,is running
node 建立 MQTT : publish / broker / subscrib 都在本地 127
1 if(是外部建立服务, 本地订阅),
设置 本地 subscrib
const client = mqtt.connect("mqtt://192.168.137.1:1883"); //指定外部的服务端地址和端口
同步 外部规定的 topic 和 payload
2 if(是本地建立服务, 外部订阅)
设置 本地 broker
const MqttServer = new mosca.Server({
port: 1883
});
设置 本地 publish
const client = mqtt.connect("mqtt://192.168.137.1 :1883"); //连接到本地对外建立的mqtt服务端