利用nodemcu和mqtt协议让嵌入式设备接入互联网(一.layui前端框架)

2023-10-31

前言

为了让自己的嵌入设备接入互联网,而且能互相通讯,用直接的TCP或者UDP协议肯定是不够的,在了解了目前物联网行业后,发现物联网常用的协议是mqtt协议(message queuing telemetry transport,消息队列遥测传输协议)。mqtt是一种基于发布/订阅模式的轻量级通讯协议,很适合用于物联网的技术场景。
然后就决定用mqtt协议作为通讯协议。
对于wifi模块,选择了nodemcu,这是一个非常有名的开源物联网平台,是基于lua语言开发的,我们能用它很快很简单的完成连接wifi,实现mqtt协议这些操作。某宝10块就能买一块。
参考github上的一个项目,其实大多数框架和工具都是用的一样的,传送门。基于该项目,我选择layui作为web的前端框架,主要用其中的UI样式来搭建网页前端。利用koa作为后端框架 ,主要用koa框架来监听加载静态资源。利用aedes 作为mqtt的消息服务器,aedes 是一个Stream-based MQTT broker(基于流的mqtt代理器),所以还要利用websocket-stream工具将消息流,从mqtt服务器传给http服务器。最后ui效果如下,车子可以将想传递的信息通过mqtt传出来。
在这里插入图片描述
这个难倒不难,但涉及到的知识面比较广,我从前也没碰过HTML,nodejs等网络相关的知识,所以就把所有的知识拆开来讲。今天先简单讲HTML相关的知识,以及怎么用layui前端框架快速做UI界面,大佬请绕行。

HTML知识简单总结

细节的我不讲,可以参考菜鸟教程HTML教程,和B站HTML速成
我只讲一些小技巧和关键的知识。由于我经常切换语言,所以选用的是vscode编辑器,而不是其他的编辑器。电脑浏览器我用的google,手机的华为官方浏览器,其他的没有测试。

vscode快捷操作

  • 输入感叹号回车,可以快速生成html代码框架
    在这里插入图片描述
  • 输入 . 加类名可以快速生成类标签
    在这里插入图片描述
  • 输入标签名快速生成结束标签
    在这里插入图片描述
  • 注释快捷键 ctrl + /, 取消注释重复ctrl + /即可

HTML知识总结

HMTL结构

  • <!DOCTYPE>声明用做指示web浏览器使用那个HTML版本,对于HTML5<!DOCTYPE html>,对于HMTL其他版本,有其他的写法。
    <!DOCTYPE>是声明不是标签,且它必须位于HTML文档的第一行位于<html>标签之前。
  • <html>标签,该标签定义了文档的开始点和结束点。HTML常见的文档结构是
    <!DOCTYPE>
    <html>
    	<head>
    	...
    	</head>
    	<body>
    	...
    	</body>
    </html>
    
    <html>还有一个常用的属性设置,例如<html lang='zh'>,lang属性表明了是中文网址还是英文网址,是给搜索引擎判断的,不影响html的内容,可以不设置。

头部

头部主要用来描述文档的一些通用属性,如编码方式,标题内容等,还可以插入全局的CSS文件和scripts脚本。所有的头部相关的内容都放在<head></head>之间。

  • <meta>标签,meta常用的有三个属性。
    • charset属性,用来规定编码方式,例如<meta charset="UTF-8">表明用utf-8编码,编码格式跟浏览器的设置有关,常用的是utf-8,如果出现乱码的情况,检查浏览器的编码方式,与其设置相同即可。
    • name属性,配合content使用,例如<meta name="keywords" content="前端">,告诉搜索引擎,网页的关键字。例如,<meta name="viewport" content="width=device-width, initial-scale=1.0">,viewport是视口的意思,width=device-width是指视口宽度等于设备宽度,initial-scale=1.0表示初始状态不做缩放。这个属性在需要在移动设备访问的网站很重要。
    • http-equiv属性,配合content使用,例如<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">,意思是如果安装了GCF(google chrome浏览器内嵌框架),则使用GCF渲染,如果没有GCF,则使用最高版本的IE内核渲染。例如<meta http-equiv="refresh" content="1">可以让浏览器每一秒刷新一次网页。
      只介绍我目前用的几种,详细的可参考这篇博文HTML meta标签总结与属性使用介绍
  • <title>标签,用于指示网页名字,在浏览器的标签页上显示。
  • <link>标签,用于定义文档和外部资源的关系,常用与链接CSS样式表。如下,链接了文件所在目录下的base.css文件和子目录下的layui.css文件,rel代表两者的关系,被链接文档是当前文档的样式表,href定义被链接文档的位置。
    <link rel="stylesheet" href="layui/css/layui.css">
    <link rel="stylesheet" href="./base.css">
    

