MQTT mosquitto + websocktes 的使用 Liunx 環境

來源:互聯網
上載者:User
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>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.