MQTT mosquitto + websocktes 的使用 Liunx 环境

来源:互联网 发布:python developer 编辑:程序博客网 时间:2024/06/06 00:21

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>
原创粉丝点击