身体

身体部分的内容,便是网页的主要内容了,所有的身体相关的内容都放在<body></body>之间。

  • <p></p>标签定义段落,<h1></h1>标签定义一级标题,标题标签最多有6个,只能使用<h1>~<h6>
  • <a></a>标签可定义锚(archor),锚常用来做超链接,不同于<link>只能用在头部,<a>一般用在body部分,例如<a href="https://www.baidu.com/">百度主页</a>便可以点击百度主页调到百度的网址。
  • <div></div>标签,常搭配class或id属性使用,对内容进行分区。
  • <fieldset></fieldset>标签,当元素放入到fieldset标签内,浏览器用特殊的方式显示他们。例如这段代码,效果如下图,会生成一个方框。其中<legend></legend>中的内容是内嵌在方框上的标题。
    ...
    <body>
    	<fieldset>
        	<legend>
            	内容
        	</legend>
        	<p>121</p>
        	<p>212</p>
    	</fieldset>
    </body>
    ...
    

在这里插入图片描述

  • <script></script>标签,script 元素既可以包含脚本语句,也可以通过 src 属性指向外部脚本文件。

样式表CSS

参考B站教程CSS速成和W3school教程CSS教程
CSS的语法很简单,由选择器和声明块组成。如下图。
在这里插入图片描述
选择器有多种类型,这里只讲常用的三种,声明块类似于jason的键值语法。

  • 元素选择器,例如p,h1,h2,a这种都属于元素选择器。格式如下
p
{
	margin-top: 5%;
    text-align:right;
    font-size: 2em;
}
  • 类选择器,类基本是自己定义的,使用方法如下
.box
{
	margin-top: 5%;
    text-align:right;
    font-size: 2em;
}
<div class="box">This is important!</div>
  • id选择器,id也是自己定义的,使用方法如下
#mostImportant {color:red; background:yellow;}
<h1 id="mostImportant">This is important!</h1>

layui介绍

layui是一个中国社区维护的开源Web UI解决方案。Layui官网,下载解压后是一个不到1M的文件,使用也很方便,直接放到项目目录。如官方示例,只要在头部链接layui.css文件,在body部分,链接layui.js,便可以使用layui中的特性了。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
  <title>开始使用 layui</title>
  <link rel="stylesheet" href="./layui/css/layui.css">
</head>
<body>
 
<!-- 你的 HTML 代码 -->
 
<script src="./layui/layui.js"></script>
<script>
layui.use(['layer', 'form'], function(){
  var layer = layui.layer
  ,form = layui.form;
  
  layer.msg('Hello World');
});
</script> 
</body>
</html>

官网
在这里插入图片描述
layui的官方文档讲的很详细,使用起来也很方便,这里我就不多叙述了。

源码

这里用了layui的栅格系统,让内容的显示,在当前屏幕下水平排列,如果屏幕大小低于临界值则堆叠排列。由于没有用到layui的js文件的一些效果,所以我没有引用layui.js文件。
base.css是我自定义的一个样式表,目的是保证每个块的格式相同。
mqtt.min.js是可以让我们在网页端使用mqtt协议的脚本文件
webclient.js是自定义脚本,用于使用mqtt协议,订阅topic,将topic中包含的内容显示在html界面上。
js文件的讲解会放在后面讲。
index.html

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

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <!-- 该语句每一秒刷新网页 -->
    <!-- <meta http-equiv="refresh" content="1"> -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="layui/css/layui.css">
    <link rel="stylesheet" href="./base.css">
    <title>index</title>
</head>


