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('服务器启动成功!');
});
复制代码