mqtt安装以及使用

简述
一款实现了消息推送协议 MQTT v3.1 的开源消息代理软件,提供轻量级的,支持可发布/可订阅的的消息推送模式,使设备对设备之间的短消息通信变得简单,比如现在应用广泛的低功耗传感器,手机、嵌入式计算机、微型控制器等移动设备。一个典型的应用案例就是 Andy Stanford-ClarkMosquitto(MQTT协议创始人之一)在家中实现的远程监控和自动化

mosquitto官网 http://mosquitto.org/

windows

file

支持webSocket

修改配置文件mosquitto.conf

新加一下几行
port 1883
listener 9001
protocol websockets

使用


 mosquitto_sub -t 'test/topic' -v
 mosquitto_pub -t 'test/topic' -m 'hello world'
#test/topic为订阅的主题,类似于聊天室, -m为message

mosquitto_pub参数说明:

-d 打印debug信息
-f 将指定文件的内容作为发送消息的内容
-h 指定要连接的域名 默认为localhost
-i 指定客户端clientid,默认为附加进程ID的mosquittopub
-I 指定clientId前缀
-m 消息内容
-n 发送一个空(null)消息
-p 连接端口号
-q 指定QoS的值(0,1,2)
-t 指定topic
-u 用户名
-P 用户密码
-V 指定MQTT协议版本
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使 用
--will-topic 用户发送Will消息的topic

mosquitto_sub参数说明

-c 指定客户端clean_session是否保存。
-d 打印debug信息
-h 指定要连接的域名 默认为localhost
-i 指定客户端clientid
-I 指定clientId前缀
-k keepalive 每隔一段时间,发PING消息通知broker,仍处于连接状态。 默认为60秒.
-q 指定希望接收到QoS为什么的消息 默认QoS为0
-R 不显示陈旧的消息
-t 订阅topic
-v 打印消息
--will-payload 指定一个消息,该消息当客户端与broker意外断开连接时发出。该参数需要与--will-topic一起使用
--will-qos Will的QoS值。该参数需要与--will-topic一起使用
--will-retain 指定Will消息被当做一个retain消息(即消息被广播后,该消息被保留起来)。该参数需要与--will-topic一起使>用
--will-topic 用户发送Will消息的topic

file
file

linux 安装

安装依赖

yum install gcc gcc-c++ libstdc++-devel openssl-devel c-ares-devel  c-ares-devel uuid-devel  libuuid-devel cmake

下载安装libwebsockets

git clone https://github.com/warmcat/libwebsockets.git
cd libwebsockets/
mkdir build
cd build
cmake ..
make install
cd /opt/mqtt
wget https://github.com/warmcat/libwebsockets/archive/v1.3-chrome37-firefox30.tar.gz
tar xf v1.3-chrome37-firefox30.tar.gz
cd libwebsockets-1.3-chrome37-firefox30/
mkdir build
cd build
cmake ..   -DLIB_SUFFIX=64
make install
ldconfig

下载安装 mosquitto

cd /opt/mqtt/
wget http://mosquitto.org/files/source/mosquitto-1.4.2.tar.gz
tar xf mosquitto-1.4.2.tar.gz
cd mosquitto-1.4.2
sed -i 's#WITH_WEBSOCKETS:=no#WITH_WEBSOCKETS:=yes#g' config.mk
make
make install
cp mosquitto.conf /etc/mosquitto/
sed -i '/#port 1883/a port 1883\nlistener 9001\nprotocol websockets' /etc/mosquitto/mosquitto.conf

问题报错

mosquitto -c /etc/mosquitto/mosquitto.conf
mosquitto: error while loading shared libraries: libwebsockets.so.4.0.0: cannot open shared object file: No such file or directory

解决报错

在ldconfig之前

vim /etc/ld.so.conf.d/liblocal.conf
/usr/local/lib64
/usr/local/lib

测试

mosquitto_sub -v -t sensor
mosquitto_pub -t sensor -m 666

web html使用mqtt

js类库

http://blog.ahuang.site/wp-content/uploads/2019/08/mqttws31.txt (将后缀改成js)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <title></title>
        <script src="js/mqttws31.js" type="text/javascript"></script>
        <script>
            var hostname = 'ip地址',
                port = 8882,  
                clientId = 'client-mao2080',  
                timeout = 5,  
                keepAlive = 50,  
                cleanSession = false,  
                ssl = false,  
                userName = 'mao2080',  
                password = '123',  
                topic = 'a/b/c';  
            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);
            }

            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>

可以转载,但必须说明出处

发表评论