【物联网服务NodeJs-5天学习】第四天存储篇③ ——基于物联网的WiFi自动打卡考勤系统,升级存储为mysql,提醒功能改为QQ

面向读者群体

  • ❤️ 电子物联网专业同学,想针对硬件功能构造简单的服务器,不需要学习专业的服务器开发知识 ❤️
  • ❤️ 业余爱好物联网开发者,有简单技术基础,想针对硬件功能构造简单的服务器❤️
  • ❤️ 本篇创建记录 2023-03-12 ❤️
  • ❤️ 本篇更新记录 2023-03-12 ❤️

技术要求

  • HTMLCSSJavaScript基础更好,当然也没事,就直接运行实例代码学习

专栏介绍

  • 通过简短5天时间的渐进式学习NodeJs,可以了解到基本的服务开发概念,同时可以学习到npm、内置核心API(FS文件系统操作、HTTP服务器、Express框架等等),最终能够完成基本的物联网web开发,而且能够部署到公网访问。

🙏 此博客均由博主单独编写,不存在任何商业团队运营,如发现错误,请留言轰炸哦!及时修正!感谢支持!🎉 欢迎关注 🔎点赞 👍收藏 ⭐️留言📝

1. 前言

本篇基于

的基础上,会做以下两点升级,更加符合实际技术选型。

  • 数据存储从文件改为mysql数据库
  • 提醒功能从飞书群改成QQ群

所以本篇更偏向于差异点,不会从头到尾重复一遍。

不熟悉的同学先学习基础知识:

实现思路:

  • esp8266开启混杂Sniffer模式(设备端代码此次不需要改动,我们重点关注NodeJS实现即可)
  • 捕获管理帧和数据帧,解析出MAC地址
  • 上传到NodeJs服务器,后台服务器会对mac地址和用户信息进行比对,通过的打卡记录会存入MySQL数据库,然后发送到班级QQ群里面。

2. 服务器代码

服务器包括两大块:

  • 配置MySQL服务器
  • NodeJs服务器开发

2.1 配置MySQL服务器

初学者先简单学习:

到这一步,我们认为已经建立了一个叫做nodejs的数据库。
在这里插入图片描述
我们通过DBeaver建立一张新表,表名为:

  • check_record表名

表列包括:

  • uid 用户编号 bigint unsigned
  • username 用户名字 varchar(100)
  • mac 用户mac地址 varchar(100)
  • checktime 打卡时间 timestamp
    在这里插入图片描述

构建一个索引uid:

  • uid 作为列 uid的索引
    在这里插入图片描述

有兴趣的同学了解一下mysql的数据类型

最终生成的DDL:
在这里插入图片描述

执行保存生成新表:
在这里插入图片描述
在这里插入图片描述

可以得到一张新的表:
在这里插入图片描述
到这一步,我们的表已经创建成功,接下来就是nodejs方面的业务编写。

2.2 NodeJs服务器开发

在这里插入图片描述

2.2.1 对接Express服务器
  • express_server.js
// 1、导入所需插件模块
const express = require("express")
const {getIPAdress} = require('./utils/utils.js')
const bodyParser = require('body-parser')
const {router} = require('./router/router.js')

// 2、创建web服务器
let app = express()
const port = 8266 // 端口号                 
const myHost = getIPAdress();

// 3、注册中间件,app.use 函数用于注册全局中间件 (局部中间件?)

/***
 * Express(npm ls 包名 参考版本号) 内置了几个常用的中间件:
 * - express.static 快速托管静态资源的中间件,比如 HTML文件、图片、CSS等
 * - express.json 解析JSON格式的请求体数据 (post请求:application/json)
 * - express.urlencoded 解析 URL-encoded 格式的请求体数据(表单 application/x-www-form-urlencoded)
 * 
*/

// 3.1 预处理中间件

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.use(function(req, res, next){
    // url地址栏出现中文则浏览器会进行iso8859-1编码,解决方案使用decode解码
    console.log('解码之后' + decodeURI(req.url));
    console.log('URL:' + req.url);
    console.log(req.body);
    next()
})

// 3.2 路由中间件
app.use(router)

// 3.3 错误级别中间件(专门用于捕获整个项目发生的异常错误,防止项目奔溃),必须注册在所有路由之后
app.use((err, req, res, next) => {
    console.log('出现异常:' + err.message)
    res.send('Error: 服务器异常,请耐心等待!')
})

// 4、启动web服务器
app.listen(port,() => {
    console.log("express 服务器启动成功 http://"+ myHost +":" + port);
});
2.2.2 对接Mac地址处理
// 1、导入所需插件模块
const express = require("express")
const time = require('../utils/time.js')
const checkQQ = require('../alarm/check_qq.js')
const userConfig = require('../config/user_config.js')
const mysql = require('../pool_mysql')

