MQTT協(xié)議在物聯(lián)網(wǎng)中的位置就不用說(shuō)了,搞物聯(lián)網(wǎng)開(kāi)發(fā)能夠使用這個(gè)協(xié)議就好像在打籃球懂得如何快速、巧妙傳球一樣,各個(gè)部件之間的消息傳遞變得非常簡(jiǎn)單方便,本人菜鳥(niǎo)也能發(fā)現(xiàn)其中的優(yōu)勢(shì),如果有朝一日成為牛肉能夠深入了解,覺(jué)得將會(huì)前途一片光明。廢話少說(shuō),下面從一個(gè)肉菜鳥(niǎo)的角度開(kāi)始解釋這個(gè)協(xié)議在NODEJS下的簡(jiǎn)單應(yīng)用。
首先,MQTT的優(yōu)勢(shì)大家應(yīng)該都了解了,本協(xié)議特點(diǎn)是輕量級(jí)(開(kāi)銷(xiāo)很小,固定長(zhǎng)度的頭部是 2 字節(jié))、基于代理的“發(fā)布/訂閱”模式的消息傳輸、協(xié)議簡(jiǎn)潔、小巧、可擴(kuò)展性強(qiáng)、省流量、省電,并且主要針對(duì)物聯(lián)網(wǎng)條件下不可靠、低計(jì)算能力的網(wǎng)絡(luò)傳輸條件下,目前已經(jīng)應(yīng)用到企業(yè)領(lǐng)域,同時(shí)也有一定的缺點(diǎn),例如網(wǎng)上有人扯淡說(shuō)這個(gè)協(xié)議不夠成熟、實(shí)現(xiàn)較復(fù)雜、服務(wù)端組件rsmb不開(kāi)源,部署硬件成本較高,然而這個(gè)在nodejs上卻不成立,服務(wù)端只需要有nodejs運(yùn)行環(huán)境就可以非常方便的搭建MQTT服務(wù)。下面就把基本使用代碼進(jìn)行說(shuō)明:
服務(wù)端代碼:
var mosca = require('mosca');//構(gòu)建自帶服務(wù)器var MqttServer = new mosca.Server({ port: 8000});//對(duì)服務(wù)器端口進(jìn)行配置,在此端口進(jìn)行監(jiān)聽(tīng)MqttServer.on('clientConnected', function(client){//監(jiān)聽(tīng)連接 console.log('client connected', client.id);});/** * 監(jiān)聽(tīng)MQTT主題消息 **/MqttServer.on('published', function(packet, client) {//當(dāng)客戶(hù)端有連接發(fā)布主題消息 var topic = packet.topic; console.log(packet); switch(topic){ case 'test': console.log('message-publish', packet.payload.toString()); //MQTT轉(zhuǎn)發(fā)主題消息 MqttServer.publish({topic: 'other', payload: 'sssss'}); break; case 'other': console.log('message-123', packet.payload.toString()); break; }});MqttServer.on('ready', function(){當(dāng)服務(wù)開(kāi)啟時(shí) console.log('mqtt is running...');});當(dāng)mosca服務(wù)構(gòu)建完成以后,可以對(duì)消息進(jìn)行發(fā)布,代碼如下
var mqtt = require('mqtt');var client = mqtt.connect('mqtt://192.168.0.182:8000');//連接到服務(wù)端//client.subscribe('presence');var num = 0;var qtt={};//定義消息(可以為字符串、對(duì)象等)qtt.aa='asds';qtt.bb='地方';setInterval(function (){//發(fā)布主題為‘test’的消息 client.publish('test',JSON.stringify(qtt),{qos:1, retain: true});// 'Hello mqtt ' + (num++)}, 1000);然后在其他客戶(hù)端能夠?qū)ο⑦M(jìn)行訂閱
var mqtt = require('mqtt');var client= mqtt.connect('mqtt://192.168.0.182:8000');client.subscribe('test',{qos:1});//訂閱主題為test的消息client.on('message', function (topic, message) { console.log(message.toString());});
于是這個(gè)簡(jiǎn)單的MQTT協(xié)議就在nodejs中實(shí)現(xiàn)了
var MqttServer = new mosca.Server({ port: 8000});//對(duì)服務(wù)器端口進(jìn)行配置,在此端口進(jìn)行監(jiān)聽(tīng)MqttServer.on('clientConnected', function(client){//監(jiān)聽(tīng)連接 console.log('client connected', client.id);});/** * 監(jiān)聽(tīng)MQTT主題消息 **/MqttServer.on('published', function(packet, client) {//當(dāng)客戶(hù)端有連接發(fā)布主題消息 var topic = packet.topic; console.log(packet); switch(topic){ case 'test': console.log('message-publish', packet.payload.toString()); //MQTT轉(zhuǎn)發(fā)主題消息 MqttServer.publish({topic: 'other', payload: 'sssss'}); break; case 'other': console.log('message-123', packet.payload.toString()); break; }});MqttServer.on('ready', function(){當(dāng)服務(wù)開(kāi)啟時(shí) console.log('mqtt is running...');});
聯(lián)系客服