web网页连接MQTT,显示数据与下发控制命令

news2024/12/12 5:57:54

web网页连接MQTT,显示数据与下发控制命令

零、前言

在完成一些设备作品后,常常会因为没有一个上位机用来实时检测数据和下发命令而苦恼,在上一篇文章中提到了怎么白嫖阿里云服务器,并且在上面搭建了属于自己的web网站。那么现在就可以利用这个公网web来实现一个上位机,这样就可以在有网的地方随时对设备进行监控和下发控制指令。以下就是完成这样一个可以连接MQTT服务器的web的制作过程。

一、body部分

html网页具有很多部分,其中最重要的是body部分,这部分决定了网站显示什么东西,stye部分就是对这部分进行美化。今天只完成功能,不对样式进行美化,有需要自行学习。

1.显示部分

用于显示数据,常用的有标签、文本框、标题等。显示部分我写了一个大标题,还有几个用于显示一些数据的文本,例如温度、湿度、光照强度等,这部分代码如下:

    <h1>物联网Web界面示例</h1>
    <h2>示例参数</h2>
    <p>温度:<span id="temperature">25°C</span></p>
    <p>湿度:<span id="humidity">50%</span></p>
    <p>光照强度:<span id="light">800 lux</span></p>

温度、湿度、光照强度这三部分需要有自己唯一的id,以便于后续可以通过id来索引到,进而对显示内容进行修改。

2.按钮部分

除了有显示以外,还需要有控制,控制最常用的就是按钮的形式。举例了三个按钮,分别是控制灯光、打开设备、关闭设备

    <h2>示例按钮</h2>
    <button onclick="toggleLight()">控制灯光</button>
    <button onclick="sendCommand('turnOn')">打开设备</button>
    <button onclick="sendCommand('turnOff')">关闭设备</button>

其中的onclick就是点击按钮后,会触发执行的函数。

二、script部分

在这部分中主要写的是处理逻辑相关的代码,包括MQTT连接、数据监听、发送消息等等。

1.连接MQTT

要在web中使用MQTT服务,需要引入MQTT相关的库,使用如下代码即可引入:

<script src="https://cdnjs.cloudflare.com/ajax/libs/mqtt/4.2.8/mqtt.min.js"></script>

随后就可以使用MQTT的服务了,首先需要设置连接参数,例如使用的MQTT的服务器地址、端口、主题等等。例如使用开源免费的emqx服务器为例,设置一下发布主题和订阅主题:

// MQTT 连接配置
const mqttBroker = 'ws://broker-cn.emqx.io:8083/mqtt';
const publish_Topic = 'iot/my_pub';
const subscribe_Topic = 'iot/my_sub';

随后调用connect函数即可连接MQTT服务器了:

// 创建 MQTT 客户端实例
const mqttClient = mqtt.connect(mqttBroker);

这样就可以尝试连接到开源的emqx服务器上了,那到底有没有连接上呢,还需要写点代码来验证,我们就让web连接上后打印一下连接成功。代码如下:

// 连接事件处理
mqttClient.on('connect', function () {
    console.log('连接成功');
    // 订阅主题
    mqttClient.subscribe(subscribe_Topic);
});

这样网页成功连接上MQTT服务器后,就会在浏览器控制台打印连接成功,如图所示:
在这里插入图片描述

2.监听信息

在使用过程中,web界面需要一直监听订阅主题上有没有新的消息,如果有消息,就要及时根据新的消息更新web显示的内容。代码如下:

// 监听消息
mqttClient.on('message', function (topic, message) {
    console.log("收到信息:" + message)
    update_Status(message.toString());
});

//更新消息
function update_Status(msg) {
    try {
        const data = JSON.parse(msg); // 尝试解析收到的 JSON 格式消息
        const temperature = data.temperature; // 假设 JSON 数据中有 temperature 字段
        const humidity = data.humidity; // 假设 JSON 数据中有 humidity 字段
        const light = data.light; // 假设 JSON 数据中有 light 字段
        document.getElementById('temperature').textContent = temperature + '°C'; //更新temperature
        document.getElementById('humidity').textContent = humidity + '%';        //更新humidity
        document.getElementById('light').textContent = light + ' lux';            //更新light
    } catch (error) {
        console.error('解析 MQTT 消息时出错:', error);
    }
}

