mqtt server搭建和web中使用js-sdk訂閱發布消息


1.mqtt server搭建(From:https://www.cnblogs.com/huhongy/p/7929299.html)

window安裝MQTT服務器,我這里下載了一個 apache-apollo-1.7.1-windows-distro.zip

  下面簡單說一下我的安裝步驟:

    第一步,下載zip包:解壓到隨意文件夾

      

    第二步:創建實例:我已經創建過了,就不回車了,如果第一次創建,直接回車,在bin目錄下會出現實例名的文件夾,如圖“”

      

      創建成功:

      

    第三步:進入該實例下,修改對外端口:

      

    

安裝成服務

 

 如果要卸載服務:  sc delete 服務名

 

第四步:啟動:

     

     第五步:web頁面訪問:  http://127.0.0.1:61680/  (因為我已經操作成功,所以不需要輸入密碼,第一次需要輸入密碼的   admin=password)

     

 

 


 客戶端連接測試:

    在這我選擇的是org.eclipse.paho.ui.app-1.0.2-win32.win32.x86_64 (基於ecplise rpc插件制作)或者去官網下載,選擇適合自己系統的版本  https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho.ui.app/1.0.2/  進行測試: 

    第一步:下載解壓:  

       

    第二步:運行paho.exe 

     

    第三步: 創建連接,發布消息:

      

    


 

我啟動三個客戶端:分別是本地 127.0.0.1   和 localhost  和同網段的機器進行對服務器訪問

    客戶端一:

    

  客戶端2;

  

    客戶端3

    

 


在代理服務器上可以查看客戶端連接信息情況:

    

 

2.web使用mqttws31.js(不穩定)

 接受不穩定原因不明 推薦使用paho-mqtt.js

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="js/mqttws31.js" type="text/javascript"></script>
<script>
var hostname = '127.0.0.1',
port = 61623,
clientId = 'clientmao2080',
timeout = 5,
keepAlive = 50,
cleanSession = false,
ssl = false,
userName = 'admin';
password = 'password',
topic = 'test';
client = new Paho.MQTT.Client(hostname, port, clientId);
//建立客戶端實例
var options = {
invocationContext: {
host : hostname,
port: port,
path: client.path,
clientId: clientId
},
timeout: timeout,
keepAliveInterval: keepAlive,
cleanSession: cleanSession,
useSSL: ssl,
userName: userName,
password: password,
onSuccess: onConnect,
onFailure: function(e){
console.log(e);
}
};
client.connect(options);
//連接服務器並注冊連接成功處理事件
function onConnect() {
console.log("onConnected");
client.subscribe(topic, { qos: 2});
}
client.onConnectionLost = onConnectionLost;
//注冊連接斷開處理事件
client.onMessageArrived = onMessageArrived;
//注冊消息接收處理事件
function onConnectionLost(responseObject) {
console.log(responseObject);
if (responseObject.errorCode !== 0) {
console.log("onConnectionLost:"+responseObject.errorMessage);
console.log("連接已斷開");
}
}

function onMessageArrived(message) {
console.log("收到消息:"+message.payloadString);
}

function send(){
var s = document.getElementById("msg").value;
if(s){
s = "{time:"+new Date().Format("yyyy-MM-dd hh:mm:ss")+", content:"+(s)+", from: web console}";
message = new Paho.MQTT.Message(s);
message.destinationName = topic;
client.send(message);
document.getElementById("msg").value = "";
}
}

var count = 0;

function start(){
window.tester = window.setInterval(function(){
if(client.isConnected){
var s = "{time:"+new Date().Format("yyyy-MM-dd hh:mm:ss")+", content:"+(count++)+", from: web console}";
message = new Paho.MQTT.Message(s);
message.destinationName = topic;
client.send(message);
}
}, 1000);
}

function stop(){
window.clearInterval(window.tester);
}

Date.prototype.Format = function (fmt) { //author: meizz
var o = {
"M+": this.getMonth() + 1, //月份
"d+": this.getDate(), //日
"h+": this.getHours(), //小時
"m+": this.getMinutes(), //分
"s+": this.getSeconds(), //秒
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
"S": this.getMilliseconds() //毫秒
};
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
return fmt;
}

</script>
</head>
<body>
<input type="text" id="msg"/>
<input type="button" value="Send" onclick="send()"/>
<input type="button" value="Start" onclick="start()"/>
<input type="button" value="Stop" onclick="stop()"/>
</body>
</html>

 

 

3.使用paho-mqtt.js訂閱和發布

下載https://github.com/eclipse/paho.mqtt.javascript

運行utility目錄下的index.html 測試發現接受消息穩定

 

 

 

 

錯誤AMQJS0008I Socket closed處理

當clientId相同時會出現此問題,解決辦法clientId加Guid保證唯一

 From:https://www.cnblogs.com/xuejianxiyang/p/9591841.html

 

錯誤MqttCommunicationException: The client is not connected.

修改平台為x86 

跨線程調用時用Invoke:

Invoke(new Action(() =>
{

mqtt.SendMsg(topic,msg,qos);

}

 

c# 使用mqtt斷線重連后需要重新訂閱主題否則接受不到消息


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM