MQTT是爲了物聯網場景設計的基於TCP的Pub/Sub協議,有許多爲物聯網優化的特性,好比適應不一樣網絡的QoS、層級主題、遺言等等。node
WebSocket是爲了HTML5應用方便與服務器雙向通信而設計的協議,HTTP握手而後轉TCP協議,用於取代以前的Server Push、Comet、長輪詢等老舊實現。web
一般用於 IOT 設備上(做爲MQTT Client),基於 TCP 有一套本身的協議棧格式。MQTT Server[也稱爲 MQTT broker]一般在 PC 上。// blog.csdn.net/benhuo93111…
MQTT Client 和 MQTT Server 一般扮演多對多的角色。 一個 Client 發佈消息,多個 Client 將會收到該消息。express
一般用戶 PC 上,Websocket也是基於 TCP 協議的,同時借用了HTTP的協議來完成一部分握手。
主要解決 HTTP 協議中一個 request 對應一個 response 的尷尬。(http server 不能主動發送消息給 http client)
www.zhihu.com/question/20…
經過 HTTP 完成 websocket 的握手過程,接着按照 websocket 協議進行通信。
websocket 也有他本身的數據幀格式: blog.csdn.net/u010487568/…bash
這種場景通常用戶 IOT 設備和 PC 設備間的通信。// blog.csdn.net/itzaibadong…
好比: IoT 做爲 MQTT Client, Mosquitto 做爲 MQTT Server, PC 做爲 websocket client.服務器
下面是可能的一種通信過程:
// Mosquitto1.4.2 以上支持 websocket。
1: PC 先經過 websocket協議和 mosquitto 創建鏈接,同時訂閱主題 A.
2: IOT 設備經過 MQTT協議和 mosquitto 創建鏈接。
3: IOT 設備發佈主題 A
4: mosquitto 將主題 A 發佈到它全部的客戶端,包括 websocket 客戶端,因此 PC 也能收到主題 A.websocket
mqtt的使用cookie
開啓鏈接,訂閱主題網絡
window.client = new Paho.MQTT.Client(hostname, port, clientId);
console.log(client.path);
let options = {
invocationContext: {
host: hostname,
port: port,
path: client.path,
clientId: clientId
},
//timeout: timeout,
//keepAliveInterval: keepAlive,
//cleanSession: cleanSession,
//useSSL: ssl,
userName: userName,
password: password,
onSuccess: function(){
console.log("onConnected");
client.subscribe(topic);
},
onFailure: function (e) {
console.log(e);
setTimeout(function () {
startConnect(clientId,topic)
},timeout)
}
};
try {
client.connect(options);
} catch (e) {
console.log("鏈接失敗");
console.log(e.message);
}
client.onConnectionLost = onConnectionLost;
function onConnectionLost(responseObject) {
console.log(responseObject);
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:" + responseObject.errorMessage);
console.log("鏈接已斷開");
}
}複製代碼
發送消息session
let message = new Paho.MQTT.Message(msg);
message.destinationName = topic;
message.qos = qos;
client.send(message);複製代碼
接收消息app
client.onMessageArrived = function (message) {
console.log({"data":new Date().getTime(),"msg":message.payloadString});
};複製代碼
webscoket的使用
開啓鏈接及各個事件
var wsServer = new WebSocket('ws://localhost:8000');
wsServer.onopen = function (e) {
if(times==0){
times++;
wsServer.send(JSON.stringify(msg));
}
(typeof e == 'string') && wsServer.send(JSON.stringify(msg));//向後臺發送數據
};
wsServer.onclose = function (e) {//當連接關閉的時候觸發
};
wsServer.onmessage = function (e) {//後臺返回消息的時候觸發
console.log(e);
};
wsServer.onerror = function (e) {//錯誤狀況觸發
};複製代碼
這是基於node的webscoket服務器
(草稿代碼)
var express = require('express');
var http = require('http');
var WebSocket = require('ws');
var session = require('express-session');
var app = express();
app.use(session({
secret: 'sessiontest',//與cookieParser中的一致
resave: true,
saveUninitialized:true
}));
app.use(express.static(__dirname));
var server = http.createServer(app);
var wss = new WebSocket.Server({server});
var webSockets = {};
wss.on('connection', function connection(ws) {
console.log('連接成功!');
console.log(ws);
/*webSockets[userid] = ws;*/
ws.on('message', function incoming(data) {
var userid = JSON.parse(data).userid;
var to = JSON.parse(data).to;
var msg = JSON.parse(data).msg;
webSockets[userid] = ws;
if(webSockets[to]!=undefined){
webSockets[to].send(data)
}else {
webSockets[userid].send(to+':未上線')
}
/**
* 把消息發送到全部的客戶端
* wss.clients獲取全部連接的客戶端
*/
/* wss.clients.forEach(function each(client) {
client.send(data);
});*/
/* console.log(webSockets[to])*/
});
});
server.listen(8000, function listening() {
console.log('服務器啓動成功!');
});
複製代碼