在监听函数中,一旦收到消息了,会将信息打印出来,然后会执行update_Status函数来更新web上的内容。这边接收到的信息的json格式的,所以要对json格式的数据进行解析。举例如下,原始界面如下:
在这里插入图片描述
使用MQTT.fx软件连接上broker-cn.emqx.io后,往iot/my_sub主题发布一个json格式的信息,信息如下:

{"temperature":"23","humidity":"60","light":"500"}

在这里插入图片描述
发送后,就可以看到web界面的数值发送了变化,变成如下:
在这里插入图片描述
同时在控制台也输出了对应的信息,如图所示:
在这里插入图片描述

3.发送信息

web除了有监听信息,接收信息的能力外,还应当具备发送消息的能力,通过按键点击后,就会执行对应的函数,在函数内向发布主题发送一些消息,代码实现如下:

// 发布 MQTT 消息
function sendCommand(command) {
    mqttClient.publish(publish_Topic, command);
    console.log('已发送 MQTT 消息:', command);
}

实际效果可以在MQTT.fx中订阅iot/my_pub主题,来查看web发出的信息,当打开设备按键被按下后,就会向iot/my_pub主题发送turnOn的文本信息,如图所示:
在这里插入图片描述
同时在web的控制台也能看到对应的日志。
在这里插入图片描述

三、整体代码

整体代码中也是只做了简单的实现,没有对界面进行美化,仅供参考。整体的代码实现如下:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>物联网Web界面</title>
</head>

<body>
    <h1>物联网Web界面示例</h1>

    <h2>示例参数</h2>
    <p>温度:<span id="temperature">25°C</span></p>
    <p>湿度:<span id="humidity">50%</span></p>
    <p>光照强度:<span id="light">800 lux</span></p>

    <h2>示例按钮</h2>
    <button onclick="toggleLight()">控制灯光</button>
    <button onclick="sendCommand('turnOn')">打开设备</button>
    <button onclick="sendCommand('turnOff')">关闭设备</button>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/mqtt/4.2.8/mqtt.min.js"></script>

    <script>
        // MQTT 连接配置
        const mqttBroker = 'ws://broker-cn.emqx.io:8083/mqtt';
        const publish_Topic = 'iot/my_pub';
        const subscribe_Topic = 'iot/my_sub';

        // 创建 MQTT 客户端实例
        const mqttClient = mqtt.connect(mqttBroker);

        // 连接事件处理
        mqttClient.on('connect', function () {
            console.log('连接成功');
            // 订阅主题
            mqttClient.subscribe(subscribe_Topic);
        });

        // 监听消息
        mqttClient.on('message', function (topic, message) {
            console.log("收到信息:" + message)
            update_Status(message.toString());
        });

        //更新消息
        function update_Status(msg) {
            try {
                const data = JSON.parse(msg); // 尝试解析收到的 JSON 格式消息
                const temperature = data.temperature; // 假设 JSON 数据中有 temperature 字段
                const humidity = data.humidity; // 假设 JSON 数据中有 humidity 字段
                const light = data.light; // 假设 JSON 数据中有 light 字段
                document.getElementById('temperature').textContent = temperature + '°C'; //更新temperature
                document.getElementById('humidity').textContent = humidity + '%';        //更新humidity
                document.getElementById('light').textContent = light + ' lux';            //更新light
            } catch (error) {
                console.error('解析 MQTT 消息时出错:', error);
            }
        }

        // 发布 MQTT 消息
        function sendCommand(command) {
            mqttClient.publish(publish_Topic, command);
            console.log('已发送 MQTT 消息:', command);
        }

        // 模拟函数,用于切换灯光状态
        function toggleLight() {
            const lightElement = document.getElementById('light');
            if (lightElement.textContent === '800 lux') {
                lightElement.textContent = '0 lux';
            } else {
                lightElement.textContent = '800 lux';
            }
        }
    </script>
