MQTT及Webscoket的介紹及使用

MQTT是爲了物聯網場景設計的基於TCP的Pub/Sub協議,有許多爲物聯網優化的特性,好比適應不一樣網絡的QoS、層級主題、遺言等等。node

WebSocket是爲了HTML5應用方便與服務器雙向通信而設計的協議,HTTP握手而後轉TCP協議,用於取代以前的Server Push、Comet、長輪詢等老舊實現。web


MQTT:

一般用於 IOT 設備上(做爲MQTT Client),基於 TCP 有一套本身的協議棧格式。MQTT Server[也稱爲 MQTT broker]一般在 PC 上。// blog.csdn.net/benhuo93111…
MQTT Client 和 MQTT Server 一般扮演多對多的角色。 一個 Client 發佈消息,多個 Client 將會收到該消息。express

WebSocket:

一般用戶 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

MQTT over websocket:

這種場景通常用戶 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('服務器啓動成功!');
});
複製代碼
相關文章
相關標籤/搜索