From 592b94c06d6ad12eae85f130a342e4bad259476a Mon Sep 17 00:00:00 2001 From: Zhao Xin <7176466@qq.com> Date: Fri, 2 Sep 2022 14:08:11 +0800 Subject: [PATCH] =?UTF-8?q?=E9=87=8D=E5=91=BD=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server.js | 131 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 server.js diff --git a/server.js b/server.js new file mode 100644 index 0000000..32de424 --- /dev/null +++ b/server.js @@ -0,0 +1,131 @@ +require('dotenv').config() +const port = process.env.PORT || 3000 +const express = require('express') +const socketio = require('socket.io') +const CronJob = require('cron').CronJob +const request = require('request') +const sense = require('sense-hat-led').sync +const app = express() +const server = app.listen(port, '0.0.0.0', () => console.log(`server is running on port ${port}`)) +const io = socketio(server) +app.use(express.static('public')) +sense.clear() +sense.setRotation(180) +sense.lowLight = true + +const color_red = [255, 0, 0] +const color_blue = [0, 0, 255] +const leds = [ + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0], +] +io.emit('leds', leds) + +let zhao_server_errors = 0 + +const job = new CronJob( + '*/3 * * * * *', + async () => { + // 测试 http://zhao 的连通性 + request('http://zhao', (err, res, body) => { + if (res.statusCode != 200) { + zhao_server_errors++ + } + if (zhao_server_errors > 0) { + for (let i = 0; i < zhao_server_errors; i++) { + const x = i % 8 + const y = Math.floor(i / 8) + sense.setPixel(x, y, color_red) + } + } else { + let color = sense.getPixel(0, 0) + let [r, g, b] = color + sense.setPixel(0, 0, [r, g > 0 ? 0 : 255, b]) + } + }) + }, + null, + true +) + +// const rpistatus = new CronJob( +// '*/5 * * * * *', +// async () => { +// request('http://zhao:4000', (err, res, body) => { +// if (res.statusCode == 200) { +// io.emit('data', body) +// } +// }) +// request('http://pi:4000', (err, res, body) => { +// if (res.statusCode == 200) { +// io.emit('data', body) +// } +// }) +// }, +// null, +// true +// ) + +io.on('connection', (client) => { + client.emit('leds', leds) + client.on('action', ({ action, x, y }) => { + console.log({ action, x, y }) + switch (action) { + case 'on': + sense.setPixel(Number(x), Number(y), color_blue) + leds[y][x] = 1 + break + case 'off': + sense.setPixel(Number(x), Number(y), [0, 0, 0]) + leds[y][x] = 0 + break + case 'hello': + sense.flashMessage('HELLO', 1, color_blue) + sense.clear() + read_all_leds(0) + break + case 'flash': + sense.clear([255, 255, 255]) + setTimeout(sense.clear, 100) + read_all_leds(0) + break + case 'clear': + sense.clear() + read_all_leds(0) + break + case 'temp': + read_all_leds() + get_rpis_info() + break + default: + break + } + io.emit('leds', leds) + }) +}) + +function read_all_leds(value = null) { + const pixels = sense.getPixels() + for (let y = 0; y < 8; y++) { + for (let x = 0; x < 8; x++) { + leds[y][x] = value !== null ? value : sense.getPixel(x, y)[2] == 0 ? 0 : 1 + } + } +} + +async function get_rpis_info() { + const rpis = [] + request('http://zhao:4000', (err, res, body) => { + if (res.statusCode == 200) rpis.push(JSON.parse(body)) + request('http://pi:4000', (err, res, body) => { + if (res.statusCode == 200) rpis.push(JSON.parse(body)) + io.emit('data', rpis) + }) + }) +}