(五)Web_Server+网页可视化展示

news2024/9/19 10:53:20

第一步:先使用nodeJS获取mqtt转发的数据:添加链接描述

第二步:使用fs库,将数据存入txt文件(接上一步,这里没处理数据格式,只是测试)


var fs=require("fs");

const mqtt = require('mqtt')
//存储订阅的消息
var message={}

const host = '47.113.146.63'
const port = '1883'
const clientId = `mqtt_${Math.random().toString(16).slice(3)}`
const connectUrl = `mqtt://${host}:${port}`
const client = mqtt.connect(connectUrl, {
  clientId,
  clean: true,
  connectTimeout: 4000,
  username: 'emqx',
  password: 'public',
  reconnectPeriod: 1000,
})


//订阅主题
const subtopic = 'inTopic'
//发布主题
const pubtopic = 'outTopic'
client.on('connect', () => {
  console.log('Connected')
  client.subscribe([subtopic], () => {
    console.log(`Subscribe to topic '${subtopic}'`)
  })
  client.publish(pubtopic, 'nodejs mqtt test', { qos: 0, retain: false }, (error) => {
    if (error) {
      console.error(error)
    }
  })
})



client.on('message', (topic, payload) => {
  console.log('Received Message:', subtopic, payload.toString())
 //将数据存储到fs文件系统中(改成往数据库中写入数据替换这部分)
  fs.appendFile('test1.txt', payload.toString(), (err) => {
    if (err) {
      console.log('数据追加失败');
    } else {
      console.log('数据追加成功');
    }
    
});

})



在这里插入图片描述
第三步:(升级)将数据存入mysql数据库
安装和Nodejs连接mysql参考:参考文章
创建一个senior_mysql.js文件

//这里用于连接数据库和往数据库插入数据,并且暴露方法
// 第一步:引入mysql模块
let mysql = require("mysql");

// 连接参数
const db_config={
    host     : 'localhost', // 主机地址
    user     : 'root',      // 用户名
    password : '123456',    // 用户密码
    database : 'nodejs',    // 数据库名
    port     : 3306,         // 端口号,默认3306 
    timezone : 'utc' // 解决时区时间统一的问题
}

// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)

// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect){//通过getConnection()方法进行数据库连接
    if(err){
        console.log(`mysql链接失败${err}`);
    }else{
    }
})

// 插入打卡记录
//存储采集的温度和时间,id自增
function insertRecord(temp,time) {
  // 第三步:正式发起数据库连接
  pool.getConnection(function(err,connect){//通过getConnection()方法进行数据库连接
    if(err){
        console.log(`mysql链接失败${err}`);
    }else{
        let insertSql2 = `insert into temp_record(temp,time) values ('${temp}','${time}')`
        console.log(insertSql2)
        connect.query(insertSql2,function(err,result){
            if(err){
                console.log(`SQL error:${err}`)
            }else{
                console.log('插入成功');
                //打印数据库里的数据,测试用
                console.log(result);
                connect.release();//释放连接池中的数据库连接
            }
        });
    }
  })
}

module.exports = {
    insertRecord
}


主文件(只需要将往fs文件系统中写入数据改成往数据库中写入数据即可)

//处理json数据
   var obj=JSON.parse(payload.toString())
   console.log('处理的数据:',obj.msg)
   //时间
   var data=time.getCurrentDateTime();
   console.log('time:',data);

  //将数据存储到数据库中 id自增,temp,时间
    seniormysql.insertRecord(obj.msg,data)

使用mqtt客户端发送数据写入数据库测试成功
在这里插入图片描述

//服务器中各个文件的功能
使用express开发服务器
第一步:创建app.js 服务器的入口文件
1.创建express对象
2.编写响应函数(中间件)
//可以处理请求或响应体
中间件的特点:对象通过use方法加入一个中间件
一个中间件就是一个函数
中间件的执行顺序符合洋葱模型,内层中间件是否执行,取决于外层中间件是否调用内层中间件
3.监听端口
绑定端口号
启动服务器 node app.js

第二步:
后台项目的实现步骤
1.项目准备
①安装包
②创建文件和目录结构
app.js
data/存放数据
middleware/(response_data.js 处理业务逻辑的中间件响应给前端)(response_duration.js 处理总耗时的中间件)(response_header.js处理响应头的中间件)
utils/ file_utils.js可以帮助我们快速读取某一个目录下的文件
回调调用next()保证下一层中间件能够执行
2.总耗时中间件(第一层)
让内层中间件得到执行通过next(),next()得到的是promise()对象,可以通过await 得到promise中包含的数据- 配合async可以让内层所有中间件得到执行
3.响应头中间件(第二层)
后面在他的基础上增加一些功能
4.业务逻辑中间件
读取文件的内容:获取请求的路径,拼接文件路径(filepath);获取该路径对应的文件内容
设置响应体
5.根据文件的路径读取文件的内容,(这里是file_utils.js 我们存储到数据库)
将数据给传递过去,这里不能用return data,因为返回给文件调用者fs.readfile不是getfileJsonData,通过promise处理异步任务(这里是视频47-14min web拿到服务器数据)