<body>

    <fieldset class="layui-elem-field">
        <legend>状态显示</legend>
        <div class="layui-container">
            <div class="layui-row layui-col-space10">
                <div class="layui-col-md3">
                    <div class="basebox" style="background-color: burlywood;">
                        <div class="layui-row">
                            <div class="layui-col-xs6">
                                <div class="title">
                                    油门踏板:
                                </div>
                            </div>
                            <div class="layui-col-xs6">
                                <div class="content" id='throttle'>
                                    0%
                                </div>
                            </div>
                        </div>

                    </div>
                </div>
                <div class="layui-col-md3">
                    <div class="basebox" style="background-color: rgb(222, 135, 183);">
                        <div class="layui-row">
                            <div class="layui-col-xs6">
                                <div class="title">
                                    刹车踏板:
                                </div>
                            </div>
                            <div class="layui-col-xs6">
                                <div class="content" id='brake'>
                                    0%
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="layui-col-md3">
                    <div class="basebox" style="background-color: rgb(148, 135, 222);">
                        <div class="layui-row">
                            <div class="layui-col-xs7">
                                <div class="title">
                                    方向盘角度:
                                </div>
                            </div>
                            <div class="layui-col-xs5">
                                <div class="content" id='steer'>
                                    0&deg;
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="layui-col-md3">
                    <div class="basebox" style="background-color: rgb(222, 135, 183);">
                        <div class="layui-row">
                            <div class="layui-col-xs6">
                                <div class="title">
                                    轮子转速:
                                </div>
                            </div>
                            <div class="layui-col-xs6">
                                <div class="content" id='rotationspeed'>
                                    0rpm
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

                <div class="layui-col-md3">
                    <div class="basebox" style="background-color: rgb(222, 135, 157);">
                        <div class="layui-row">
                            <div class="layui-col-xs6">
                                <div class="title">
                                    电量:
                                </div>
                            </div>
                            <div class="layui-col-xs6">
                                <div class="content" id='SOC'>
                                    0%
                                </div>
                            </div>
                        </div>
                    </div>
                </div>

            </div>
        </div>
    </fieldset>
    <!-- <script src="./layui/layui.js"></script> -->

    <!-- <script src="https://unpkg.com/mqtt@4.2.8/dist/mqtt.min.js"></script> -->
    <script src="./mqtt.min.js"></script>
    <script src="./webclient.js" charset="utf-8"></script>
</body>

</html>

base.css

