篇一主要是ESP8266相关的内容,这里主要涉及MQTT服务器和温度数据显示页面。
Express是一个基于Node.js平台的web开发框架,主要是提供route服务,有很多中间件可用,在到达路由之前进行一些请求处理,本项目其实没有利用多少他的优势,只是一个简单的示范。
使用Express生成器即可快速创建一个应用的骨架,通过下面的命令
express --view=ejs myapp
由此创建了一个名称为 myapp 的 Express 应用。此应用将在当前目录下的 myapp 目录中创建,并且设置为使用ejs模板引擎(view engine),通过下面的命令安装所有依赖包,将所有package.json中所有依赖安装在node_modules文件夹中。
npm install
通过下面的命令启动
DEBUG=myapp:* npm start
本项目中,首先修改app.js
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');
//*********mqtt server******************************
var mqtt_srever = require('./routes/mqtt_server');
//*********mqtt server******************************
var app = express();
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', indexRouter);
app.use('/users', usersRouter);
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
});
// error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {};
// render the error page
res.status(err.status || 500);
res.render('error');
});
module.exports = app;
在这里新增的内容主要是Mqtt服务器,即mqtt_server.js,如下所述
输入http://localhost:3000/后,首先通过路由为/routes/index,其中的内容为
var express = require('express');
var router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: '温度动态采集显示' });
});
module.exports = router;
进一步对index进行渲染,index.ejs内容如后面的内容所示。
关于MQTT服务器端,当时在这里也卡壳了很久,主要是开头的那个服务器建立格式不对,到目前还是不知道什么原因。。。
mqtt_server.js
var mosca = require("mosca");
var MqttServer = new mosca.Server({
http: {
port: 8083,
bundle: true,
static: './'
}
});
MqttServer.on('ready', function(){
console.log('mqtt is running...');
//MqttServer.authenticate = authenticate;
});
MqttServer.on('clientConnected', function(client){
console.log('client connected', client.id);
});
MqttServer.on('clientDisconnected', function (client) {
console.log('Client Disconnected := ', client.id);
});
MqttServer.on('subscribed', function (topic, client) {
console.log("Subscribed :=", topic, client.id);
});
MqttServer.on('unsubscribed', function (topic, client) {
console.log('unsubscribed := ', topic, client.id);
});
MqttServer.on('published', function(packet, client) {
if (typeof (client) == "undefined")
return;
else
console.log('client ', client.id, ' publish :', 'topic ='+packet.topic+ ',message = '+ packet.payload.toString());
});
MqttServer.on("error", function (err) {
console.log(err);
});
module.exports = MqttServer;
这里是被index.js渲染的内容,即网页呈现的内容,这里面主要完成mqtt数据的接收和显示,同时通过按钮控制ESP8266是否采集并发送温度数据
index.ejs
<%= title %>
<%= title %>
Welcome to <%= title %>
首先创建数据库和数据表:
create database ***;
create table esptemp(temp float,datatime TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
在app.js中加入mysql数据库代码,将ESP8266采集得到的温度信息存储,并在前端页面中进行历史数据显示,写入代码如下:
if (packet.topic == "/tempinfo")
{
tempinfo = packet.payload.toString();
if ((tempinfo.search("Temperature:"))&&(tempinfo.search(";Humidity"))){
temp_char = tempinfo.split(";Humidity")[0];
temp_char = temp_char.split("Temperature:")[1];
if (temp_char!=null)
{
addSql = 'INSERT INTO esptemp (temp) VALUES (?)';
addSqlParams = parseFloat(temp_char);
connection.query(addSql,addSqlParams,function (err, result) {
if(err){
console.log('[INSERT ERROR] - ',err.message);
return;
}
console.log('-----------INSERT-------------');
//console.log('INSERT ID:',result.insertId);
console.log('INSERT ID:',result);
//console.log('-----\n\n');
});
}
服务器端查询代码如下:
var mysql = require('mysql');
var express = require('express');
var router = express.Router();
/* POST home page. */
router.post('/', function(req, res, next) {
console.log(req.body.time_begin);
console.log(req.body.time_end);
date_temp(req.body.time_begin,req.body.time_end,function(temp_result){
//console.log(temp_result);
res.send(temp_result);
});
});
function date_temp(time_begin,time_end,callback) //callback function
{
var connection = mysql.createConnection({
host : 'host',
user : '***',
password : '***',
port: '***',
database: '***'
});
connection.connect();
var temp_text;
var sql = 'select datatime, temp from esptemp where datatime >? and datatime';
var addSqlParams = [time_begin, time_end];
connection.query(sql,addSqlParams,function (err, result) {
if(err){
console.log('[SELECT ERROR] - ',err.message);
return;
}
var dataString = JSON.stringify(result);
var temp_json = JSON.parse(dataString);
//temp_text = JSON.stringify(temp_json);
console.log('-----------SELECT-------------');
console.log(temp_json);
console.log('\n\n');
callback(temp_json);
});
connection.end();
}
module.exports = router;
需要注意的是,在数据库查询中需要用到回调函数的返回值,需要特别处理。
项目路径和启动
cd /var/www/html/node_websocket/expresstest/exp_mqtt/myapp
DEBUG=myapp:* npm start