成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

mosquitto 與 websocket 的結(jié)合

joy968 / 1335人閱讀

摘要:前言作為一個(gè)消息代理客戶端與服務(wù)端的通信時(shí)基于協(xié)議的而現(xiàn)在的主流應(yīng)用時(shí)呈現(xiàn)在瀏覽器中這意味著用戶與服務(wù)端只能通過或者這類瀏覽器能理解的協(xié)議傳輸所以后端還要建立一個(gè)代理層將協(xié)議傳輸?shù)膬?nèi)容解析一下以協(xié)議發(fā)送到最后再由發(fā)送到硬件端在瀏覽器支持的協(xié)

前言

mosquitto 作為一個(gè)消息代理, 客戶端與 mosquitto 服務(wù)端的通信時(shí)基于 MQTT 協(xié)議的, 而現(xiàn)在的主流 web 應(yīng)用時(shí)呈現(xiàn)在瀏覽器中, 這意味著用戶與服務(wù)端只能通過 HTTP 或者 HTTPS 這類瀏覽器能理解的協(xié)議傳輸, 所以后端還要建立一個(gè)代理層, 將 HTTP 協(xié)議傳輸?shù)膬?nèi)容解析一下以 MQTT 協(xié)議發(fā)送到 mosquitto, 最后再由 mosquitto 發(fā)送到硬件端.

在瀏覽器支持的協(xié)議中, 還有一個(gè)適用于長(zhǎng)連接的 WS 協(xié)議, 參考: 瀏覽器中常見網(wǎng)絡(luò)協(xié)議介紹. 如果客戶端直接通過 websocket 連接到 mosquitto 端, 那么就不需要中間的后端代理層. 后端只需要一個(gè)推送服務(wù)和控制系統(tǒng)就可以實(shí)現(xiàn)對(duì)客戶端的監(jiān)聽, 控制, 推送(當(dāng)然, 如果業(yè)務(wù)量巨大, 業(yè)務(wù)邏輯復(fù)雜, 代理層還是有必要的, 因?yàn)檫@樣不但可以為 mosquitto 過濾一些不必要的業(yè)務(wù), 而且可以做一些數(shù)據(jù)統(tǒng)計(jì), 設(shè)計(jì)事件鉤子).

在編譯 mosquitto 和它的驗(yàn)證插件 mosquitto-auth-plug 的時(shí)候, 我注意到 mosquitto 有一個(gè)監(jiān)聽的 9001 端口, 事后查了一下, 發(fā)現(xiàn) mosquitto 開放的這個(gè)端口是支持直接與客戶端進(jìn)行 websocket 通信的.

啟用 mosquitto websocket 模式

其實(shí)純粹的 MQTT 服務(wù)器是沒有這個(gè)功能的, mosquitto 需要在編譯的時(shí)候設(shè)置 configure.mk

WITH_WEBSOCKETS := yes

所幸的是, eclipse 官方的 docker 鏡像 已經(jīng)支持了 websocket 通信方式. 只需要在 mosquitto.conf 中啟用:

port 1883
listener 9001
protocol websockets
使用 paho-mqtt.js 通過 websocket 與 mosquitto 通信

eclipse 提供了用于 瀏覽器客戶端利用 javascript 和 mosquitto 進(jìn)行 websocket 通信的 paho-mqtt.js, 這是這個(gè) js 庫的文檔: Paho.MQTT DOC.

客戶端與服務(wù)端的雙通道通信

我們假設(shè)有客戶端用戶為 client, 服務(wù)端用戶為 server. 為他們分配的主題與權(quán)限為:

 id | username |      topic         | rw 
----+----------+--------------------+----
  1 | client   | /p/client/upload   |  2
  2 | server   | /p/client/upload   |  2
  3 | client   | /p/client/download |  1
  4 | server   | /p/client/download |  2

那么 server 和 client 均可以在 /p/client/upload 讀寫. 我們約定只有 client 在 /p/client/upload 寫, server 只讀 /p/client/upload, 這個(gè) topic 是用于 client 向 server 發(fā)送消息.