</body>

</html>

至此,教程结束,祝编程愉快!73

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2258077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学学院项目开发总结

数学学院项目开发总结 学生成长平台 后端:技术栈gogingorm 负责内容:入团申请审核后端部分 前台 学生入团申请表单的提交根据审核状态判断不同的跳转页面 后台 活动的创建和关闭和信息提交和审核时间的管理 表单的审核流转: 班级审批基本信息审批 - > 学生会纪权部道…

flutter编译e: Daemon compilation failed: null java.lang.Exception错误解决

文章目录 错误描述解决方法修复步骤1. 清理项目缓存2. 检查项目路径一致性3. 强制禁用增量编译4. 更新依赖项5. 检查 Kotlin 和 Gradle 插件版本6. 删除 Kotlin 编译器守护进程7. 重新编译项目 错误描述 flutter应用编译时报如下错误e: Daemon compilation failed: null java.…

如何通过看板进行跨境电商的圣诞商品数据分析与优化选品流程?

引言 随着圣诞季的临近&#xff0c;跨境电商迎来了重要的销售时机。选品工作对于跨境电商的成功至关重要&#xff0c;直接关系到销售业绩和利润。本文结合相关网页信息&#xff0c;深入探讨跨境电商在圣诞期间如何利用信息整合工具展开选品工作&#xff0c;并优化选品流程。同…

Maven学习(依赖版本维护、依赖传递、解决Maven依赖冲突的3种方式)

目录 一、Maven的依赖版本维护。 &#xff08;1&#xff09;为什么需要依赖版本维护&#xff1f; &#xff08;2&#xff09;依赖统一管理的具体操作步骤。 第一步。在pom.xml文件中使用标签定义jar包的版本。 第二步。在的对应jar的中使用"${}"引入上面定义好的版本…

OpenCV 功能函数介绍

一&#xff0c; 二值化函数 功能&#xff1a; 用于对图像进行二值化处理 参数&#xff1a; cv2.threshold(输入你的图像所对应的灰度图&#xff0c; 阈值&#xff1a;是浮点还是整数取决予图像的数据类型 最大值;高于阈值的像素值&#xff0c; 阈值类型&#xff1a;cv2.THR…

JAVA根据Word模板生成word文件

本次要做一个小工具&#xff0c;读取excel数据&#xff0c;然后生成word文件。 直接上代码&#xff1a; 一、引用包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.15</version></dep…

什么是定性数据分析?有哪些定性数据分析技术及应用实践?

众所周知&#xff0c;定性数据分析软件&#xff08;QDA 软件&#xff09;为研究人员提供了显著的优势&#xff0c;特别是在节省文书工作时间方面&#xff0c;“让研究人员可以从事更有意义的分析工作”。 使用它是从事实际有效研究的最关键步骤之一。然而&#xff0c;知道您需要…

【前端】JavaScript中的闭包与垃圾回收机制详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;垃圾回收机制&#xff08;Garbage Collection, GC&#xff09;垃圾回收的核心原理核心过程 函数作用域与垃圾回收运行分析输出结果 垃圾回收的局限性与挑战 &#x1f4a…

android studio 读写文件操作(应用场景三)

android studio版本&#xff1a;2023.3.1 patch2 例程&#xff1a;filesaveandread 其实我写这个都是我记录我要做后个数独小游戏&#xff0c;每一个都是为了解决一个问题。即是分享也是备忘&#xff0c;反正我什么都不会&#xff0c;就是一顿瞎改&#xff0c;不行就研究。这…

分库分表基本概念讲解

一、基本概念 产生背景 在数据爆炸的年代&#xff0c;单表数据达到千万级别&#xff0c;甚至过亿的量&#xff0c;都是很常见的情景。这时候再对数据库进行操作就是非常吃力的事情了&#xff0c;select个半天都出不来数据&#xff0c;这时候业务已经难以维系。不得已&#xf…

