diff --git a/PrinterDev.js b/PrinterDev.js index cd6e025..32ac7c7 100644 --- a/PrinterDev.js +++ b/PrinterDev.js @@ -2,11 +2,7 @@ const EventEmitter = require('events') const escpos = require('escpos') const config = require('./config.json') const fs = require('fs') - -// const device = new escpos.Serial(config.printer.serial) - -// const printer = new escpos.Printer(device) -// let isOpen = false +const iconv = require('iconv-lite') class PrinterDevice { constructor() { @@ -16,6 +12,11 @@ class PrinterDevice { this._type = null // type = serial or console } + encodeStr(str){ + if(!str || typeof str != 'string') return false + return iconv.encode(str, 'big5') + } + async connect() { let chkSerial = await new Promise((resolve, reject) => { fs.access(config.printer.serial, err => { @@ -44,16 +45,41 @@ class PrinterDevice { }) } - printerString(str) { - if (!this._isOpen || !this._printer) return - let strs = str.split(/\n/) + async printerString(str) { + if (!this._isOpen || !this._printer) return false + this._printer.font('a') .align('ct') .size(1, 1) - for (let i in strs) { - this._printer.text(strs[i], 'big5') + + let cmds = str.split(/__/).filter(t => t) + + for (let i in cmds) { + let tmp = cmds[i] + if (tmp[0] === '&') { + switch (tmp[1]) { + case 'a': + let align = tmp.substring(2) + if (!align) break + this._printer.align(align) + break + case 's': + let size = tmp.substring(2) + let sarr = size.trim().split(',') + if (sarr.length != 2) break + if(!isFinite(sarr[0]) || !isFinite(sarr[1])) break + sarr = sarr.map(t => Math.floor(t)) + this._printer.size(sarr[0], sarr[1]) + break + } + } else { + this._printer.print(this.encodeStr(tmp)) + } } - this._printer.cut(true, 8) + + this._printer.cut(true, config.printer.cutFeed || 4) + + return true } async close() { @@ -61,7 +87,7 @@ class PrinterDevice { if (this._type == 'serial') { let self = this await new Promise((resolve, reject) => { - self._device.close(() => { + self._printer.close(() => { resolve(1) }) }) diff --git a/app.js b/app.js index abbd305..b2f6dc4 100644 --- a/app.js +++ b/app.js @@ -8,6 +8,16 @@ const MainService = require('./main-service') const printer = require('./PrinterDev') +async function initSystem(){ + try{ + await printer.connect() + }catch(err){ + throw err + } +} + +initSystem() + bleno.on('stateChange', state => { console.log(`bt device state ${state}`) if (state == 'poweredOn') { @@ -31,7 +41,6 @@ bleno.on('advertisingStart', function (error) { }) localEvent.on('print', async (str) => { - console.log(`get printer string >>> \n${str}`) let status = false if (printer.isOpen) { try { @@ -46,4 +55,5 @@ localEvent.on('print', async (str) => { process.on('SIGINT', () => { printer.close() + process.exit(0) }) \ No newline at end of file diff --git a/config.json b/config.json index 9b2bba9..58bd2f0 100644 --- a/config.json +++ b/config.json @@ -9,6 +9,7 @@ } }, "printer": { - "serial": "/dev/ttyUSB0" + "serial": "/dev/ttyUSB0", + "cutFeed": 8 } } diff --git a/gdata-characteristic.js b/gdata-characteristic.js index 2fcd438..c75a73e 100644 --- a/gdata-characteristic.js +++ b/gdata-characteristic.js @@ -4,6 +4,7 @@ const localEvent = require('./localEvent') var tmp = [] var idx = 0 +var failFlag = false const notifyDesciptor = new bleno.Descriptor({ uuid: '8888', @@ -29,12 +30,23 @@ class DataCharacteristic extends bleno.Characteristic { if (data.length == 1 && data[0] == 0x00) { tmp = [] idx = 0 + failFlag = false } else if (data.length == 1 && data[0] == 0xff) { console.log(Buffer.from(tmp).toString()) - localEvent.emit('print', Buffer.from(tmp).toString()) - } else { + if (!failFlag) { + localEvent.emit('print', Buffer.from(tmp).toString()) + } + } else if (!failFlag) { + let pidx = ((data[0] & 0xff) << 8) + (data[1] & 0xff) + if (idx !== pidx) { + // insert fail method + failFlag = true + this.sendNotidy('fail') + } + idx++ tmp = [...tmp, ...data.slice(2, data.length)] } + if (!withoutResponse) { console.log('send response') callback(this.RESULT_SUCCESS) diff --git a/initscript/systemd/ble-server.service b/initscript/systemd/ble-server.service new file mode 100644 index 0000000..4bd5415 --- /dev/null +++ b/initscript/systemd/ble-server.service @@ -0,0 +1,12 @@ +[Unit] +Description=BLE Printer Server +After=bluetooth.target + +[Service] +ExecStart=/usr/local/bin/node /usr/local/node/ble-server/app.js +Restart=always +User=root +Environment="NODE_ENV=production" + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/main-service.js b/main-service.js index 4dc21c3..eec9898 100644 --- a/main-service.js +++ b/main-service.js @@ -2,7 +2,6 @@ const bleno = require('bleno') const config = require('./config.json') const localEvent = require('./localEvent') -// const TimeCharacteristic = require('./time-characteristic') const GdataCharacteristic = require('./gdata-characteristic') const dataCharacteristic = new GdataCharacteristic() @@ -17,7 +16,8 @@ class MainService extends bleno.PrimaryService { } } -localEvent.on('printResult', async str => { +localEvent.on('printResult', async state => { + let str = state ? 'ok' : 'fail' dataCharacteristic.sendNotidy(str) }) diff --git a/package.json b/package.json index ac0c481..3ff193f 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "dependencies": { "bleno": "^0.4.2", "escpos": "^2.4.3", + "iconv-lite": "^0.4.18", "uuid": "^3.1.0" } }