TM-T70Ⅱをネット越しに扱えるようにする
きた
TM-T70Ⅱ.icon
実はこれネットワーク越しにつかえないらしい
デフォだとUSBがプリンターではなく摩訶不思議デバイスとして見えているので、プリンタークラスに変更してあげる
https://gyazo.com/9f4e8c9bcaaeff504a477aeb48a1a013
$ taiseiue@recipt:~ $ lsusb | grep -i epson
Bus 003 Device 002: ID 04b8:0e12 Seiko Epson Corp. TM-T70II
ええやん
Linuxから出してみる
$ printf '\x1b@Hello TM-T70II\n\n\n\x1dV\x00' | sudo tee /dev/usb/lp0 > /dev/null
https://gyazo.com/7871ce17296cd051e1374cf15845a377
最高
POSTしたら発券できるようにする
code:server.js
const express = require('express');
const receiptio = require('receiptio');
const app = express();
const PORT = process.env.PORT || 3000;
const HOST = process.env.HOST || '0.0.0.0';
const PRINTER_DEVICE = process.env.PRINTER_DEVICE || '/dev/usb/lp0';
const PRINT_OPTIONS =
process.env.PRINT_OPTIONS || -d ${PRINTER_DEVICE} -p epson -c 32 -l ja;
const API_TOKEN = process.env.API_TOKEN || '';
app.use(express.static('public'));
app.use(express.text({
limit: '64kb',
}));
app.use(express.json({
type: 'application/json',
limit: '64kb',
}));
let queue = Promise.resolve();
function enqueue(job) {
const run = queue.then(job, job);
queue = run.catch(() => {});
return run;
}
function getReceiptBody(req) {
if (typeof req.body === 'string') {
return req.body;
}
if (req.body && typeof req.body.receipt === 'string') {
return req.body.receipt;
}
if (req.body && typeof req.body.markdown === 'string') {
return req.body.markdown;
}
return '';
}
function checkAuth(req, res) {
if (!API_TOKEN) {
return true;
}
const auth = req.get('authorization') || '';
const expected = Bearer ${API_TOKEN};
if (auth !== expected) {
res.status(401).type('text/plain').send('unauthorized\n');
return false;
}
return true;
}
app.get('/health', (req, res) => {
res.type('text/plain').send('ok\n');
});
app.post('/print', async (req, res) => {
if (!checkAuth(req, res)) {
return;
}
const receipt = getReceiptBody(req);
if (!receipt.trim()) {
res.status(400).type('text/plain').send('empty receipt\n');
return;
}
try {
const result = await enqueue(async () => {
console.log([print] ${new Date().toISOString()});
return receiptio.print(receipt, PRINT_OPTIONS);
});
res.type('text/plain').send(${result || 'success'}\n);
} catch (error) {
console.error(error);
res.status(500).type('text/plain').send(${error.message || error}\n);
}
});
app.listen(PORT, HOST, () => {
console.log(receipt-printer listening on http://${HOST}:${PORT});
console.log(print options: ${PRINT_OPTIONS});
});
https://gyazo.com/62c70c82c7400188fa29dab908deeecc
https://gyazo.com/5ef6f3c55037f57180f5696924e0ff71
なんかでも最初にちょっと短冊ができて、次に本文がでるの嫌すぎる