對(duì)于 topic /p/client/download, server 可讀可寫, client 只讀, 這個(gè) topic 是用于 client 接受 server 向下推送的消息, 具體的邏輯如下:

注意這里的 client 是對(duì) /p/client/upload 具有可讀可寫權(quán)限的, 意味者它可以讀取來自 /p/client/upload 的信息, 但是實(shí)際上這里沒有人往這個(gè)主題發(fā)布消息(除非 client 自己往這里發(fā)消息), 所以 client 擁有可讀權(quán)限也沒有關(guān)系.

客戶端的 javascript 通信例子

建議看一下這篇文章: Using MQTT Over WebSockets with Mosquitto, 它比較詳細(xì)地介紹了客戶端通過 websocket 于 mosquitto 服務(wù)器通信的方式.
比如對(duì)于 client.html:
先引入 paho-mqtt.js, 這里我們先用 cloudflare.com CDN上的這段 js:

下面是創(chuàng)建客戶端 websocket 的例子:

var mqtt;
var host = "mosquitto";
var port = 9001;

// onConnect 事件
function onConnect() {
    console.log("connected.");
    var raw_message = "Hello World!";
    message = new Paho.MQTT.Message(raw_message);
    message.destinationName = "/p/client/upload";
    console.log("sending message: " + raw_message );
    mqtt.send(message);

    // 訂閱 download topic
    var subOptions = {
        qos: 1,
        onSuccess: onSubscribe
    };
    mqtt.subscribe("/p/client/download", subOptions);
}

// 訂閱主題成功事件
function onSubscribe(context) {
    console.log("subscribe success");
    console.log(context);
}

// 連接失敗事件
function onFailure(message) {
    console.log("connect failed.");
}

// onMessageArrived 事件
function onMessageArrived(message) {
    console.log("new message arrived...");
    console.log(message.payloadString);
}


// 建立 MQTT websocket 連接
function MQTTconnect() {
    console.log("connecting to " + host + ":" + port);
    mqtt = new Paho.MQTT.Client(host, port, "clientid");
    var options = {
        timeout: 3,
        onSuccess: onConnect,
        onFailure: onFailure,
        userName: "client",
        password: "123456",
        mqttVersion: 4
    };
    mqtt.onMessageArrived = onMessageArrived;
    mqtt.connect(options);
}

這里我們利用 paho-mqtt.js 新建了一個(gè) mqtt, 然后綁定 onSuccess(連接成功), onFailure(連接失敗) onMessageArrived(消息到來)等事件, 之后用 options 里的配置連接到遠(yuǎn)程的 mosquitto 服務(wù)器. 連接成功后, client 向 server 發(fā)送一條消息到 /p/client/upload topic, 通知服務(wù)端已經(jīng)建立連接. 發(fā)送之后 mqtt 又訂閱 /p/client/download, 準(zhǔn)備接受來自服務(wù)端的信息.

比如, 服務(wù)端可以這樣向客戶端推送消息:

import paho.mqtt.publish as publish
import time

HOST = "mosquitto"
PORT = 1883


if __name__ == "__main__":
    client_id = time.strftime("%Y%m%d%H%M%S", time.localtime(time.time()))
    publish.single(
        "/p/client/download", "hello mqtt", qos=2, hostname=HOST, port=PORT,
        client_id=client_id, auth={"username": "server", "password": "123456"})

這就是基于雙通道的服務(wù)端于客戶端通信

客戶端與服務(wù)端的單通道通信

單通道通信原理類似, 但是由于客戶端可能有多臺(tái)設(shè)備, 比如手機(jī)端, 微信小程序端, PC 端. 那么身份的驗(yàn)證不能直接由 mosquitto 確定, 應(yīng)該在消息體內(nèi)確定. 比如我們用 json 作為消息的承載方式. 消息體可以這樣:

