使用网页制作一个MQTT客户端

目录

引言

工作原理

程序设计

主页面

styles.css 文件

script.js文件

运行结果

结语


引言

我在上《智能物联网应用设计》课程的时候,一直在寻找一个简单的方法来实现MQTT客户端。今天在想能不能用网页来实现个MQTT客户端,简单尝试了一下还是可以的。

工作原理

要在网页中实现MQTT客户端,只能通过websockets访问服务器,好在目前的很多MQTT服务器都支持MQTT over Websocket。我测试时使用的服务器时Nanomq的Windows版本。

JS库采用的是paho-mqtt.js,有关介绍参见:mqttws.js_mqttws31.js-优快云博客

程序设计

程序的大部分是使用Kimi生成的,有少量修改。程序由三个部分组成。

主页面

主页面index.html的内容如下:


<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>MQTT Light Control</title>
    <link rel="stylesheet" href="styles.css">
</head>
<body>
    <div class="switch-container">
        <label class="switch">
            <input type="checkbox" id="lightSwitch">
            <span class="slider round"></span>
        </label>
    </div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/paho-mqtt/1.0.2/mqttws31.min.js"></script>
    <script src="script.js"></script>
</body>
</html>

styles.css 文件

这个文件主要定义了界面元素的风格。

body {
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    background-color: #f4f4f4;
    margin: 0;
    font-family: Arial, sans-serif;
}

.switch-container {
    text-align: center;
}

/* The switch - the box around the slider */
.switch {
    position: relative;
    display: inline-block;
    width: 60px;
    height: 34px;
}

/* Hide default HTML checkbox */
.switch input {
    opacity: 0;
    width: 0;
    height: 0;
}

/* The slider */
.slider {
    position: absolute;
    cursor: pointer;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    background-color: #ccc;
    -webkit-transition: .4s;
    transition: .4s;
}

.slider:before {
    position: absolute;
    content: "";
    height: 26px;
    width: 26px;
    left: 4px;
    bottom: 4px;
    background-color: white;
    -webkit-transition: .4s;
    transition: .4s;
}

input:checked + .slider {
    background-color: #2196F3;
}

input:focus + .slider {
    box-shadow: 0 0 1px #2196F3;
}

input:checked + .slider:before {
    -webkit-transform: translateX(26px);
    -ms-transform: translateX(26px);
    transform: translateX(26px);
}

/* Rounded sliders */
.slider.round {
    border-radius: 34px;
}

.slider.round:before {
    border-radius: 50%;
}

script.js文件

这个文件是核心逻辑 ,代码如下:

const clientId = "1fc9600";
const client = new Paho.MQTT.Client('localhost', 8083, clientId);
const lightTopic = 'light002';


let connected = false;

// called when the client connects
client.onConnectionLost = function (responseObject) {
    console.log("Connection lost: " + responseObject.errorMessage);
    connected = false;
};

// called when the client loses its connection
client.onConnect = function (responseObject) {
    if (responseObject.errorCode === 0) {
        console.log("Connected to MQTT broker!");
        connected = true;
    } else {
        console.log("Failed to connect, return code: " + responseObject.errorCode + ", error message: " + responseObject.errorMessage);
    }
};

// called when a message arrives
client.onMessageArrived = function (message) {
    console.log("Message arrived: " + message.payloadString);
    if(message.payloadString === 'ON') {
        document.getElementById('lightSwitch').checked = true;
    } else {
        document.getElementById('lightSwitch').checked = false;
    }            
};


// connect to the MQTT server
client.connect({onSuccess: onConnect,  useSSL: false});

// subscribe to the topic
function onConnect() {
    console.log("Connected to MQTT broker!");
    connected = true;
    console.log("Subscribing to topic: " + lightTopic);
    client.subscribe(lightTopic, {qos: 0});
}

document.getElementById('lightSwitch').addEventListener('change', function (e) {
    if (connected) {
        const message = e.target.checked ? 'ON' : 'OFF';
        client.send(lightTopic, message, 0, true);
    }
});

运行结果

Nanomq默认支持Websocket,端口是8083。

直接加载index.html页面,就可以看到一个控制开关。

切换控制开关,它会向light002主题发布ON或OFF消息。如果使用MQTTX向这个主题发布ON或OFF消息,按钮也会做相应的变化。

 

结语

整体看来,使用网页做客户端还是挺简单的。

在寻找免费的MQTT测试工具或网页应用时,以下是一些推荐的选择,这些工具能够帮助开发者快速进行MQTT连接测试、消息发布与订阅等操作: ### 推荐的免费MQTT测试工具(网页版) 1. **MQTT WebSocket Toolkit** 这是一款简单易用的在线 MQTT 客户端测试工具,基于浏览器端使用,只支持 MQTT over WebSocket 连接。它提供了基础的 MQTT 配置连接设置,非常适合快速测试和调试 MQTT 通信。[^1] 2. **MQTT X Web** MQTT X Web 是一个在线版本的 MQTT 客户端工具,它为物联网开发者提供了一种新的选择来进行 MQTT 连接测试。该工具支持命令行调用、桌面客户端下载和在线浏览器交互形式,适用于不同使用场景需求的用户。[^3] 3. **MQTT Admin** MQTT Admin 是一个基于 Web 的 MQTT 客户端,提供了一个用户友好的界面来实现 MQTT 协议的发布、订阅以及主题状态监控功能。它支持 WebSocket 和 Secure WebSocket(wss://)连接,用户可以在现代浏览器中直接使用,无需安装额外软件。[^4] 4. **EMQ 提供的公共 MQTT 5 服务器** EMQ 提供了一个免费的公共 MQTT 服务器,支持 MQTT 5.0 标准,同时支持 TLS/SSL 安全连接及共享订阅功能。用户可以将它用于 MQTT 学习、测试或原型制作。[^2] --- ### 示例代码:使用 JavaScript 连接 MQTT 服务器 以下是一个使用 `Paho-MQTT` 库通过 WebSocket 连接到 MQTT 服务器的简单示例: ```javascript // 创建 MQTT 客户端实例 const client = new Paho.MQTT.Client("broker.emqx.io", 8083, "/mqtt", "clientId"); // 设置连接选项 const options = { timeout: 3, onSuccess: function () { console.log("Connected to MQTT broker"); // 订阅主题 client.subscribe("test/topic"); }, onFailure: function (message) { console.log("Connection failed: " + message.errorMessage); } }; // 连接到 MQTT 服务器 client.connect(options); // 消息到达时的回调函数 client.onMessageArrived = function (message) { console.log("Received message: " + message.payloadString + " on topic " + message.destinationName); }; // 发布消息到指定主题 function publishMessage() { const message = new Paho.MQTT.Message("Hello MQTT"); message.destinationName = "test/topic"; client.send(message); } ``` --- ### 其他相关资源 - **MQTT 服务器(Broker)功能** MQTT 服务器(也称为 Broker)是位于消息发布者和订阅者之间的核心组件,其主要功能包括: - 接受来自客户端的网络连接; - 接收客户端发布的应用信息; - 处理来自客户端的订阅和退订请求; - 向订阅的客户转发应用程序消息。[^5] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神一样的老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值