6.允许跨域
1.实际是通过ajax访问服务器
2.同源策略(同协议,同域名,同端口)
直接抄代码

vue的创建(视频49)

正题:
nodejs使用express框架参考:看这个就够了
第一步:创建express对象

//初始化
npm init
//加载express
npm install express --save
// 1. 导入 express
const express = require('express')
//解决跨域问题
const cors = require('cors');
// 2. 创建 web 服务器
const app = express()
app.use(cors())



//监听
app.listen(3002, ()=> {
    console.log('api server running at http://127.0.0.1:3002')
})

在这里插入图片描述
第二步:Nodejs连接数据库
参考文章:看这篇文章够了
终端连接数据库

npm install mysql --save

连接本地数据库

// 第一步:引入mysql模块
let mysql = require("mysql");

// 连接参数
const db_config={
    host     : 'localhost', // 主机地址
    user     : 'root',      // 用户名
    password : '123456',    // 用户密码
    database : 'nodejs',    // 数据库名
    port     : 3306,         // 端口号,默认3306 
    timezone : 'utc' // 解决时区时间统一的问题
}
var temp = new Array()

// 第二步:创建数据库连接池,这里参数会很多
let pool=mysql.createPool(db_config)


// 第三步:正式发起数据库连接
pool.getConnection(function(err,connect){//通过getConnection()方法进行数据库连接
    if(err){
        console.log(`mysql链接失败${err}`);
    }else{
    }
})


module.exports = pool

Vue项目的准备

在这里插入图片描述
我主要是使用黑马这个项目的布局(vue的配置跟着49集的视频来):vue项目准备(第49集)

这里和黑马视频里相比,修改了获取后台数据的代码(作参考,并不是最终代码。学习的话参源码学习)
(获取数据库最新10条数据)

main.js配置

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
import './assets/css/global.less'
import axios from 'axios'
//请求基准路径,后台服务器
axios.defaults.baseURL='http://127.0.0.1:3000/api/user'
// 将axios挂载到vue原型对象上
// 在别的组件中 this.$http就可以通过axios进行ajax请求
// Vue.prototype.$http = axios
//就得这样配置,上面那个不行
Vue.prototype.$axios = axios

//将全局echarts对象挂载到vue的原型对象上
//在别的组件中 this.$echarts就可以使用
Vue.prototype.$echarts=window.echarts
Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: h => h(App)
}).$mount('#app')

数据可视化

echarts配置如果不能用按照这个来:在vue中使用echarts
绘图参考echarts官网的示例,该该就能用:网页直达
在这里插入图片描述
改成自己从后台拿到的数据就能用(不清楚的参照源码学习就知道只改了数据部分)
在这里插入图片描述
设置回调函数,让页面动态刷新,每2s调用一次回调。我这里还没接板子,手动修改数据库数据演示
在这里插入图片描述
实现功能:在这里插入图片描述

nodejs获取时间

参考:添加链接描述

补一个用户登录注册系统

参考这个就可以了:登录注册

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

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

相关文章

Android ConstrainLayout布局中View位置的介绍与使用

一、介绍 ConstrainLayout是一款布局View,再Design库中,现已被大家广泛接受并使用。ConstrainLayout的布局采用的方式和其他都不同,他的对其方式是类似RelativeLayout,但是和RelativeLayout有明显的区别。 在布局渲染的时候&#…

获取Xilinx FPGA芯片IDCODE的4种方法(支持任何FPGA型号)

文章目录 方式1:官方文档方式2:一个头文件方式3:BSDL文件方法4:芯片IDCODE在线搜索网站Xilinx FPGA部分型号IDCODE汇总 方式1:官方文档 对于常用的Spartan-6系列可以在UG380文档中找到对应的IDCODE,Sparta…

CM+CDH 构建企业大数据平台

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

电磁阀位、通、开/闭原理精髓

一、引用 电磁阀在液/气路系统中,用来实现液路的通断或液流方向的改变,它一般具有一个可以在线圈电磁力驱动下滑动的阀芯,阀芯在不同的位置时,电磁阀的通路也就不同。 阀芯在线圈不通电时处在甲位置,在线圈通电时处在…

ChatGPT助力校招----面试问题分享(八)

1 ChatGPT每日一题:有源和无源滤波器 问题:有源和无源滤波器的区别 ChatGPT:有源滤波器和无源滤波器是指使用不同的电路元件来实现滤波功能的电路 有源滤波器使用了一个或多个有源元件,例如晶体管、运算放大器等,以…

浅浅总结一下雅思听力技巧

