1.下载node包npm install mosca mqtt --save --registry=https://registry.npm.taobao.org
2.在根路径下创建server.js
const mosca = require("mosca");
//https密钥路径
// const SECURE_KEY=dirname+'/key.pem"
// const SECURE_CERT = dirname+"/cert.pem"
//设置参数
const mqttSetting = {
interfaces: [
{ type: "mqtt", port: 1883 },
{ type: "http", port: 3000, bundle: true }
//{ type: "mqtts", port: 8883, bundle: true, credentials: { keyPath: SECURE_KEY, certPath: SECURE_CERT } },
//{ type: "https", port: 1884, bundle: true, credentials: { keyPath: SECURE_KEY, certPath: SECURE_CERT } }
]
}
//实例化
const MqttServer = new mosca.Server(mqttSetting)
//开启服务
MqttServer.on("ready", function () {
console.log("mqtt is running...");
});
//监听客户端连接
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 "test_topic":
console.log('message', packet.payload.toString());
//MQTT可以转发主题消息至其他主题
//MqttServer.publish({ topic: 'other', payload: 'sssss' });
break;
case "other":
console.log("message_other", packet.payload.toString());
break;
}
});
3.创建publish.js
const mqtt = require("mqtt");
//连接到mqtt服务端
const client = mqtt.connect("mqtt://192.168.20.147:1883/mqtt");
//写个定时器定时每隔3秒定时推送天气信息,此业务可替换为自己的实际需求
setInterval(function() {
const value = Math.ceil(Math.random() * 40);
console.log('发布了:' + value)
//发布主题为test_topic的消息
client.publish("test_topic", value.toString(), {
// QoS0,至多一次; QoS1,至少一次; QoS2,确保只有一次。
qos: 0,
retain: true
});
}, 3000);
4.创建subscribe.js
const mqtt = require("mqtt");
//连接到mqtt服务端
const client = mqtt.connect("mqtt://192.168.20.147:1883/mqtt");
client.on("connect", function() {
console.log("服务器连接成功");
// connected = client.connected
//订阅主题为test_topic的消息
client.subscribe("test_topic", {
qos: 1
});
});
client.on("message", function(top, message) {
console.log("当前topic:", top);
console.log("当前温度:", message.toString());
});
5.通过node命令分别启动server、publish、subscribe
6.uniapp创建mqtt.vue文件
<template>
<view>
<button @click="sendMessage">发送消息</button>
</view>
</template>
<script>
var mqtt = require("./mqtt.min.js");
//申明一个全局变量
var client;
export default {
data() {
return {
url: "192.168.20.147:1883/mqtt",
// url: "124.**.***.67:8000/mqtt",
// url: "192.168.20.144:3000/mqtt",
// url: "192.168.20.42:1883/mqtt",
options: {
connectTimeout: 5000,
clientId: "123214221312", //唯一ID
username: "guest", //账号 非必填 看你们设置没有
password: "guest", //密码 非必填
clean: true,
},
switches: "test_topic", //要订阅的主题
drive: "", //要订阅的主题
};
},
created() {
// this.options.clientId = plus.push.getClientInfo().clientid;
// this.options.clientId = 'LNBSCC4H7KD119471';
},
mounted() {
this.connect(); //连接
},
methods: {
//发送信息
sendMessage() {
let buffer = "test";
//this.switches 主题名称。buffer 发送的参数。可以是字符串 也可以是 Buffer;
client.publish(this.switches, buffer, (e) => {
console.log(e);
});
},
connect() {
var that = this;
//h5的连接是 'ws://' + url。
// #ifdef H5
client = mqtt.connect("ws://" + this.url, this.options);
// #endif
//app的连接是 'wx://' + url。
//#ifdef MP-WEIXIN||APP-PLUS
// client = mqtt.connect("wx://" + this.url, this.options);
// #endif
client
.on("connect", function () {
console.log("连接成功");
//that.switches 这是订阅主题名称 和接口地址差不多,是他们定义的,直接拿过来用就行,订阅成功后,就可以接收这个的信息了
client.subscribe(that.switches, function (err) {
if (!err) {
console.log("switches订阅成功");
}
});
// client.subscribe(that.drive, function (err) {
// if (!err) {
// console.log("drive订阅成功");
// }
// });
})
.on("reconnect", function (error) {
console.log("正在重连...", that.switches);
})
.on("error", function (error) {
console.log("连接失败...", error);
})
.on("end", function () {
console.log("连接断开");
})
.on("message", function (topic, message) {
console.log("接收推送信息:", message.toString());
// 统一接受信息。 topic 是订阅的主题名称,message是监听信息的接收和发送都能接收
});
},
},
};
</script>
7.启动uniapp项目即可监听到数据。
注意点:在uniapp中h5和app连接前缀分别为ws和wx要注意区分,下载的mqtt包最好是4.0。运行node server的时候可能会报错,找到报错的包的那几行,把那个函数注释掉就行了。