我们继续上一篇论文的内容继续
上一篇
对mqtt进行封装
之前用paho-mqtt这个模块,大概了解了mqtt的用法下面我用mqtt模块进行封装
以下代码可以直接复制到一个js文件中
import mqtt_module from 'mqtt'
const Mqtt = function (url) {
this.mqtt = mqtt_module
this.random = getGuid32;
this.clientId = getGuid32();
let options = {
clientId: this.clientId,
username: 'test',
password: 'test',
connectTimeout: 100,
keepalive: 100
}
this.client = this.mqtt.connect("ws://" + url + "/mqtt", options)
// 重连次数 超5次就算了
this.reconnectNum = 0
// 连接
this.link = function () {
return new Promise((resolve, reject) => {
this.client.on('connect', e => {
console.log('-----------------------链接成功-----------------------')
resolve(this.client)
})
this.client.on('reconnect', error => {
this.reconnectNum++
if (this.reconnectNum >= 10) this.client.end(true)
console.log('正在重连:', error)
})
this.client.on('error', error => {
console.log('订阅失败', error)
})
})
}
this.subscribe = function (topic, options) {
this.client.subscribe(topic, options, (err) => {
if (!err) {
console.log('-----------------------'+topic+'订阅成功-----------------------')
} else {
throw new Error(err)
}
})
}
this.publish = function (topic, sendMsg, options) {
this.client.publish(topic, JSON.stringify(sendMsg), options, (err, a) => {
if (!err) {
console.log('-----------------------'+topic+'发送成功-----------------------')
} else {
throw new Error(err)
}
})
}
this.message = function (callback) {
this.client.on('message', (topic, message) => {
let data = JSON.parse(message.toString())
callback(data, topic)
})
}
// 关闭
this.close = function () {
this.client.end(true)
}
}
export default Mqtt
function getGuid32() {
var rt_str = String.fromCharCode(65 + Math.floor(Math.random() * 26));
for (var i = 0; i < 31; ++i) {
var num = Math.floor(Math.random() * (26 + 26 + 10));
var ch_str;
if (num < 10) {
ch_str = num.toString();
} else if (num < 10 + 26) {
ch_str = String.fromCharCode(65 + num - 10);
} else {
ch_str = String.fromCharCode(97 + num - 10 - 26);
}
rt_str += ch_str;
}
return rt_str;
}
我们看看怎么使用
import Mqtt from "../utils/mqtt/mqtt";//将刚才的js引入
var mqtt = new Mqtt("xxx.xxx.xx.xx:xxxx");//里面写上ip和端口
var topic = "SpeedRegulation/CompayInfo/GetAllSiteData";//这里就是主题
mqtt.link().then((client) => {//封装成promsie方便使用
//client这里保留了原生的client函数和用法
var sendMess = { //这就是要传给后端的参数
MessageId: topic,
TopicId: topic,
Time: new Date().getTime(),
ClientID: mqtt.clientId,//这个mqtt是生成随机生成的随机数
//当然要想申请新的随机数可以mqtt.random()
};
mqtt.subscribe(topic);//订阅主题
mqtt.subscribe(topic + "/" + mqtt.clientId);//订阅主题
mqtt.publish(topic, sendMess,{qos:0})//向某个主题发送消息
mqtt.message(function (data, topic) {//接收消息,跟据返回的主题可以确定是哪个主题给的消息
console.log(data, topic);
});
});
与promsie结合的mqtt,要是有问题希望即使联系我,我进行改正