Nodejs 的MQTT试验

关于MQTT文章网上都是不够深刻。倒是nodemcu开发库这里,写得简单易懂,可以参考参考

http://nodemcu.readthedocs.io/en/master/en/modules/mqtt/#mqttclientsubscribe

====

先安装mqtt的包。npm install mqtt -g  和 npm install mosca -g

服务端代码mqserver.js

var moment = require('moment');
var mysql      = require('mysql');
var connection = mysql.createConnection({
  host     : 'localhost',
  user     : 'root',
  password : 'admin',
  database : 'test'
});
connection.connect();
var  userAddSql = 'INSERT INTO home(datetime,temp,humi) VALUES(?,?,?)';		//SQL插入语句格式
var  userAddSql_Params = ['2018-7-1',27.4, 85];								//插入语句字段数据


var mosca = require('mosca');
var MqttServer = new mosca.Server({
    port: 1883
});
 
MqttServer.on('clientConnected', function(client){
    console.log('client connected', client.id);
});
MqttServer.on('subscribed', function(topic, client){		//订阅
     console.log('subscribed: ', topic);
});
MqttServer.on('unSubscribed', function(topic, client){     	//取消订阅
     console.log('unSubscribed: ', topic);
})


MqttServer.on('clientDisConnected', function(client){
    console.log('client connected', client.id);
});
/**
 * 监听MQTT主题消息
 **/


MqttServer.on('published', function(packet, client) {
    var topic = packet.topic;
var qtt={}; //定义消息(可以为字符串、对象等)
qtt.topic='other';
qtt.payload='{"from":1977}';


    switch(topic){
    	case 'hmdata':
    	    console.log('mqtt-hmdata: ','topic ='+topic+',message = '+ packet.payload.toString());
    	    //MqttServer.publish({topic: 'other', payload: 'sssss'});
    	    MqttServer.publish(qtt);	//推送一个json对象,这个推送自己也会收到。
    	    //MqttServer.publish('other',JSON.stringify(qtt),{qos:1, retain: true});
			var data=JSON.parse(packet.payload.toString());							//json解析
    	    userAddSql_Params[0]=moment().format('YYYY-MM-DD HH:mm:ss');			//数组内容
     	    userAddSql_Params[1]=data.temp;
     	    userAddSql_Params[2]=data.humi;


			connection.query(userAddSql,userAddSql_Params,function (err, result) {		//sql插入数据
		        if(err){
		         console.log('[INSERT ERROR] - ',err.message);
		         return;
		        }});
    	    break;
    	case 'other':
    		console.log('mqtt-other: ', packet.payload.toString());
    		break;


    }
 
});
 
MqttServer.on('ready', function(){
    console.log('mqtt is running...');
    //MqttServer.authenticate = authenticate;
});

客户端mqclient.js

var mqtt  = require('mqtt');
var client = mqtt.connect('mqtt://118.126.X.X:1883');        //连到腾讯云服务器。
//var client = mqtt.createClient(1883, 'localhost');    //这种方式不知道是哪里的,无效
var num = 0;
var qtt={}; //定义消息(可以为字符串、对象等)
qtt.temp=25.7 + Math.random()*5;
qtt.humi=89.1 + Math.random()*10;
qtt.count=0;


setInterval(function (){   //发布主题为‘test’的消息
    qtt.count++;
    qtt.temp=(25.7 + Math.random()*5).toFixed(2);
    qtt.humi=(89.1 + Math.random()*10).toFixed(2);    //2位小数
    client.publish('hmdata',JSON.stringify(qtt),{qos:1, retain: true});// 'Hello mqtt ' + (num++)
}, 2000);


client.subscribe('hmdata',{qos:1});       //表示订阅这个hmdata消息。那么服务器推送这个hmdata时,自己才会收到,否则收不到。
client.on('message', function (topic, message) {
        // message is Buffer
        console.log('订阅的消息:'+topic + ','+  message.toString()); //打印消息内容
        //client.end();
    });



服务器显示结果:第二条消息是自己 推送的。第一条消息是客户端推送的。


客户端显示结果:取消订阅后,消息就收不到了。


  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Node.js中使用MQTT进行通信时,断线自动重连是一个常见的需求。你可以通过以下步骤实现MQTT的断线自动重连: 1. 安装MQTT库:首先,你需要安装MQTT库。在Node.js中,常用的MQTT库有`mqtt`和`mqtt.js`,你可以选择其中一个进行安装。 2. 创建MQTT客户端:使用MQTT库创建一个MQTT客户端对象,并配置连接参数,如服务器地址、端口号、客户端ID等。 3. 监听连接事件:通过监听MQTT客户端的连接事件,可以获取连接状态的变化。当连接成功建立时,可以进行订阅和发布操作;当连接断开时,可以触发重连逻辑。 4. 实现重连逻辑:在连接断开时,可以通过设置定时器,在一定时间后尝试重新连接。你可以选择指数退避算法来控制重连的时间间隔,即每次重连的时间间隔逐渐增加。 5. 错误处理:在连接过程中可能会出现错误,例如网络异常或认证失败。你可以通过监听错误事件来处理这些错误,并触发重连逻辑。 下面是一个简单的示例代码,演示了如何实现MQTT的断线自动重连: ```javascript const mqtt = require('mqtt'); const brokerUrl = 'mqtt://localhost:1883'; const clientId = 'mqtt-client'; let client; function connect() { client = mqtt.connect(brokerUrl, { clientId }); client.on('connect', () => { console.log('Connected to MQTT broker'); // 订阅主题或执行其他操作 }); client.on('close', () => { console.log('Connection closed'); // 触发重连逻辑 reconnect(); }); client.on('error', (error) => { console.error('MQTT error:', error); // 触发重连逻辑 reconnect(); }); } function reconnect() { const reconnectInterval = 1000; // 初始重连间隔为1秒 let currentInterval = reconnectInterval; setTimeout(() => { console.log('Reconnecting...'); connect(); currentInterval *= 2; // 指数退避算法,每次重连间隔加倍 }, currentInterval); } connect(); ``` 这段代码使用`mqtt`库创建了一个MQTT客户端对象,并在连接成功、连接关闭和出现错误时触发相应的事件处理函数。在连接关闭或出现错误时,会调用`reconnect`函数进行重连,使用指数退避算法控制重连的时间间隔。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值