const Koa = require('koa') const fs = require('fs') const path = require('path') const localEvent = require('./localEvent') const WebSocket = require('ws') const exec = require('child_process').exec const Printer = require('./PrinterDev') // koa middleware const KoaLogger = require('koa-morgan') const KoaEjs = require('koa-ejs') const KoaMount = require('koa-mount') const KoaStatic = require('koa-static') const KoaRouter = require('koa-router') const app = new Koa() let config = {} let setupMode = false try { let chk = new Promise((resolve, reject) => { fs.access(path.resolve('config.json'), (err) => { if (err) { setupMode = true resolve(0) return } config = require('./config.json') resolve(1) }) }) await chk //eslint-disable-line } catch (err) { setupMode = true } const server = app.listen(config.port || 10230, () => { console.log(`Server start on port ${server.address().port}`) }) const ws = new WebSocket.Server({ server }) app.use(KoaLogger('short')) app.use(KoaStatic(path.resolve(__dirname, 'public'))) KoaEjs(app, { root: path.resolve(__dirname, 'views'), layout: false, viewExt: 'ejs', cache: false, debug: false }) let router = null if (setupMode) { console.log(`start setup mode`) router = require('./route/install') } else { console.log(`start normal mode`) router = require('./route/dashboard') } if (router !== null) { // set Route app.use(router.routes()) app.use(router.allowedMethods()) router.put('/reboot_sys', async (c, n) => { setTimeout(function () { process.exit(1) }, 2000) c.body = '1' }) } // listen print event localEvent.on('print', str => { }) ws.on('connection', async (client, req) => { console.log(`client conneected`) let json = { ble: { enable: false, mac: '', service: '', characteristic: '' }, printer: { connect: false, serial: '', feed: 0 }, pcount: 0, lastprint: '' } // 第一次連上線推送系統狀態 json.ble.enable = config.ble.enable if (config.ble.enable) { json.ble.mac = await getBTAddr() json.ble.service = config.ble.uuid.service json.ble.characteristic = config.ble.uuid.characteristic } json.printer.connect = Printer.isOpen json.printer.serial = Printer.serial json.printer.feed = Printer.feed json.pcount = Printer.count json.lastprint = Printer.lastPrint client.send(JSON.stringify({ type: 'status', data: json })) client.on('message', msg => { let m = {} try { m = JSON.parse(msg) } catch (err) { return } switch(m.type){ case 'status': client.send(JSON.stringify({ type: 'status', data: json })) break } console.log(`get msg >> ${msg}`) }) }) async function getBTAddr() { let address = await new Promise((resolve, reject) => { exec('bt-adapter -i | grep -i address', (err, sout, serr) => { if (err) return resolve('') resolve(sout) }) }) address = address.trim() let arr = address.split(':') if (arr.length !== 2) return '' return arr[1].trim() }