咕咕机-一台有趣的打印机

前些天看到了这个咕咕机,看起开很有趣,就搞了台玩玩,昨天刚到,也就是上手简单玩了一天


更新: 前阵子直接在node-red平台上封装了这个API,可以直接安装这个节点使用了,不需要调用后台了,机智如我
node-red-contrib-memobirdtext


PS:昨天七夕,店家还送了很多虐狗的东西,而且官方宣传这小东西都是 情侣,传纸条 ?? 是我对这东西理解错了么(手动黑人问号)

开箱

开箱

差不多一只手的大小,可连接WIFI也可切换本地模式,连接手机热点,打印是会发出“咕~咕~”的声音~~
用的是热敏纸,4卷19rmb,还好吧,才买回来24小时不到,一卷纸快被我打完了

官方APP

官方APP就不多说了,总之很方便,一键打印APP里各种内容,还有很多网友分享的,总之很丰富。
很多模板也很有用,但这些以后再说啦~

官方API

当然我的感兴趣的重点是官方的打印API啦,发了封邮件40分钟就回了,很顺利拿到了appkey

虽然NPM上也有一些别人写的封装API,但看了看官方的文档,一个就仨接口,干脆自己撸算了,直接写在了koa里做个后台
github.memobird-api

咕咕机类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//post请求
getData (url, data) {
return new Promise((resolve, reject) => {
axios.post(url, data)
.then((res) => {
if (res.data.showapi_res_code === 1) {
console.log('异步请求ok')
resolve(res.data)
} else {
console.log('失败! 原因:', res.data.showapi_res_error )
reject(res.data)
}
})
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//初始化,绑定用户
async init () {
this.initRes = await this.getData(url.account, this.config)
}
//打印文字功能
async printText (content) {
console.log('printText开始')
let Content =
`来自node平台
${content}
${moment().format('YYYY-MM-DD HH:mm:ss')}`
let print = {
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
ak: this.config.ak,
memobirdID: this.config.memobirdID,
userID: this.initRes.showapi_userid,
printcontent: `T:${iconv.encode(Content, 'gbk').toString('base64')}`
}
return await this.getData(url.print, print)
}
//打印图片功能
async printImg (path) {
console.log('printImg开始')
let Content =
`T:${iconv.encode('来自node平台', 'gbk').toString('base64')}|${await this.encodeImg(path)}|T:${iconv.encode(moment().format('YYYY-MM-DD HH:mm:ss'), 'gbk').toString('base64')}`
let print = {
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
ak: this.config.ak,
memobirdID: this.config.memobirdID,
userID: this.initRes.showapi_userid,
printcontent: Content
}
return await this.getData(url.print, print)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//处理图片
encodeImg (path) {
return new Promise((resolve, reject) => {
gm(path).resize(384).flip().type('Bilevel').colors(2).toBuffer('bmp', (error, buffer) => {
if (error) {
reject(error);
} else {
resolve(`P:${buffer.toString('base64')}`);
}
});
})
}

//循环检测是否打印完成
async status (id, time) {
let times = 1
let printflag = 0
let status = {
timestamp: moment().format('YYYY-MM-DD HH:mm:ss'),
ak: this.config.ak,
printcontentid: id
}
do {
await this.timeOut(time)
let res = await this.getData(url.status, status)
printflag = res.printflag
console.log(`开始检测 第${times}次 延时${time}ms ${printflag === 1 ? '打印完成' : '打印未完成'}`)
times++;
if(times === 6)
break
}
while (printflag !== 1);
return printflag
}

//延时
timeOut (time = 3000) {
return new Promise((resolve, reject) => {
let timer = setTimeout(() => {
resolve('延时完成')
}, time)
})
}

后台API接口

这边简单的功能写好了,然后在router里面写个接口就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//router接口
router.post('/printText', async (ctx, next) => {
const memobird = new Memobird({ak: '',memobirdID: '',useridentifying: ''})
ctx.body = {code:1}
memobird.init()
.then(() => memobird.printText(ctx.request.body.content))
.then( res => memobird.status(res.printcontentid, 3000))
.then(printflag => {
console.log('检测完成',printflag === 1 ? '打印完成' : '打印未完成')
})
.catch((err) => {
console.log(err)
ctx.body = err
})
})

router.post('/printImg', async (ctx, next) => {
const memobird = new Memobird({ak: '',memobirdID: '',useridentifying: ''})
ctx.body = {code:1}
memobird.init()
.then( res => memobird.printImg(ctx.request.body.content))
.then( res => memobird.status(res.printcontentid, 3000))
.then(printflag => {
console.log('检测完成',printflag === 1 ? '打印完成' : '打印未完成')
})
.catch((err) => {
console.log(err)
ctx.body = err
})
})

这样后台基本写完了,然后需要调用接口啦

神器node-red

之前一个大佬和我说了这个,试着玩了下,总之超牛逼的一个东西,完全的可视化编程,往下看就知道了

建几个定时任务

node-red

一言

一言API

通过inject,建立定时任务,会定时触发后面的get请求,然后处理好返回的数据,然后发送post请求到我的后台服务器

node-red

这里function模块处理返回的数据,然后post请求到我的后台服务器

天气预报

和风天气API
这个也是一样啦,inject设定两个固定时间的触发,处理好请求地址,获取数据,处理发送给后台的数据

node-red

其他任务

当然还有很多有趣的模块,email模块尝试了下qq和163总有些小问题,还有teitter,facebook的模块但有堵墙,最最重要的!!!这个个物联网的可视化平台,是用来监测硬件的(很可惜,我手上没这些东西,到时候搞个树莓派玩玩),任何监测信息都可以直接连接这台小打印机,直接打印输出!!!

UI部分

node-red还带一个ui界面
node-red
两条简单的流程图,text输入后触发post请求到后台就行啦

node-red
生成的前端页面

效果

以下效果都是通过node后台打出来的,自带APP打出来的总体要美观很多啦

node-red

node-red

node-red

后期其他功能

现在只能文本,图片分开来打印,过些天我试下多项内容的打印功能