記錄一下自己學(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)容,有空再寫才沧。