Merge branch 'release/v0.0.1'
This commit is contained in:
commit
207c95d9ee
@ -2,11 +2,7 @@ const EventEmitter = require('events')
|
|||||||
const escpos = require('escpos')
|
const escpos = require('escpos')
|
||||||
const config = require('./config.json')
|
const config = require('./config.json')
|
||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
|
const iconv = require('iconv-lite')
|
||||||
// const device = new escpos.Serial(config.printer.serial)
|
|
||||||
|
|
||||||
// const printer = new escpos.Printer(device)
|
|
||||||
// let isOpen = false
|
|
||||||
|
|
||||||
class PrinterDevice {
|
class PrinterDevice {
|
||||||
constructor() {
|
constructor() {
|
||||||
@ -16,6 +12,11 @@ class PrinterDevice {
|
|||||||
this._type = null // type = serial or console
|
this._type = null // type = serial or console
|
||||||
}
|
}
|
||||||
|
|
||||||
|
encodeStr(str){
|
||||||
|
if(!str || typeof str != 'string') return false
|
||||||
|
return iconv.encode(str, 'big5')
|
||||||
|
}
|
||||||
|
|
||||||
async connect() {
|
async connect() {
|
||||||
let chkSerial = await new Promise((resolve, reject) => {
|
let chkSerial = await new Promise((resolve, reject) => {
|
||||||
fs.access(config.printer.serial, err => {
|
fs.access(config.printer.serial, err => {
|
||||||
@ -44,16 +45,41 @@ class PrinterDevice {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
printerString(str) {
|
async printerString(str) {
|
||||||
if (!this._isOpen || !this._printer) return
|
if (!this._isOpen || !this._printer) return false
|
||||||
let strs = str.split(/\n/)
|
|
||||||
this._printer.font('a')
|
this._printer.font('a')
|
||||||
.align('ct')
|
.align('ct')
|
||||||
.size(1, 1)
|
.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() {
|
async close() {
|
||||||
@ -61,7 +87,7 @@ class PrinterDevice {
|
|||||||
if (this._type == 'serial') {
|
if (this._type == 'serial') {
|
||||||
let self = this
|
let self = this
|
||||||
await new Promise((resolve, reject) => {
|
await new Promise((resolve, reject) => {
|
||||||
self._device.close(() => {
|
self._printer.close(() => {
|
||||||
resolve(1)
|
resolve(1)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
12
app.js
12
app.js
@ -8,6 +8,16 @@ const MainService = require('./main-service')
|
|||||||
|
|
||||||
const printer = require('./PrinterDev')
|
const printer = require('./PrinterDev')
|
||||||
|
|
||||||
|
async function initSystem(){
|
||||||
|
try{
|
||||||
|
await printer.connect()
|
||||||
|
}catch(err){
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
initSystem()
|
||||||
|
|
||||||
bleno.on('stateChange', state => {
|
bleno.on('stateChange', state => {
|
||||||
console.log(`bt device state ${state}`)
|
console.log(`bt device state ${state}`)
|
||||||
if (state == 'poweredOn') {
|
if (state == 'poweredOn') {
|
||||||
@ -31,7 +41,6 @@ bleno.on('advertisingStart', function (error) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
localEvent.on('print', async (str) => {
|
localEvent.on('print', async (str) => {
|
||||||
console.log(`get printer string >>> \n${str}`)
|
|
||||||
let status = false
|
let status = false
|
||||||
if (printer.isOpen) {
|
if (printer.isOpen) {
|
||||||
try {
|
try {
|
||||||
@ -46,4 +55,5 @@ localEvent.on('print', async (str) => {
|
|||||||
|
|
||||||
process.on('SIGINT', () => {
|
process.on('SIGINT', () => {
|
||||||
printer.close()
|
printer.close()
|
||||||
|
process.exit(0)
|
||||||
})
|
})
|
@ -9,6 +9,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"printer": {
|
"printer": {
|
||||||
"serial": "/dev/ttyUSB0"
|
"serial": "/dev/ttyUSB0",
|
||||||
|
"cutFeed": 8
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ const localEvent = require('./localEvent')
|
|||||||
|
|
||||||
var tmp = []
|
var tmp = []
|
||||||
var idx = 0
|
var idx = 0
|
||||||
|
var failFlag = false
|
||||||
|
|
||||||
const notifyDesciptor = new bleno.Descriptor({
|
const notifyDesciptor = new bleno.Descriptor({
|
||||||
uuid: '8888',
|
uuid: '8888',
|
||||||
@ -29,12 +30,23 @@ class DataCharacteristic extends bleno.Characteristic {
|
|||||||
if (data.length == 1 && data[0] == 0x00) {
|
if (data.length == 1 && data[0] == 0x00) {
|
||||||
tmp = []
|
tmp = []
|
||||||
idx = 0
|
idx = 0
|
||||||
|
failFlag = false
|
||||||
} else if (data.length == 1 && data[0] == 0xff) {
|
} else if (data.length == 1 && data[0] == 0xff) {
|
||||||
console.log(Buffer.from(tmp).toString())
|
console.log(Buffer.from(tmp).toString())
|
||||||
localEvent.emit('print', Buffer.from(tmp).toString())
|
if (!failFlag) {
|
||||||
} else {
|
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)]
|
tmp = [...tmp, ...data.slice(2, data.length)]
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!withoutResponse) {
|
if (!withoutResponse) {
|
||||||
console.log('send response')
|
console.log('send response')
|
||||||
callback(this.RESULT_SUCCESS)
|
callback(this.RESULT_SUCCESS)
|
||||||
|
12
initscript/systemd/ble-server.service
Normal file
12
initscript/systemd/ble-server.service
Normal file
@ -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
|
@ -2,7 +2,6 @@ const bleno = require('bleno')
|
|||||||
const config = require('./config.json')
|
const config = require('./config.json')
|
||||||
const localEvent = require('./localEvent')
|
const localEvent = require('./localEvent')
|
||||||
|
|
||||||
// const TimeCharacteristic = require('./time-characteristic')
|
|
||||||
const GdataCharacteristic = require('./gdata-characteristic')
|
const GdataCharacteristic = require('./gdata-characteristic')
|
||||||
const dataCharacteristic = new GdataCharacteristic()
|
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)
|
dataCharacteristic.sendNotidy(str)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
"dependencies": {
|
"dependencies": {
|
||||||
"bleno": "^0.4.2",
|
"bleno": "^0.4.2",
|
||||||
"escpos": "^2.4.3",
|
"escpos": "^2.4.3",
|
||||||
|
"iconv-lite": "^0.4.18",
|
||||||
"uuid": "^3.1.0"
|
"uuid": "^3.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user