{
    "timestamp": "1539141568",
    "client_id": "1001001",
    "message_type": "ping",
    "data": {"detail": "content"},
    "token": "auth_token"
}

這里應(yīng)該按照具體的業(yè)務(wù)需求進(jìn)行鑒權(quán)設(shè)計(jì).

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/98221.html

相關(guān)文章

  • mosquitto websocket 結(jié)合

    摘要:前言作為一個(gè)消息代理客戶端與服務(wù)端的通信時(shí)基于協(xié)議的而現(xiàn)在的主流應(yīng)用時(shí)呈現(xiàn)在瀏覽器中這意味著用戶與服務(wù)端只能通過或者這類瀏覽器能理解的協(xié)議傳輸所以后端還要建立一個(gè)代理層將協(xié)議傳輸?shù)膬?nèi)容解析一下以協(xié)議發(fā)送到最后再由發(fā)送到硬件端在瀏覽器支持的協(xié) 前言 mosquitto 作為一個(gè)消息代理, 客戶端與 mosquitto 服務(wù)端的通信時(shí)基于 MQTT 協(xié)議的, 而現(xiàn)在的主流 web 應(yīng)用時(shí)呈...

    tomener 評(píng)論0 收藏0
  • 基于MQTT物聯(lián)網(wǎng)云測(cè)量解決方案

    摘要:本文是其中的一個(gè)解決方案。地址客戶端服務(wù)端前端網(wǎng)頁介紹,消息隊(duì)列遙測(cè)傳輸是開發(fā)的一個(gè)即時(shí)通訊協(xié)議,有可能成為物聯(lián)網(wǎng)的重要組成部分。必須用于在頂層分隔符之后,除了當(dāng)自己指定時(shí)。 1. 問題描述 最近,本實(shí)驗(yàn)室大量上馬云測(cè)量,云監(jiān)控方面的項(xiàng)目,大概是屬于物聯(lián)網(wǎng)應(yīng)用的一個(gè)分支。老板也有將舊有儀器改造的想法,所以要實(shí)現(xiàn)儀器設(shè)備的云控制。本文是其中的一個(gè)解決方案。 2. 技術(shù)選型 消息隊(duì)列:M...

    張金寶 評(píng)論0 收藏0
  • 用 docker 部署 mosquitto 并編譯 mosquitto-auth-plug

    摘要:再運(yùn)行一次它往發(fā)送了一個(gè)消息我們可以看到就已經(jīng)收到了總結(jié)我們成功地搭建了一個(gè)的消息代理服務(wù)并為它編譯了可以供后續(xù)后端消息業(yè)務(wù)的開發(fā)詳細(xì)代碼也可以參考已經(jīng)上傳到的 mosquitto 的簡(jiǎn)介 mosquitto 是一個(gè)開源的輕量級(jí)消息代理服務(wù), 支持 MQTT-3.1 和 MQTT-3.1.1, 采用發(fā)布訂閱模式. mosquitto 目前廣泛用于手機(jī)設(shè)備, 底端傳感器, 嵌入式計(jì)算機(jī)的...

    maybe_009 評(píng)論0 收藏0
  • PHP 使用mosquiito

    摘要:近期業(yè)務(wù)需要,調(diào)研和使用基于協(xié)議的,開發(fā)一個(gè)消息推送系統(tǒng)。環(huán)境安裝安裝的擴(kuò)展然后把加到重啟編寫代碼,訂閱為的消息想為,發(fā)布消息運(yùn)行腳本發(fā)布消息腳本接受到消息并且打印出來腳本中,在收到消息后,會(huì)發(fā)布一個(gè)消息到為中,后臺(tái)會(huì)接收消息 近期業(yè)務(wù)需要,調(diào)研和使用基于mqtt協(xié)議的mosquitto,開發(fā)一個(gè)消息推送系統(tǒng)。 環(huán)境:ubuntu 14.04,php7.1,mosquitto 安裝mo...

    Developer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<