当前位置: 首页 > news >正文

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

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'; //更新temperaturedocument.getElementById('humidity').textContent = humidity + '%';        //更新humiditydocument.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'; //更新temperaturedocument.getElementById('humidity').textContent = humidity + '%';        //更新humiditydocument.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

相关文章:

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

web网页连接MQTT&#xff0c;显示数据与下发控制命令 零、前言 在完成一些设备作品后&#xff0c;常常会因为没有一个上位机用来实时检测数据和下发命令而苦恼&#xff0c;在上一篇文章中提到了怎么白嫖阿里云服务器&#xff0c;并且在上面搭建了属于自己的web网站。那么现在…...

数据结构day3作业

一、完整功能【顺序表】的创建 【seqList.h】 #ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>//宏定义&#xff0c;线性表的最大容量 #define MAX 30//类型重定义&#xff0c;表示要存放数据的类…...

Android SDK 平台工具版本说明

Android SDK Platform-Tools 是 Android SDK 的一个组件。它包含与 Android 平台进行交互的工具&#xff0c;主要是 adb 和 fastboot。虽然 adb 是 Android 应用开发所必需的&#xff0c;但应用开发者通常仅使用 Studio 安装的副本。如果您想直接从命令行使用 adb 并且未安装 S…...

Sharding-jdbc基本使用步骤以及执行原理剖析

一、基本使用步骤 1、需求说明 使用sharding-jdbc完成对订单表的水平分表&#xff0c;通过快速入门的开发&#xff0c;了解sharding-jdbc使用方法 人工创建两张表&#xff0c;t_order_1和t_order_2&#xff0c;这两张表是订单表拆分后的表&#xff0c;通过sharding-jdbc向订…...

mysql重置root密码(适用于5.7和8.0)

今天出一期重置mysql root密码的教程&#xff0c;适用于5.7和8.0&#xff0c;在网上搜索了很多的教程发现都没有效果&#xff0c;浪费了很多时间&#xff0c;尝试了多次之后发现这种方式是最稳妥的&#xff0c;那么废话不多说&#xff0c;往下看&#xff1a; 目录 第一步&…...

Linux下SVN客户端保存账号密码

参考文章&#xff1a;解决&#xff1a;Linux上SVN 1.12版本以上无法直接存储明文密码_linux svn 保存密码-CSDN博客新版本svn使用gpg-agent存储密码-CSDN博客svn之无法让 SVN 存储密码&#xff0c;即使配置设置为允许_编程设计_ITGUEST 方法一&#xff1a;明文方式保存密码 首…...

centos7.9 gcc升级到11.2.1

一、信息查看 # cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) # gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件&#xff1b;请参看源代码的版权声明。本软件没有任…...

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构

HQChart使用教程30-K线图如何对接第3方数据42-DRAWTEXTREL,DRAWTEXTABS数据结构 效果图DRAWTEXTREL示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont DRAWTEXTABS示例数据结构说明nametypecolorDrawVAlignDrawAlignDrawDrawTypeDrawDataFont 效果图 …...

数仓高频面试 | 数仓为什么要分层

大家好&#xff0c;我是大D呀。 关于数仓分层&#xff0c;在面试过程中几乎是必问的。不过&#xff0c;面试官一般也不会直接考你数仓为什么要分层&#xff0c;而是在你介绍项目时&#xff0c;可能会换一种形式来穿插着问&#xff0c;比如数据链路为什么要这样设计&#xff0c…...

网络安全—部署CA证书服务器

网络拓扑 两台服务器在同一网段即可&#xff0c;即能够互相ping通。 安装步骤 安装证书系统 首先我们对计算机名进行确认&#xff0c;安装了证书系统后我们是不能随意更改计算机名字的&#xff0c;因为以后颁发的证书都是和计算机也就是这一台的服务器名字有关。 修改完成后开…...

MATLAB中circshift函数的原理分析——psf2otf函数的核心

之所以讲到MATLAB中circshift函数&#xff0c;也是源于Rafael Gonzalez的这个图&#xff0c;作为前几篇答廖老师问的blog的基础。 Rafael Gonzalez的这个图无论从哪幅图到哪幅图都不是直接的傅里叶变换或傅里叶逆变换&#xff0c;需要循环移位&#xff0c;即circshift函数。 这…...

