ble-server/server.js

146 lines
3.1 KiB
JavaScript

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()
}