使用Node.js實現(xiàn)mqtt協(xié)議

記錄一下自己學(xué)習(xí)mqtt的過程,如何從零開始使用Node.js實現(xiàn)mqtt協(xié)議巴粪,實現(xiàn)一個web頁面向android端或其他client端發(fā)送消息,并接收其他client端發(fā)送的消息顯示在web頁面上淮阐。

主要用到的node模塊是mqtt灌砖、mosca,web端使用mosca的mqtt over websocket功能印蔬,搭建web server可以使用express勋桶,存儲數(shù)據(jù)以及mosca的backen都采用mongodb。

1扛点、什么是MQTT

參見這位博主翻譯的一系列hiveMQ 的文檔哥遮,MQTT Part 1 簡介 - 簡書,非常詳盡了陵究。

2、安裝nodejs模塊

默認(rèn)看到這篇文章的人已經(jīng)了解Node.js

npm install mqtt --save

npm install mosca --save

安裝mosca時奥帘,可能會遇到缺少依賴和環(huán)境的問題铜邮,

可能碰到ERR! configure error gyp ERR! stack Error: Can't find Python executable "python",?,需要安裝python 2.7的環(huán)境。

還有可能碰到error MSB3428: Could not load the Visual C++ component "VCBuild.exe".遇到這個問題請安裝visual studio 2015,不要裝2017寨蹋,然后

npm config set msvs_version 2015 --global

安裝好后打開ide隨便新建一個project松蒜,這樣你需要的一切其他配置所需文件都有了,否則還會遇到各種其他問題已旧,比如

?node-gyp configure build KeyError: '2017' gyp ERR! configure error?vs版本錯誤

Error: `C:\Program Files (x86)\MSBuild\14.0\bin\msbuild.exe`

MSB8036: The Windows SDK version 8.1 was not found.? 安裝對應(yīng)sdk版本或vs中建project解決

error TRK0005: Failed to locate: "CL.exe". The system cannot find the file??vs中建project解決

3秸苗、使用mqtt.js創(chuàng)建一個客戶端用于測試

建立mqtt_client.js

這是MQTT.js文檔中給出的example,看這里 GitHub - mqttjs/MQTT.js: The MQTT client for Node.js and the browser运褪,連接到mosquitto的一個mqtt測試用server惊楼,subscribe訂閱,publish發(fā)表秸讹,client.on('connect')連接已建立檀咙,client.on('message')收到訂閱的消息,其他更多api等用法看文檔璃诀。

運行響應(yīng)可能有點慢弧可,如果配置成功,以上代碼運行成功會顯示


4劣欢、建立mqtt服務(wù)端(broker)

mqtt本質(zhì)上是client之間通過一個中間人即broker棕诵,來進行相互通信裁良,之后通過websocket進行連接的web端也是一個client。服務(wù)端的搭建我們使用mosca校套,開源免費价脾。文檔什么的看這里Mosca basic usage · mcollina/mosca Wiki · GitHub

根據(jù)mosca的作者mcollina的解釋,mosca只實現(xiàn)mqtt協(xié)議搔确,大量的pub/sub服務(wù)需要一個backend作為支持彼棍。我們首先不使用backend,測試服務(wù)端與客戶端的通信膳算。建立mqtt_server.js


node運行后座硕,cmd窗口會顯示“Mosca server is up and running”,證明server已啟動

5涕蜂、測試客戶端與服務(wù)端的通信

將第3步中的mqtt_client.js 第二行?

var client=mqtt.connect('mqtt://test.mosquitto.org')? 修改為

var client=mqtt.connect('mqtt://localhost')

再打開新的cmd窗口運行客戶端华匾,就可以建立與第四步中的server之間的通信啦。

成功通信后client端會顯示'hello mqtt',而server端會顯示連接的client ID机隙,以及訂閱發(fā)布的主題等蜘拉。

6、使用mongodb作為backend

首先當(dāng)然要在本地配置mongodb有鹿,具體配置過程不表旭旭,有很多文章講解。

修改mqtt_server.js ,添加backend設(shè)置


然后在mongodb中建立mqtt的database葱跋,建立ascoltatori的collection持寄,注意這個collection必須是固定集合(capped),否則會報錯 ’Error: Cannot recover. Collection is not capped. mosca‘娱俺。

成功之后稍味,在你建立的collection中就會存儲所有連接的client的ID,sub/pub操作荠卷,topic等等模庐。


7、通過server向client 發(fā)送消息

在server端的setup()函數(shù)中添加publish的代碼段油宜,注意這里不能直接把文檔中的示例代碼直接復(fù)制過來跑掂碱,會報錯?Cannot read property 'insert' of undefined at EventEmitter.MongoAscoltatore.publish

= =因為是異步執(zhí)行所以不寫在setup里可能server還沒ready就publish了。



然后還要修改一下mqtt_client.js,把client.end()去掉验庙,還要訂閱message topic顶吮。

然后啟動服務(wù)端客戶端客戶端,就能從客戶端看到message里的信息了粪薛。

8悴了、mqtt over websockets

在工程目錄下新建index.html


那個src中的mqtt.js存在于你深深的node module文件夾里,node module/mosca/public?

然后在mqtt.server.js中添加web server的信息


然后啟動完服務(wù)端,瀏覽器打開localhost:3000/index.html就打開了web的client端啦湃交,啟動mqtt_client.js,兩個client端可以實現(xiàn)通信了熟空。


先寫到這里 ,之后或許使用express做路由分發(fā)搞莺,mongodb存儲發(fā)送的信息息罗,豐富html頁面內(nèi)容,有空再寫才沧。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迈喉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子温圆,更是在濱河造成了極大的恐慌挨摸,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岁歉,死亡現(xiàn)場離奇詭異得运,居然都是意外死亡,警方通過查閱死者的電腦和手機锅移,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門熔掺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人非剃,你說我怎么就攤上這事置逻。” “怎么了备绽?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵诽偷,是天一觀的道長。 經(jīng)常有香客問我疯坤,道長,這世上最難降的妖魔是什么深浮? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任压怠,我火速辦了婚禮,結(jié)果婚禮上飞苇,老公的妹妹穿的比我還像新娘菌瘫。我一直安慰自己,他們只是感情好布卡,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布雨让。 她就那樣靜靜地躺著,像睡著了一般忿等。 火紅的嫁衣襯著肌膚如雪栖忠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天,我揣著相機與錄音庵寞,去河邊找鬼狸相。 笑死,一個胖子當(dāng)著我的面吹牛捐川,可吹牛的內(nèi)容都是我干的脓鹃。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼古沥,長吁一口氣:“原來是場噩夢啊……” “哼瘸右!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起岩齿,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤太颤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纯衍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栋齿,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年襟诸,在試婚紗的時候發(fā)現(xiàn)自己被綠了瓦堵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡歌亲,死狀恐怖菇用,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陷揪,我是刑警寧澤惋鸥,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站悍缠,受9級特大地震影響卦绣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜飞蚓,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一滤港、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧趴拧,春花似錦溅漾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脑又,卻和暖如春暮胧,著一層夾襖步出監(jiān)牢的瞬間锐借,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工叔壤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞎饲,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓炼绘,卻偏偏與公主長得像嗅战,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子俺亮,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容