华为自反ACL实验

一、实验背景 做这个实验的原因是最近公司里上了三台小程序服务器&#xff0c;由于三台服务器的端口都映射出去了&#xff0c;领导要求A网段的三台服务器不能访问内网B&#xff0c;C网段&#xff0c;同时B、C网段内网用户可以访问A段的94、95、96服务器&#xff1b; 也就是PC4\…

美图撕掉蔡文胜标签

卖掉比特币的美图不投机了。 作者|周立青 编辑|杨舟 12月5日&#xff0c;比特币突破10万美元大关&#xff0c;曾花费1亿美元购入虚拟货币的美图宣布已出售所有加密货币。 美图在港交所发布公告称&#xff0c;自2024年11月起&#xff0c;公司已开始出售其持有的加密货币&…

git拉取代码报错问题:Pulling is not possible because you have unmerged files. hint

我们在工作中&#xff0c;需要切换到另外一个分支&#xff0c;拉取代码的时候会报这样的问题&#xff1a; Pulling is not possible because you have unmerged files. hint: Fix them up in the work tree, and then use git add/rm <file> hint: as appropriate to ma…

青训营-豆包MarsCode技术训练营试题解析三十七

引言 随着AI领域的发展&#xff0c;底层算法确实起到了决定性的作用。为了跟上这个快速发展的领域&#xff0c;我们需要不断学习和提升自己的技能。刷题是一种很好的方式&#xff0c;可以帮助我们巩固基础知识&#xff0c;提高解决问题的能力。 介绍 ‌豆包青训营‌是由字节…

openlayers地图缓存添加

//通过安装包localforage&#xff08;npm install localforage&#xff09;或https://cdnjs.cloudflare.com/ajax/libs/localforage/1.10.0/localforage.min.js tileCacheStore.js import localforage from localforage var tileCacheStorenull;// 从缓存中获取该瓦片 functio…

《IP 电话:选型指南与应用优势》

《IP 电话&#xff1a;选型指南与应用优势》 一、IP 电话概述二、IP 电话的选型1. 功能与应用2. 性能及可靠性3. 兼容及可升级性4. 外观设计及管理需求5. 性价比 三、IP 电话的应用场景1. 企业办公2. 工厂和仓库3. 酒店和旅游业4. 医疗机构5. 零售业6. 教育机构7. 个人用户 四、…

解决Logitech G hub 无法进入一直转圈的方案(2024.12)

如果你不是最新版本无法加载尝试以下方案&#xff1a;删除AppData 文件夹下的logihub文件夹 具体路径&#xff1a;用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本&#xff0c;记得备份&#xff01;&#xff01; ↓如果你是最新…

[网络爬虫] Jsoup : HTML 解析工具

1 概述 简介 Jsoup是一款基于Java的HTML解析器&#xff0c;它提供了一种简单、灵活且易于使用的API&#xff0c;用于从URL、文件或字符串中解析HTML文档。它可以帮助开发人员从HTML文档中提取数据、操作DOM元素、处理表单提交等。 主要特点 Jsoup的主要特点包括&#xff1a; 简…

top命令和系统负载

1 top中的字段说明 top是一个实时系统监视工具&#xff0c;可以动态展现出 CPU 使用率、内存使用情况、进程状态等信息&#xff0c;注意这些显示的文本不能直接使用 > 追加到文件中。 [rootvv~]# top -bn 1 | head top - 20:08:28 up 138 days, 10:29, 4 users, load av…

golang实现简单的redis服务4(实现过期时间功能)

为什么要做过期时间?redis失效时间是如何做的redis有那些过期策略,优缺点,实现原理?redis使用的什么方案 redis 有那些内存淘汰策略?常用的是什么,为什么?noeviction: 不处理lru: 未使用时间最久的keylfu: 使用次数最少的keyrandom: 随机keyvolatile与allkeys的区别 仓库地…