不久前,我买了一台旧的、便宜的热敏收据打印机,我想通过另一种有用的方法来重新利用它。所以我准备将收据打印机用作Alexa(或GoogleHome、Siri等)的IOT打印机。
从Pi打印
第一步是让旧的收据打印机在新的设备中再次实现打印功能。我选择使用RaspberryPiZeroW作为控制器,因为它价格便宜且体积小。实际上它也足够小,可以放入收据打印机外壳本身,因此没有外部连接。
为了让Pi启动并运行,我们需要下载RaspbianOS并使用Etcher等程序将其刻录到microSD卡上。将其与HDMI电缆、键盘、鼠标和电源一起插入Pi。
当Pi启动并进入桌面界面时,您可以通过单击右上角的无线图标并选择无线连接的名称来连接到无线。然后,如果您右键单击同一个无线图标,您可以转到网络设置并设置静态IP地址,以便我们可以轻松地通过网络连接到它。最后,您要单击主菜单并选择“Raspbian配置编辑器”,然后在“接口”选项卡下,确保已启用SSH。然后保存并重新启动您的Pi。
要远程连接到Pi,您需要一个SSH客户端。Windows系统的话,建议使用Putty客户端。您可以使用我们之前设置的Pi的静态IP地址连接到它。然后您就可以使用“pi”作为用户名和“raspberry”作为密码登录。
接下来展现在我们面前的就是Pi的终端界面,我们要做的第一件事是确保软件是最新的,所以运行:
随着软件的更新,我们现在可以安装ESC-POS打印机软件和所需的库。
然后我们可以记下一个漂亮的小“HelloWorld”测试脚本。
连接到物联网(第1部分)
如果没有要打印的东西,打印机会有什么好处?我想启用从不同互联网服务打印的功能。一种选择是选择特定的互联网服务,跟踪他们的API文档并基于他们的API编写应用程序。
有一个很棒的网站叫做“IfThisThenThat”,它根据一组标准触发不同互联网服务(Alexa、GoogleHome、Gmail、Facebook、Instagram、Twitter等)的操作。例如,“如果”我在Facebook上发帖(this),“那么”给我发一封电子邮件(that)。
所以在前半部分,我注册了一个免费帐户,你可以开始为你想要触发的不同服务创建一个新的“小程序”。我的小程序的“这个”部分将是Alexa。有很多Alexa触发器可供选择,但我将选择显示“询问您的购物清单上有什么”的触发器。我希望它最终可以触发RaspberryPi上的Python脚本,因此对于脚本的“that”部分,我们要选择Webhooks。
在Webhooks选项中,我们可以添加一个指向我们的Pi的URL,稍后我们将返回。我们可以将Method字段保留为“Get”,并为内容类型选择“PlainText”。对于正文字段,单击“添加成分”并选择“整个列表”。这会将整个购物清单作为Get请求发送。
连接到物联网(第2部分)
上一步处理“Internet”部分,现在让我们使用RaspberryPi处理“things”部分。为了与“IfThisThenThat”webhooks小程序进行通信,我们需要在RaspberryPi上设置一个Web服务器。有许多不同的方式来设置Web服务器,但考虑到我最终想要运行Python脚本,我决定使用Python的Flask服务器。
Pi已经预装了所有的Flask库,所以我们需要做的就是开始编写一个测试脚本:
在其中添加一些提供简单网页的代码。
现在只需保存程序并使用以下命令运行它:
您将通过命令响应看到Flask运行的默认端口是端口5000。因此,在Web浏览器中,如果您输入Pi的IP地址:5000,您应该会看到文本“您的Flask服务器正在运行!”
我们已经有了测试Python代码,以及我们的测试Flask服务器。所以接下来我们需要将它们结合起来,并结合一些从我们的Webhook小程序中提取数据的代码,以能够打印到我们的收据打印机中。
先创建一个新的Python文件:
并在其中添加以下代码:
#!flask/bin/python
#IMPORTTHEFLASKANDPRINTERLIBRARIES
fromflaskimportFlask,request
fromescpos.printerimportUsb
#ASSIGNVARIABLESFORTHEPRINTERANDFLASK
p=Usb(0x0416,0x5011)
app=Flask(__name__)
#CREATE‘INDEX’PAGE
@app.route(‘/’)
defindex():
return‘YourFlaskserverisworking!’
#CREATE“PAGE”CALLED“LIST”FORPRINTINGALEXASHOPPINGLIST
@app.route(‘/list’)
deflist():
#CAPTURE“GET”DATAFROMIFTTTWEBOOKS
content=request.get_data()
#CONVERTRAWDATATOSTRING
str_content=str(content)
#DIVIDEDATAINTOSEPERATELINES
str_split=str_content.splitlines()
#SEPERATEWORDSBYCOMMAANDADDTOANEWLIST
newlist=[]
forwordinstr_split:
word=word.split(‘,’)
newlist.extend(word)
#REMOVEFORMATTINGMARKS
rmv_marks=[s.strip(“b‘”)forsinnewlist]
#PRINTHEADER
#print(“ShoppingList\n”)
p.text(“ShoppingList:\n”)
#ENUMERATEANDPRINTEACHITEMINLIST
r=1
forxinrmv_marks:
#print(str(r)+“。”+x+“\n”)
p.text(str(r)+“。”+x+“\n”)
r+=1
#RETURNRESULTS
return’x‘
#RUNTHEPROGRAM
if__name__==’__main__‘:
app.run(debug=True,host=’0.0.0.0‘)
您可以运行它以查看它是否返回任何错误,但它还不能与我们的webhook一起使用,因为到这一步为止,服务器仅在本地运行。尚无Webhook可连接的外部URL。我们可以在路由器上设置端口转发,只使用面向外部的IP地址,但这并不是太安全。作为替代方案,我决定选择NGROK。
使用Ngrok设置外部访问
Ngrok可以建立与网络的安全连接,而无需暴露您的外部IP或弄乱端口转发。注册一个免费帐户后,它会为您提供一个授权令牌。然后在您的RaspberryPi上,您可以下载它、解压缩它、连接您的身份验证令牌,然后在端口5000上运行它:
在结果屏幕上,它会为您提供一个转发地址(http://random-string.ngrok.io),您可以在我们的Webhook小程序中使用该地址。所以回到“IfThisThenThat”,在URL字段中,输入您的Ngrok转发地址并将其指向我们Flask服务器上的“列表”页面。它应该看起来像这样
然后继续保存更改。
我为了测试它能够保持Ngrok运行,打开一个新终端,然后运行我们的python脚本。当这两个项目都运行时,询问Alexa购物清单上有什么。一两分钟后,它应该可以打印出结果。
如果您想立即打印,只需转到IFTTT上的Applet,然后单击“立即检查”。如果一切顺利,收据打印机应该会打印出您的购物清单上的内容!
我们需要添加的最后一点代码是每次Pi启动时自动启动ngrok和我们的烧瓶服务器的方法。我们可以通过使我们的Python脚本可执行来轻松地做到这一点:
然后我们可以编辑我们的/etc/rc.local文件,使它看起来像这样:
将Pi添加到打印机
我的收据打印机在外壳内有很多空白空间。由于RaspberryPiZero是如此之小,所以我认为将其隐藏在收据打印机中以使其看起来像一个设备会更酷。唯一的问题是收据打印机在12v上运行,而Pi在5v上运行。因此,如果我们只想要一根电源线为它们两者供电,我们将不得不将12v电源降为5v。
使用7805稳压器、1uf电容器和10uf电容器,我能够创建简单的5v稳压器,并将其连接到收据打印机的逻辑板上。我将“-”线焊接到公共地线,然后将“+”线焊接到电源开关的“开”侧,以便在打开和关闭打印机时Pi会打开和关闭。我使用万用表进行了测试,以确认输出对于Pi来说是安全的。然后我焊接了一根微型USB电缆并将其连接到Pi。将电缆插入打印机并翻转开关后,打印机和Pi都打开了!
最后,我钻了一个孔,将USB电缆从Pi连接到打印机。我找到了一个将5v稳压器和Pi放入打印机外壳的地方,然后我将所有东西放回原处。所以现在打印机也有它自己的独立网络服务器了!
全部0条评论
快来发表一下你的评论吧 !