MQTT mosquitto + websocktes 的使用 Liunx 環境
1.mosquitto 的安裝
如果需要 mosquitto 支援websocktes 需要先安裝 libwebsockets
libwebsockets 下載地址 https://github.com/warmcat/libwebsockets
mosquitto 下載地址 https://mosquitto.org/download/
1.1 libwebsockets 的安裝
a.解壓 libwebsockets 包後, 再 當前木目錄建立 build 目錄 mikdir build
b. cd build 目錄 執行 cmake .. 需要 沒有安裝 cmake 則需要 安裝 cmake
c.執行安裝 cmake install
d.清除安裝臨時檔案 cmake clean
1.2 mosquitto 的安裝
a.解壓檔案後 vi config.mk 檔案
b.修改 WITH_WEBSOCKETS:=yes 必須要 在 安裝前設定,否則 不會支援 websocktes
c.編譯 make
在編譯的過程中 可能 需要 你 安裝 openssl, c-ares, libuuid, 庫 需要安裝 可以通過 yum 安裝
yum 的使用就不在著說了 。
d. 執行安裝 命令 make install
e.清除 安裝臨時檔案 make clean
1.3 mosquitto.cnof 檔案的配置
a.mosquitto 預設使用 mosquitto 使用者來 啟動 也可以修改 啟動使用者
b.為mosquitto 添加 websocktes 配置
mosquitto 是支援 多個監聽的 需要配置多個監聽 就需要 配置多個 listener和protocol
mosquitto 預設的連接埠的 1883 預設的 protocol 是 mqtt
如要需要同時支援 mqtt 和 websocktes 就需要開啟 mosquitto 預設的連接埠 和 protocol
1.4 啟動 mosquitto
我的 mosquitto 安裝在 、usr/loacl 下
安裝的過程中 在 在etc 目錄下 會有 預設的mosquitto.conf 檔案
我這裡使用的是安裝目錄下的mosquitto.conf
mosquitto -c /user/loacl/mosquitto/mosquitto.conf &
在啟動的過程中可能會 提示 缺少 libmosquittopp.so.1 libwebsockets.so.10 檔案
這兩個檔案 預設安裝到 /user/loacl/lib 目錄下
如過 你的 系統時 32 位 的 側需要將 這兩個檔案 複製到 /usr/lib 目錄下
如過 你的 系統時 64 位元 的 側需要將 這兩個檔案 複製到 /usr/lib64 目錄下
1.5 mosquitto 日誌的配置
a.mosquitto 預設的日誌目錄 /var/log/messages or similar
log_dest 預設時 日誌則會 列印到 控制台
log_dest 設定為 topic 時 當裡則會 以訊息的形式 發送到 你 訂閱的 系統 主題
mosquitto 的系統主題 都以 $SYS 開頭 文檔介紹地址 https://mosquitto.org/man/mosquitto-8.html
log_type 日誌的類型
2.mosquitto Java端代碼
package Test.test.mqtt.mosquitto;import org.eclipse.paho.client.mqttv3.IMqttActionListener;import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;import org.eclipse.paho.client.mqttv3.IMqttMessageListener;import org.eclipse.paho.client.mqttv3.IMqttToken;import org.eclipse.paho.client.mqttv3.MqttAsyncClient;import org.eclipse.paho.client.mqttv3.MqttCallback;import org.eclipse.paho.client.mqttv3.MqttConnectOptions;import org.eclipse.paho.client.mqttv3.MqttException;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;/** *@author 孫雲飛 */public class MqttMessage { private static final String HOST = "tcp://192.168.0.122:1883"; private static final String TOPIC = "$SYS/broker/log/#"; private static final String CLIENTID = "mqttserver"; public static MqttAsyncClient client; public static void init(){ try { client = new MqttAsyncClient(HOST, CLIENTID, new MemoryPersistence()); client.setCallback(new MqttCallback() { @Override public void connectionLost(Throwable cause) { System.out.println("connectionLost"); } @Override public void messageArrived(String topic, org.eclipse.paho.client.mqttv3.MqttMessage message) throws Exception { System.out.println(message.toString() + "fsdfsfdfsdfsdf"); } @Override public void deliveryComplete(IMqttDeliveryToken token) { System.out.println("deliveryComplete"); } }); client.connect(initOptions(), null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { System.out.println("連結成功。"); try { client.subscribe(TOPIC, 0, new IMqttMessageListener() { @Override public void messageArrived(String topic, org.eclipse.paho.client.mqttv3.MqttMessage message) throws Exception { System.out.println(message.toString()); //System.out.println(client.getPendingDeliveryTokens().length); //char i = 65; //SimpleLogFormatter.left("sdddd", 10, i); } }); } catch (MqttException e) { e.printStackTrace(); } } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { System.out.println("連結失敗。"); } }); } catch (MqttException e) { e.printStackTrace(); } } private static MqttConnectOptions initOptions(){ MqttConnectOptions options = new MqttConnectOptions(); options.setAutomaticReconnect(true);//預設重連 options.setCleanSession(false);//清除session options.setConnectionTimeout(60);//逾時時間 以秒為單位 options.setKeepAliveInterval(60);//心跳時間 以秒為單位 //options.setWill(TOPIC, "failure".getBytes(), 0, false); //連結失敗 則發出一個訊息 return options; } public static void main(String[] args) { init(); } public static void send(String[] args) throws MqttPersistenceException, MqttException { MqttMessage.client.publish("service", "1111111".getBytes(), 1, true, null, new IMqttActionListener() { @Override public void onSuccess(IMqttToken asyncActionToken) { System.out.println("發送------------------onSuccess"); } @Override public void onFailure(IMqttToken asyncActionToken, Throwable exception) { System.out.println("發送------------------onFailure"); } }); }}
3.websocktes 代碼 需要 引入 https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.1/mqttws31.min.js
host = '192.168.0.112'; // hostname or IP addressport = 1884;topic = 'PC'; // topic to subscribe touseTLS = false;username = null;password = null;// username = "jjolie";// password = "aa";cleansession = true;<script type="text/javascript"> var mqtt; var reconnectTimeout = 2000; function MQTTconnect() { mqtt = new Paho.MQTT.Client( "192.168.0.112", 1884, "PC_111"); var options = { timeout: 3, useSSL: useTLS, cleanSession: cleansession, onSuccess: onConnect, onFailure: function (message) { $('#status').val("Connection failed: " + message.errorMessage + "Retrying"); setTimeout(MQTTconnect, reconnectTimeout); } }; mqtt.onConnectionLost = onConnectionLost; mqtt.onMessageArrived = onMessageArrived; if (username != null) { options.userName = username; options.password = password; } console.log("Host="+ host + ", port=" + port + " TLS = " + useTLS + " username=" + username + " password=" + password); mqtt.connect(options); } function onConnect() { $('#status').val('Connected to ' + host + ':' + port); // Connection succeeded; subscribe to our topic mqtt.subscribe(topic, {qos: 0}); $('#topic').val(topic); } function onConnectionLost(response) { setTimeout(MQTTconnect, reconnectTimeout); $('#status').val("connection lost: " + responseObject.errorMessage + ". Reconnecting"); }; function onMessageArrived(message) { var topic = message.destinationName; var payload = message.payloadString; $('#ws').prepend('<li>' + topic + ' = ' + payload + '</li>'); }; function button_onclick(){ //這裡寫你要執行的語句 var tp = $('#sendtopic').val(); var val = $('#textsend').val(); if(tp==''||val=='') { alert("no aaa"); return; } var message = new Paho.MQTT.Message(val); message.destinationName = tp; message.qos=0; mqtt.send(message);// mqtt.publish(tp, 0, val); $('#ws').prepend('<li>' + tp + ' = ' + val+ '</li>'); }; $(document).ready(function() { MQTTconnect(); }); </script>