1. 地图题 读题步骤要明确 (1)看图,要看看题目中是否有东南西北的标志,如果有的话,那么大概率题目中就会用到。同时也标记好左右的标志,防止考试的时候太紧张分不清。 弄清楚个元素的相对位置&#xff0…

华为OD机试真题 Python 实现【开心消消乐】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的1进行…

卷积神经网络--猫狗系列之构建模型【ResNet50】

在上一期:卷积神经网络--猫狗系列之下载、导入数据集,如果测试成功就说明对数据的预处理工作已经完成,接下来就是构建模型阶段了: 据说建立一个神经网络模型比较简单,只要了解了各层的含义、不同层之间参数的传递等等&…

leetcode 1232. 缀点成线

题目描述解题思路执行结果 leetcode 1232. 缀点成线 题目描述 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1&a…

进程的调度常用算法

目录 先来先服务(FCFS)调度算法 短作业优先(SJF)的调度算法 基于时间片的轮转调度(RR)算法 先来先服务(FCFS)调度算法 系统将按照作业到达的先后次序来进行作业调度,或…

RT-Thread 5.0.1 qemu-virt64-aarch64 解决网络问题

参考文章 qemu 源码编译 qemu-system-aarch64 的方法 RT-Thread 5.0.1 qemu-virt64-aarch64 解决编译问题 前言 最近需要使用 RT-Thread qemu-virt64-aarch64,验证 aarch64 平台,也就是 ARM64 平台的一些网络功能,需要开启 qemu-virt64-aa…

UE4/5用贴图和GeneratedDynamicMeshActor曲面细分与贴图位移制作模型

目录 制作逻辑: ​编辑 曲面细分函数: 添加贴图逻辑: 代码: 制作逻辑: 在之前的文章中,我们使用了网格细分,而这一次我们将使用曲面细分函数,使用方法和之前是一样的&#xff1a…

高精度定位|RTK定位模块常见应用领域_厘米级室外定位解决方案

在室外场景,北斗、GPS等GNSS定位技术在持续的演变,精度越来越高,应用面也越来越广。随着新基建热潮的到来,借助5G新基建,无人驾驶、自动驾驶等技术正在逐步完善,对于定位的需求已经不仅仅只是粗略的轨迹&am…

uniapp-ios打包步骤

前置条件:已申请Apple ID并注册Apple Developer Program 一、登录苹果开发者官网 登录:https://developer.apple.com/ 点击账户(Account)进行登录,登录成功出现如下页面 二、创建证书、标识符、描述文件等 点击…

vue3基本指令使用

<script setup lang"ts"> import {ref} from vue //响应式数据 const num: number 1 const arr1: number[] [1, 2, 3, 4, 5] const str: string "我是一段文字" const htmlstr: string <section style"color:red">我是一个secti…

微服务-基于Docker安装Sentinel

目录 1、拉取Sentinel镜像 2、构建Sentinel容器 3、访问Sentinel 1、拉取Sentinel镜像 代码&#xff1a; docker pull bladex/sentinel-dashboard:1.8.0 实例&#xff1a; rootlocalhost howlong]# docker pull bladex/sentinel-dashboard:1.8.0 1.8.0: Pulling from blade…

集合及Collection集合

1&#xff1a;集合特点&#xff1a; 集合的大小不确定&#xff0c;启动后可以动态变化&#xff0c;类型也可以选择不固定。集合更像气球集合非常适合做元素的增删操作注意&#xff1a;集合只能存储引用类型数据&#xff0c;如果要存储基本类型数据可以选用包装类。 2&#xf…

2.FreeRTOS系统任务调度简介及任务状态

目录 一、基础知识 1、FreeRTOS 任务状态 (1)运行态 (2)就绪态 (3) 阻塞态 (4) 挂起态 二、任务调度简介 1.抢占式调度 2.时间片调度 3.协程式调度 一、基础知识 1、FreeRTOS 任务状态 FreeRTOS 中任务存在四种任务状态&#xff0c;分别为运行态、就绪态、阻塞态和挂…

Word模板替换,并转PDF格式输出,Linux服务器乱码问题解决

Poi-tl参考文档地址&#xff1a;http://deepoove.com/poi-tl/1.8.x/#hack-loop-table word模板替换&#xff0c;转pdf 1. 依赖引入&#xff1a;2. word模板配置&#xff1a;3. 示例demo:4 . 效果图5. 本地测试没问题&#xff0c;上Linux服务乱码&#xff0c;出现小方框 1. 依赖…

Python———运行环境搭建

不管用什么工具开发 Python 程序&#xff0c;都必须安装 Python 的运行环境。 目前最常用的是Windows 、 Linux 平台。这里 我们以Windows10为主讲解。 其实编程和平台关系不大。大家也可以使用Linux、Mac。 Windows 平台下 Python 环境搭建 第一步&#xff1a;进入 python 官…