// 2、创建路由对象
const router = express.Router();

// 3、挂载具体的路由
// 配置add URL请求处理
// 参数1:客户端请求的URL地址
// 参数2:请求对应的处理函数
//        req:请求对象(包含与请求相关属性方法)
//        res:响应对象(包含与响应相关属性方法)

router.post('/api/add/check', (req, res) => {
    var body = req.body
    var datas = body.datas
    var name = ''

    if (datas){
      datas.forEach(element => {
        var value = element.value
      
        var userInfo = userConfig.checkUser(value)
        // 匹配成功
        if (userInfo) {
          // 写入数据库,有待优化,批量写入
          mysql.insertCheckRecord(userInfo.uid, userInfo.name, value, time.getCurrentDateTime())
          // 往QQ群发送信息
          checkQQ.sendGroupMsg(userInfo.group, `${userInfo.name} 打卡了!`)
          console.log(`${name} 打卡了!`)
          // throw new Error('模拟项目抛出错误!')
        } else {
          console.log(`${value} 无法在配置表中找到!`)
        }
      });
    }
    res.send("OK")
})

// 4、向外导出路由对象
module.exports = {
    router
}

首先会把用户配置信息映射为一个map对象(主要代码在user_config.js)

[{
	"name": "霍同学",
	"uid": 202202001,
	"mac": "B0:E1:7E:70:25:CD"
}, {
	"name": "华同学",
	"uid": 202202002,
	"mac": "78:DA:07:04:5D:18"
}, {
	"name": "陈同学",
	"uid": 202202003,
	"mac": "30:FC:68:19:52:A4"
}, {
	"name": "叶同学",
	"uid": 202202004,
	"mac": "F4:EE:14:0E:4C:14"
}, {
	"name": "张同学",
	"uid": 202202005,
	"mac": "94:B9:7E:1A:42:F9"
}, {
	"name": "滑同学",
	"uid": 202202006,
	"mac": "1C:60:DE:AE:D9:06"
}]

有数据过来的时候需要匹配map,然后把数据写入数据表check_record中。

// 写入数据库,有待优化,批量写入
 mysql.insertCheckRecord(userInfo.uid, userInfo.name, value, time.getCurrentDateTime())

同时通知到对应QQ群。

// 往QQ群发送信息
 checkQQ.sendGroupMsg(userInfo.group, `${userInfo.name} 打卡了!`)
2.2.3 对接QQ群处理
// https://github.com/takayama-lily/oicq

const {createClient} = require("oicq");
const uin = xxxxx; // qq号码 填上自己的
const password = "xxxxx" // qq密码 填上自己的
const bot = createClient(uin);

bot.on("system.login.captcha", ()=>{
  process.stdin.once("data", input=>{
    bot.captchaLogin(input);
  });
});

bot.on("system.online", ()=>console.log("服务器:QQ上线"));
// system.offline.kickoff 被其他客户端踢下线, 默认不自动重登(见相关配置 kickoff)
bot.on("system.offline.kickoff", ()=>console.log("服务器踢下线"));
// system.offline.network 网络不通畅或服务器繁忙, 默认自动重登(见相关配置 reconn_interval)
bot.on("system.offline.network", ()=>console.log("网络错误导致下线"));
bot.login(password)

// 发送群组消息
function sendGroupMsg(groupid, text) {
  bot.sendGroupMsg(groupid, text)
}

// 发送私聊消息
function sendPrivateMsg(uid, text) {
    bot.sendPrivateMsg(uid, text)
  }

module.exports = {
    sendGroupMsg,
    sendPrivateMsg
}

3.ESP8266代码

保持和 【NodeJs-5天学习】第三天实战篇② ——基于物联网的WiFi自动打卡考勤系统 不变

4.测试效果

4.1 串口打印日志

在这里插入图片描述
在这里插入图片描述

4.2 NodeJs服务器打印的数据

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3 mysql存储的内容

在这里插入图片描述

4.4 QQ群信息展示

在这里插入图片描述
在这里插入图片描述
至此,一个简单的教室WiFi自动打卡考勤系统就可以了。相比之前版本可以支持QQ群,同时存储到数据库中,进行历史数据留存。

4.总结

篇③结合ESP8266来开发简单物联网应用——自动考勤系统,麻雀虽小五脏俱全,初学者需要理解数据库存储操作以及对接QQ、服务请求等等对应的知识点并加以实际应用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

单片机菜鸟哥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值