MQTT客户端Paho实现JavaScript应用

MQTT客户端Paho实现JavaScript应用

Eclipse Paho 项目提供了 MQTT 消息传递协议的开源客户端实现,官网如下
https://www.eclipse.org/paho/

Eclipse paho 项目提供了如下语言的库:
Java
Python
JavaScript
GoLang
C
C++
Rust
Net (C#)
Android Service
Embedded C/C++
针对这些语言的提供的 MQTT 客户端库目前对 MQTT 协议的支持情况如下:

1、paho-mqtt.js默认使用的是WebSocket连接,所以端口号应使用配置中ws对应的端口号,而非tcp对应的端口号。因此需要修改 mosquitto.conf。

#protocol mqtt

listener 1883
protocol mqtt

listener 1884
protocol websockets

2、编写一个JavaScript应用。

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
  <meta charset="utf-8" />
    <script src="js/jquery.min.js"></script>
    <script src="js/paho-mqtt.js"></script>
    <script type="text/javascript">

        // 客户端选项
        var option = {
            "ServerUri": "192.168.124.5",
            "ServerPort": 1884,
            "UserName": "jzh",
            "Password": "111111",
            "ClientId": "",
            "TimeOut": 5,
            "KeepAlive": 100,
            "CleanSession": false,
            "SSL":false
        }

        // 客户端
        var client;

        $(function () {

            // 连接按钮点击事件
            $("#btnConnect").on("click", function () {
                if ($("#txtIp").val()!="") {
                    option.ServerUri = $("#txtIp").val();
                }
                else {
                    alert("请输入服务端IP!");
                    return;
                }

                if($("#txtPort").val()!=""){
                    option.ServerPort = Number($("#txtPort").val());
                }
                else {
                    alert("请输入端口号!");
                    return;
                }

                option.ClientId = makeid();

                client = new Paho.Client(option.ServerUri, option.ServerPort, option.ClientId)

                client.onConnectionLost = onConnectionLost;
                client.onMessageArrived = onMessageArrived;

                client.connect({
                    invocationContext: {
                        host: option.ServerUri,   // IP地址
                        port: option.ServerPort,  // 端口号
                        path: client.path,
                        clientId: option.ClientId // 标识
                    },
                    timeout: option.TimeOut,               // 连接超时时间
                    keepAliveInterval: option.KeepAlive,   // 心跳间隔
                    cleanSession: option.CleanSession,     // 是否清理Session
                    useSSL: option.SSL,                    // 是否启用SSL
                    userName: option.UserName,             // 用户名
                    password: option.Password,             // 密码
                    onSuccess: onConnect,                  // 连接成功回调事件
                    onFailure: onError                     // 连接失败回调事件
                });

            });

            // 断开按钮点击事件
            $("#btnDisconnect").on("click", function () {
                client = null;

                enable($("#btnConnect"), true);
                enable($("#btnDisconnect"), false);
                enable($("#btnPublish"), false);
                enable($("#btnSubscribe"), false);
            });

            // 订阅按钮点击事件
            $("#btnSubscribe").on("click", function () {
                if (!client) {
                    alert("请连接服务端");
                    return;
                }

        var topic = $("#txtTopic").val();

        client.subscribe(topic);

                logInfo("成功订阅主题:" + topic);
            });

            // 发布按钮点击事件
            $("#btnPublish").on("click", function () {
                if(!client){
                    alert("请连接服务端");
                    return;
                }

                if($("#txtContent").val()==""){
                    alert("请输入要发布的内容");
                    return;
                }

                var message = new Paho.Message($("#txtContent").val());

                var topic = $("#txtTopic").val();

                message.destinationName = topic;
                client.send(message);

                logInfo("发布了主题为" + topic + "的消息:" + $("#txtContent").val())
            });


        });

        // 连接成功事件
        function onConnect() {
            logInfo("连接成功!")

            enable($("#btnConnect"), false);
            enable($("#btnDisconnect"), true);
            enable($("#btnPublish"), true);
            enable($("#btnSubscribe"), true);
        }
        
    // 连接失败事件
        function onError(e) {
            logInfo("连接失败:" + e)

            enable($("#btnConnect"), true);
            enable($("#btnDisconnect"), false);
            enable($("#btnPublish"), false);
            enable($("#btnSubscribe"), false);
        }

        // 连接断开事件
        function onConnectionLost(e) {
            if (e.errorCode !== 0) {
                logInfo("连接异常断开:" + e.errorMessage);

                enable($("#btnConnect"), true);
                enable($("#btnDisconnect"), false);
                enable($("#btnPublish"), false);
                enable($("#btnSubscribe"), false);
            }
        }

        // 接收消息事件
        function onMessageArrived(data) {
            logInfo("收到消息:" + data.payloadString);
        }

        // 日志输出
        function logInfo(data) {
            var date = new Date();
            var newdate = date.toLocaleString('chinese', { hour12: false, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' }) // 获取24小时制,打印出  2020/12/23 23:31:12
            var fmtdate = newdate.replace(/[\/]/g, "-") // 打印出 2020-12-23 23:31:12

            var message = '[' + fmtdate + ']' + data;
            console.log(message);
            $("#logInfo").append('<li>' + message + '</li>');
        }

        // clientid
    function makeid() {
            var text = "";
            var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

            for (var i = 0; i < 5; i++)
                text += possible.charAt(Math.floor(Math.random() * possible.length));

            return text;
        }

        // 切换按钮状态
        function enable(button,enabled) {
            if (enabled) {
                button.removeAttr("disabled");
            }
            else {

                button.attr("disabled", "disabled");
            }
        }

    </script>
</head>
<body>
    <table>
        <tr>
            <td></td>
            <td>服务器IP:&nbsp;&nbsp;<input id="txtIp" type="text" value="192.168.124.5"/></td>
            <td>WebSocket端口:&nbsp;&nbsp;<input id="txtPort" type="text" value="1884"/></td>
            <td><input id="btnConnect" type="button" value="连接"/></td>
            <td><input id="btnDisconnect" type="button" value="断开" disabled="disabled"/></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td colspan="3">
            </td>
            <td><input id="btnSubscribe" type="button" value="订阅" disabled="disabled"/></td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td colspan="4">
                <ul id="logInfo"></ul>
            </td>
            <td></td>
        </tr>
        <tr>
            <td></td>
            <td>
          主题:&nbsp;&nbsp;<input id="txtTopic" type="text" value="news" />
            </td>
            <td colspan="2">消息:&nbsp;&nbsp;<input id="txtContent" type="text"/></td>
            <td><input id="btnPublish" type="button" value="发布" disabled="disabled"/></td>
            <td></td>
        </tr>
    </table>
</body>
</html>

 

发表回复

您的电子邮箱地址不会被公开。