js 惰性函数

惰性函数 是一种优化技术&#xff0c;主要用于避免重复判断和计算。它在第一次调用时确定最终的执行逻辑&#xff0c;并将其替换为适当的函数实现&#xff0c;从而在后续调用中跳过不必要的判断或初始化。 惰性函数的核心思想 第一次调用时执行初始化逻辑&#xff0c;并根据环…...

智能技术引领未来:自动图像标注的创新应用与发展

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 概述算法原理核心逻辑效果演示使用方式参考文献 参考文献&#xff1a;需要本文的详细复现过程的项目源码、数据和预训练好的模型可从该地址处获…...

深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式

数据库 深入探索数据库世界:SQLite、Redis、MySQL 与数据库设计范式一、SQLite 数据库全方位解析(一)创建与基本操作(二)数据存储与表结构设计(三)数据操作:增删改查(四)与 C 语言联合使用(五)防止 SQL 注入二、Redis 数据库深度剖析(一)数据存储类型与独特结构(…...

内网是如何访问到互联网的(华为源NAT)

私网地址如何能够访问到公网的&#xff1f; 在上一篇中&#xff0c;我们用任意一个内网的终端都能访问到百度的服务器&#xff0c;但是这是我们在互联网设备上面做了回程路由才实现的&#xff0c;在实际中&#xff0c;之前也说过运营商是不会写任何路由过来的&#xff0c;那对于…...

华为无线AC、AP模式与上线解析(Huawei Wireless AC, AP Mode and Online Analysis)

华为无线AC、AP模式与上线解析 为了实现fit 瘦AP的集中式管理&#xff0c;我们需要统一把局域网内的所有AP上线到AC&#xff0c;由AC做集中式管理部署。这里我们需要理解CAPWAP协议&#xff0c;该协议分为两种报文&#xff1a;1、管理报文 2、数据报文。管理报文实际在抓包过程…...

奖励模池化

奖励模池化 奖励模型概述 奖励模型(Reward Model)在机器学习,特别是强化学习领域中被广泛使用。它的主要作用是**对智能体(Agent)的行为进行评估并给予奖励。**例如,在训练一个机器人执行任务时,当机器人的动作符合预期目标(如成功抓取物品、按照正确路线行走等),奖励…...

基于django协同过滤的音乐推荐系统的设计与实现

一、摘要 随着现代音乐的快速发展&#xff0c;协同过滤的音乐推荐系统已成为人们业余生活的需求。该平台采用Python技术和django搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff1b;通过用户管理、音乐分类管理、音乐信息管理、歌曲数据管理、系统管理、我的…...

Tiptap,: 富文本编辑器入门与案例分析

Tiptap 是一个现代的富文本编辑器&#xff0c;基于 ProseMirror 打造&#xff0c;旨在提供一个灵活且功能强大的文本编辑解决方案。它具有开箱即用的能力&#xff0c;同时也允许开发者根据业务需求进行高度定制化扩展。与传统的富文本编辑器相比&#xff0c;Tiptap 提供了更精细…...

使用Linux的logrotate工具切割日志:Tomcat、NGINX(journal文件清理)

文章目录 引言I Tomcat日志切割配置轮转参数验证码II NGINX访问文件的配置和切割access.log 访问日志的配置使用Linux的logrotate工具切割日志验证文件切割III /run/log/journaljournalctl文件清理引言 journal文件清理: 只保留过去两天,清理之前的文件 journalctl --vacuu…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

GitHub 趋势日报 (2025年06月06日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 590 cognee 551 onlook 399 project-based-learning 348 build-your-own-x 320 ne…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

Docker、Wsl 打包迁移环境

电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本&#xff1a; 2.2.4.0 内核版本&#xff1a; 5.15.153.1-2 WSLg 版本&#xff1a; 1.0.61 MSRDC 版本&#xff1a; 1.2.5326 Direct3D 版本&#xff1a; 1.611.1-81528511 DXCore 版本&#xff1a; 10.0.2609…...