.basebox
{  
    height: 50px;
    margin-top: 1%;
    background-color:#ffffff;
    border-radius: 5px;
}
.title
{
    margin-top: 2%;
    text-align:left;
    font-size: 2em;
}
 .content
{
    margin-top: 5%;
    text-align:right;
    font-size: 2em;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用nodemcu和mqtt协议让嵌入式设备接入互联网(一.layui前端框架) 的相关文章

  • CSS:仅显示字符串的前两个字母

    是否可以使用纯 CSS 仅显示字符串的前两个字母 到目前为止我已经尝试过 没有成功 first letter 仅针对第一个字母 无论如何对我不起作用 nth of everything 需要额外的 javascript 文本溢出 省略号 正
  • Node Sass 没有绑定您当前的环境

    我在 SO 上看到过很多这样的问题 但似乎没有一个能解决或匹配问题 Node Sass 找不到适合您当前环境的绑定 带有 Node js 6 x 的 Windows 64 位 奇怪的是 我没有安装 Node js 6 x 从命令行 node
  • Masonry - imagesLoaded - 不是函数

    Masonry and imagesLoaded应加载并正常工作 已经制作了一个类似的网站 并且可以正常运行 我不知道我的问题出在哪里 所以我希望你能看到问题所在 应该是少了点什么 在 Chrome Inspect 中 我收到以下错误 Un
  • NodeJS Express Windows 最大连接数设置

    在哪里设置nodejs的最大连接数 用于使用express get 在 Windows 10 中 与linux中的最大文件 描述符 设置有关吗 有该设置的 Windows 版本吗 最好是在nodejs中进行设置 以便在迁移到unix时兼容
  • gcloud.app.deploy 错误响应:[9] 应用程序启动错误:[email protected] start /app 节点 app.js

    我对收到的错误消息感到好奇 环境 谷歌应用引擎 Nodejs 弹性环境 没有安装 Express 服务器 设置 app yaml 包含标准信息 server js 已创建但为空 此时此刻 app js 已创建 但目前为空 错误 错误 gcl
  • 如何隐藏div元素中太长的文本?

    如何隐藏 div 中的溢出 如果文本比 div 长 则文本将换行到新行 div style width 50px border 1px solid black test test test test div 也许是 CSS 属性text o
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Twitter 卡元标签问题

    有问题的网址 https www halleonard com viewpressreleasedetail action releaseid 10261 https www halleonard com viewpressreleased
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 在打字稿中导入 json

    我是 typescript 的新手 在我的项目中 我们使用 typescript2 在我的要求之一中 我需要导入 json 文件 所以我创建了 d ts 文件如下 test d ts declare module json const va
  • 如何选择具有“A”类但不具有“B”类的 div?

    我有一些 div div class A Target div div class A B NotMyTarget div div class A C NotMyTarget div div class A D NotMyTarget di
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • 使用 CSS 使一行 div 高度相同

    我有一排必须具有相同高度的 div 但我无法提前知道该高度可能是多少 内容来自外部源 我最初尝试将 div 放置在封闭的 div 中并将它们向左浮动 然后我将它们的高度设置为 100 但这没有明显的效果 通过将封闭 div 的高度设置为固定
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 刷新页面时保存用户的选择

    我目前有一个页面显示不同团队的数据 我有一些数据 用户可以单击使其处于 打开 或 关闭 状态 并为每个数据显示不同的图标 它基本上就像一个清单 只是没有物理复选框 我想记住哪些 复选框 已被选中 即使在用户刷新页面或关闭浏览器并稍后返回之后
  • 图像背景不透明度不影响边框

    如何设置背景不透明度而不影响边框线不透明度 我找到的解决方案没有帮助 div class selected img src assets img image product 1 thumbnail jpg alt product 1 thu
  • 可以设置标题样式吗? (并且使用CSS或js?)[重复]

    这个问题在这里已经有答案了 我想知道是否可以设计一个title a href title This is a title Hello a 样式问题有两个方面 文本格式 编码 我猜这是可能的 所以在问题中这样做 工具提示样式 你能把它弄大一点
  • 从数据库检查数据的异步解决方案各种循环子句

    我想要做的是异步检查数据库并从中获取结果 在我的应用程序中我试图实现Asynchronously将此步骤解决为 从数据库中检查手机号码JsonArray循环子句的种类 Create JsonArray从结果 打印创建的数组 我学到了足够多的
  • 如何创建适合屏幕宽度的等宽/高框? [复制]

    这个问题在这里已经有答案了 我正在尝试建立一个网站 其中有很多宽度和高度相等的框 例如 我有一个页面 其中并排有两个相同大小的框 简单的解决方案是将宽度和高度设置为 50vw 这在出现滚动条之前效果很好 我已经用谷歌搜索了几个小时 但无法理
  • 在 MySQL 中存储表情符号的编码问题:如何使用 Prisma ORM 在 NodeJS 中定义字符排序规则?

    亲爱的 Nodejs 专家和数据库专家 我们在 MySQL 数据库中存储表情符号和其他特殊字符时遇到问题 我们使用 Prisma 得到一个错误 这是我们使用的 ORM 参数无法从排序规则 utf8 general ci 转换为 utf8mb

随机推荐

  • HTML+CSS写一个简单的小项目

    HTML CSS写一个小项目 最近在学前端 花了一个月才基本把html和css基本搞清楚 现在在学习js和react方面的有关内容 想着之前学过的前端知识不能丢掉 于是乎萌生出了这样一个想法 那么 不如直接动手操作 于是我打开电脑 操作了起
  • pip 下载慢 pip下载报错 pip加速

    解决方法 更换国内源 阿里云 https mirrors aliyun com pypi simple 豆瓣 http pypi douban com simple 清华大学 推荐 https pypi tuna tsinghua edu
  • 实战C/C++ 的依赖管理工具 – Conan

    在高级编程语言中 C C 广受开发人员的亲睐 在语言排名上也名列前茅 生命力旺盛 而作为一个C C 程序猿 随着开源模块 车轮 的不断创造 你在使用什么工具或方法管理你的依赖和模块化你的开发成果 创造属于你的世界车轮 你还在用 GIT SV
  • ArrayList的底层原理

    ArrayList简介 ArrayList 是我们开发中非常常用的数据存储容器之一 其底层是数组实现的 我们可以在集合中存储 任意类型的数据 ArrayList 是线程不安全的 非常适合用于对元素进行查找 效率非常高 1 ArrayList
  • 22-队列

    队列 Queue 一般的顺序队列 由于这种结构会有假溢出的情况 所以一般不选择这种队列 而更多的使用循环队列 循环队列 判断队列满的情况 1 count来计数 通常使用count Count等于队列的MAXSIZE 2 Flag标志 int
  • FlatBuffers学习总结

    据说facebook使用google的黑科技flatbuffers 用来替代传统的json进行数据交换 大大提高了facebook android客户端的效率 于是我在网上查找各种资料学习了一下flatbuffers 参看资料包括GOOGL
  • 卷积神经网络-猫狗识别(附源码)

    一 项目描述 该项目将使用卷积神经网络算法 识别图片中的动物是猫还是狗 数据集地址 https momodel cn explore 5efc77dbc018c95e69fb2a81 type dataset 其中 训练用的图片数据集在 d
  • Python:TypeError: function object is not subscriptable

    X train X test y train y test train test split wine dataset data wine dataset target random state 0 以上语句在jupytet noteboo
  • python递归搜索文件再同步到服务器,Python递归查找文件并移动到一个目标目录

    脚本应递归浏览根路径目录并查找所有带 mp4扩展名的文件 打印目录结构的文件列表 然后将文件移动到destDir目录 我遇到的问题是当试图将文件移动到新目录 只有rootPath目录中的文件将被移至新目标 在ROOTPATH下子目录中的文件
  • Android 判断当前APP是否在前台

    Android 判断当前APP是否在前台 isTopActivityAPP com test 1 private boolean isTopActivityAPP String packageName int taskNumber bool
  • android jetpack之LifeCycle

    jetpack是一整套google为开发者提供的开发库 里面包含很多组件 今天学习下LifeCycle LifeCycle是可以感知生命周期型组件可执行操作来响应另一个组件 如 Activity 和 Fragment 的生命周期状态的变化
  • 解决百度文库复制问题 非VIP也能复制文字

    目录 前言 方法1 百度文库搜索功能 方法2 百度文库翻译接口 方法3 查看html的innerText 前言 百度的产品非常多 但是如果没有VIP 那么使用起来的用户体验无异于粪池蝶泳 这是不好的 今天来解决百度文库的复制问题 有些时候
  • mybatis中with invalid types () or values ()错误

    在使用配置mybatis时出现了with invalid types or values 错误 Exception in thread main org apache ibatis exceptions PersistenceExcepti
  • 基于Kubernetes平台部署Grafana Loki Promtail系统

    原文链接 基于Kubernetes平台部署Grafana Loki Promtail系统 文章目录 一 创建独立的命名空间 二 部署Grafana 2 1 编写grafana部署的配置文件 2 2 部署grafana 三 部署 Loki 3
  • layui 点击重置按钮, select 并没有被重置(大坑)

    如下所示 点击重置时 输入框被重置为空 而账号 select元素并没有被重置 重置事件 reset click function searchConte
  • 单链表与双链表-线性表的链式表示

    文章目录 前言 一 单链表 1 单链表的结构体定义 2 单链表的创建 3 单链表的基本操作 3 1 输出操作 PrintList 3 2 按位查找 GetElem 3 3 按值查找 LocateElem 3 4 插入操作 ListInser
  • FM的DNN实现——隐向量可以认为就是embedding学习的权重

    之前一直在思考怎么实现FM 后来在看DeepFM的时候 被一句话点醒 如下 DeepFM论文中有这么一句话 the latent feature vectors V in FM now server as network weights w
  • OD华为机试 24

    两数之和绝对值最小 描述 给定一个从小到大的有序整数序列 存在正整数和负整数 数组 nums 请你在该数组中找出两个数 其和的绝对值 nums x nums y 为最小值 并返回这个绝对值 每种输入只会对应一个答案 但是 数组中同一个元素不
  • Unity Shader 学习 004-Shader 调试 平台差异性 第三方调试工具

    文章目录 学习时间 学习产出 1 调试Shader 1 1 我们打开FrameDebug窗口 1 2 通过FrameDebug窗口查看我们shader渲染目标的状态 2 平台差异性 2 1 抗锯齿 2 2 DX平台定义变量更严格 3 第三方
  • 利用nodemcu和mqtt协议让嵌入式设备接入互联网(一.layui前端框架)

    文章目录 前言 HTML知识简单总结 vscode快捷操作 HTML知识总结 HMTL结构 头部 身体 样式表CSS layui介绍 源码 前言 为了让自己的嵌入设备接入互联网 而且能互相通讯 用直接的TCP或者UDP协议肯定是不够的 在了