ws?-->?
WebSocket 非加密(端口8083)
wss -->
WebSocket SSL 加密 (端口8084)
mqtt --> mqtt 非加密 (端口1883 )
mqtts -->mqtt 加密?(端口8884)
WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)
初學(xué)者容易出現(xiàn)以下幾個錯誤:
- 連接地址沒有指明協(xié)議:WebSocket 作為一種通信協(xié)議,其使用?
ws
?(非加密)、wss
(SSL 加密) 作為協(xié)議標(biāo)識。MQTT.js 客戶端支持多種協(xié)議,連接地址需指明協(xié)議類型;
- 連接地址沒有指明端口:MQTT 并未對 WebSocket 接入端口做出規(guī)定,EMQX 上默認(rèn)使用?
8083
?8084
?分別作為非加密連接、加密連接端口。而 WebSocket 協(xié)議默認(rèn)端口同 HTTP 保持一致 (80/443),不填寫端口則表明使用 WebSocket 的默認(rèn)端口連接;而使用標(biāo)準(zhǔn) MQTT 連接時則無需指定端口,如 MQTT.js 在 Node.js 端可以使用?mqtt://localhost
?連接至標(biāo)準(zhǔn) MQTT 1883 端口,當(dāng)連接地址是?mqtts://localhost
?則連接到 8884 端口; - 連接地址無路徑:MQTT-WebSoket 統(tǒng)一使用?
/path
?作為連接路徑,連接時需指明,在 EMQX 上使用的路徑為?/mqtt
; - 協(xié)議與端口不符:使用了?
wss
?連接卻連接到?8083
?端口; - 在 HTTPS 下使用非加密的 WebSocket 連接: Google 等機構(gòu)在推進 HTTPS 的同時也通過瀏覽器約束進行了安全限定,即 HTTPS 連接下瀏覽器會自動禁止使用非加密的?
ws
?協(xié)議發(fā)起連接請求; - 證書與連接地址不符: 篇幅較長,詳見下文?EMQ 啟用 SSL/TLS 加密連接
連接選項?
- keepalive:心跳時間,默認(rèn) 60秒,設(shè)置 0 為禁用;
- clientId: 客戶端 ID ,默認(rèn)通過?
'mqttjs_' + Math.random().toString(16).substr(2, 8)
?隨機生成; - username:連接用戶名(可選);
- password:連接密碼(可選);
- clean:true,設(shè)置為 false 以在離線時接收 QoS 1 和 2 消息;
- reconnectPeriod:默認(rèn) 1000 毫秒,兩次重新連接之間的間隔,客戶端 ID 重復(fù)、認(rèn)證失敗等客戶端會重新連接;
- connectTimeout:默認(rèn) 30 * 1000毫秒,收到 CONNACK 之前等待的時間,即連接超時時間;
- will:遺囑消息,當(dāng)客戶端嚴(yán)重斷開連接時,Broker 將自動發(fā)送的消息。 一般格式為:
- topic:要發(fā)布的主題
- payload:要發(fā)布的消息
- qos:QoS
- retain:保留標(biāo)志
訂閱/取消訂閱
連接成功之后才能訂閱,且訂閱的主題必須符合 MQTT 訂閱主題規(guī)則;
注意 JavaScript 的異步非阻塞特性,只有在 connect 事件后才能確保客戶端已成功連接,或通過?client.connected
?判斷是否連接成功:
client.on('connect', () => {
console.log('Client connected:' + clientId)
// Subscribe
client.subscribe('testtopic', { qos: 0 })
})
// Unsubscribe
client.unubscribe('testtopic', () => {
console.log('Unsubscribed')
})
發(fā)布/接收消息
發(fā)布消息到某主題,發(fā)布的主題必須符合 MQTT 發(fā)布主題規(guī)則,否則將斷開連接。發(fā)布之前無需訂閱該主題,但要確??蛻舳艘殉晒B接:
// Publish
client.publish('testtopic', 'ws connection demo...!', { qos: 0, retain: false })
// Received
client.on('message', (topic, message, packet) => {
console.log('Received Message: ' + message.toString() + '\nOn topic: ' + topic)
})
微信小程序
MQTT.js 庫對微信小程序特殊處理,使用?wxs
?協(xié)議標(biāo)識符。注意小程序開發(fā)規(guī)范中要求必須使用加密連接,連接地址應(yīng)類似為?wxs://broker.emqx.io:8084/mqtt
。
EMQX 啟用 SSL/TLS 加密連接
EMQ 內(nèi)置自簽名證書,默認(rèn)已經(jīng)啟動了加密的 WebSocket 連接,但大部分瀏覽器會報證書無效錯誤如?net::ERR_CERT_COMMON_NAME_INVALID
?(Chrome、360 等 webkit 內(nèi)核瀏覽器在開發(fā)者模式下, Console 選項卡 可以查看大部分連接錯誤)。導(dǎo)致該錯誤的原因是瀏覽器無法驗證自簽名證書的有效性,讀者需從證書頒發(fā)機構(gòu)購買可信任證書,并參考該篇文章中的相應(yīng)部分進行配置操作:EMQX MQTT 服務(wù)器啟用 SSL/TLS 安全連接。
這里就總結(jié)啟用 SSL/TLS 證書需要具備的條件是:
- 將域名綁定到 MQTT 服務(wù)器公網(wǎng)地址:CA 機構(gòu)簽發(fā)的證書簽名是針對域名的;
- 申請證書:向 CA 機構(gòu)申請所用域名的證書,注意選擇一個可靠的 CA 機構(gòu)且證書要區(qū)分泛域名與主機名;
- 使用加密連接的時候選擇?
wss
?協(xié)議,并?使用域名連接?:綁定域名-證書之后,必須使用域名而非 IP 地址進行連接,這樣瀏覽器才會根據(jù)域名去校驗證書以在通過校驗后建立連接。
EMQX 配置
打開?etc/emqx.conf
?配置文件,修改以下配置:
# wss 監(jiān)聽地址
listener.wss.external = 8084
# 修改密鑰文件地址
listener.wss.external.keyfile = etc/certs/cert.key
# 修改證書文件地址
listener.wss.external.certfile = etc/certs/cert.pem
完成后重啟 EMQX 即可。
?可以使用你的證書與密鑰文件直接替換到 etc/certs/ 下。文章來源:http://www.zghlxwxcb.cn/news/detail-401511.html
在 Nginx 上配置反向代理與證書
使用 Nginx 來反向代理并加密 WebSocket 可以減輕 EMQX 服務(wù)器計算壓力,同時實現(xiàn)域名復(fù)用,同時通過 Nginx 的負(fù)載均衡可以分配多個后端服務(wù)實體。文章來源地址http://www.zghlxwxcb.cn/news/detail-401511.html
# 建議 WebSocket 也綁定到 443 端口
listen 443, 8084;
server_name example.com;
ssl on;
ssl_certificate /etc/cert.crt; # 證書路徑
ssl_certificate_key /etc/cert.key; # 密鑰路徑
# upstream 服務(wù)器列表
upstream emq_server {
server 10.10.1.1:8883 weight=1;
server 10.10.1.2:8883 weight=1;
server 10.10.1.3:8883 weight=1;
}
# 普通網(wǎng)站應(yīng)用
location / {
root www;
index index.html;
}
# 反向代理到 EMQX 非加密 WebSocket
location / {
proxy_redirect off;
# upstream
proxy_pass http://emq_server;
proxy_set_header Host $host;
# 反向代理保留客戶端地址
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
# WebSocket 額外請求頭
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection “upgrade”;
}
到了這里,關(guān)于MQTTX工具上的 mqtt mqtts ws wss的區(qū)別,以及常見問題解答的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!